]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/source/Plugins/SymbolFile/DWARF/DWARFLocationList.cpp
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / source / Plugins / SymbolFile / DWARF / DWARFLocationList.cpp
1 //===-- DWARFLocationList.cpp -----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "DWARFLocationList.h"
11
12 #include "lldb/Core/Stream.h"
13
14 #include "DWARFCompileUnit.h"
15 #include "DWARFDebugInfo.h"
16 #include "DWARFLocationDescription.h"
17
18 using namespace lldb_private;
19
20 dw_offset_t
21 DWARFLocationList::Dump(Stream &s, const DWARFCompileUnit* cu, const DWARFDataExtractor& debug_loc_data, lldb::offset_t offset)
22 {
23     uint64_t start_addr, end_addr;
24     uint32_t addr_size = DWARFCompileUnit::GetAddressByteSize(cu);
25     s.SetAddressByteSize(DWARFCompileUnit::GetAddressByteSize(cu));
26     dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0;
27     while (debug_loc_data.ValidOffset(offset))
28     {
29         start_addr = debug_loc_data.GetMaxU64(&offset,addr_size);
30         end_addr = debug_loc_data.GetMaxU64(&offset,addr_size);
31
32         if (start_addr == 0 && end_addr == 0)
33             break;
34
35         s.PutCString("\n            ");
36         s.Indent();
37         if (cu)
38             s.AddressRange (start_addr + base_addr, 
39                             end_addr + base_addr, 
40                             cu->GetAddressByteSize(), 
41                             NULL,
42                             ": ");
43         uint32_t loc_length = debug_loc_data.GetU16(&offset);
44
45         DWARFDataExtractor locationData(debug_loc_data, offset, loc_length);
46     //  if ( dump_flags & DWARFDebugInfo::eDumpFlag_Verbose ) *ostrm_ptr << " ( ";
47         print_dwarf_expression (s, locationData, addr_size, 4, false);
48         offset += loc_length;
49     }
50
51     return offset;
52 }
53
54 bool
55 DWARFLocationList::Extract(const DWARFDataExtractor& debug_loc_data, lldb::offset_t* offset_ptr, DWARFDataExtractor& location_list_data)
56 {
57     // Initialize with no data just in case we don't find anything
58     location_list_data.Clear();
59
60     size_t loc_list_length = Size(debug_loc_data, *offset_ptr);
61     if (loc_list_length > 0)
62     {
63         location_list_data.SetData(debug_loc_data, *offset_ptr, loc_list_length);
64         *offset_ptr += loc_list_length;
65         return true;
66     }
67
68     return false;
69 }
70
71 size_t
72 DWARFLocationList::Size(const DWARFDataExtractor& debug_loc_data, lldb::offset_t offset)
73 {
74     const dw_offset_t debug_loc_offset = offset;
75
76     while (debug_loc_data.ValidOffset(offset))
77     {
78         dw_addr_t start_addr = debug_loc_data.GetAddress(&offset);
79         dw_addr_t end_addr = debug_loc_data.GetAddress(&offset);
80
81         if (start_addr == 0 && end_addr == 0)
82             break;
83
84         uint16_t loc_length = debug_loc_data.GetU16(&offset);
85         offset += loc_length;
86     }
87
88     if (offset > debug_loc_offset)
89         return offset - debug_loc_offset;
90     return 0;
91 }
92
93
94