summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2010-09-14 02:20:48 +0000
committerGreg Clayton <gclayton@apple.com>2010-09-14 02:20:48 +0000
commit016a95eb040364e47bc25ddbdfcdaf306ad7ce2b (patch)
treef8a87af145e212ec86e5207e59b8a045b30b6af3 /lldb/source/Plugins
parente1328dc0e958f8190492fc9c870ced6e1441bf01 (diff)
downloadbcm5719-llvm-016a95eb040364e47bc25ddbdfcdaf306ad7ce2b.tar.gz
bcm5719-llvm-016a95eb040364e47bc25ddbdfcdaf306ad7ce2b.zip
Looking at some of the test suite failures in DWARF in .o files with the
debug map showed that the location lists in the .o files needed some refactoring in order to work. The case that was failing was where a function that was in the "__TEXT.__textcoal_nt" in the .o file, and in the "__TEXT.__text" section in the main executable. This made symbol lookup fail due to the way we were finding a real address in the debug map which was by finding the section that the function was in in the .o file and trying to find this in the main executable. Now the section list supports finding a linked address in a section or any child sections. After fixing this, we ran into issue that were due to DWARF and how it represents locations lists. DWARF makes a list of address ranges and expressions that go along with those address ranges. The location addresses are expressed in terms of a compile unit address + offset. This works fine as long as nothing moves around. When stuff moves around and offsets change between the remapped compile unit base address and the new function address, then we can run into trouble. To deal with this, we now store supply a location list slide amount to any location list expressions that will allow us to make the location list addresses into zero based offsets from the object that owns the location list (always a function in our case). With these fixes we can now re-link random address ranges inside the debugger for use with our DWARF + debug map, incremental linking, and more. Another issue that arose when doing the DWARF in the .o files was that GCC 4.2 emits a ".debug_aranges" that only mentions functions that are externally visible. This makes .debug_aranges useless to us and we now generate a real address range lookup table in the DWARF parser at the same time as we index the name tables (that are needed because .debug_pubnames is just as useless). llvm-gcc doesn't generate a .debug_aranges section, though this could be fixed, we aren't going to rely upon it. Renamed a bunch of "UINT_MAX" to "UINT32_MAX". llvm-svn: 113829
Diffstat (limited to 'lldb/source/Plugins')
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp8
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp55
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h6
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp4
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp49
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h9
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp6
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp39
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp4
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp80
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h6
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp27
12 files changed, 211 insertions, 82 deletions
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp
index e5b3ca25574..e1c4eb39250 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp
@@ -1152,8 +1152,8 @@ RegisterContextMach_arm::NumSupportedHardwareBreakpoints ()
#if defined (__arm__)
// Set the init value to something that will let us know that we need to
// autodetect how many breakpoints are supported dynamically...
- static uint32_t g_num_supported_hw_breakpoints = UINT_MAX
- if (g_num_supported_hw_breakpoints == UINT_MAX)
+ static uint32_t g_num_supported_hw_breakpoints = UINT32_MAX;
+ if (g_num_supported_hw_breakpoints == UINT32_MAX)
{
// Set this to zero in case we can't tell if there are any HW breakpoints
g_num_supported_hw_breakpoints = 0;
@@ -1282,8 +1282,8 @@ RegisterContextMach_arm::NumSupportedHardwareWatchpoints ()
#if defined (__arm__)
// Set the init value to something that will let us know that we need to
// autodetect how many watchpoints are supported dynamically...
- static uint32_t g_num_supported_hw_watchpoints = UINT_MAX;
- if (g_num_supported_hw_watchpoints == UINT_MAX)
+ static uint32_t g_num_supported_hw_watchpoints = UINT32_MAX;
+ if (g_num_supported_hw_watchpoints == UINT32_MAX)
{
// Set this to zero in case we can't tell if there are any HW breakpoints
g_num_supported_hw_watchpoints = 0;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
index 8a21e1ec555..d75b5fc4cf4 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
@@ -355,7 +355,7 @@ DWARFCompileUnit::SetDIERelations()
// the running average ends up being in the stdout log.
static size_t g_total_cu_debug_info_size = 0;
static size_t g_total_num_dies = 0;
- static size_t g_min_bytes_per_die = UINT_MAX;
+ static size_t g_min_bytes_per_die = UINT32_MAX;
static size_t g_max_bytes_per_die = 0;
const size_t num_dies = m_die_array.size();
const size_t cu_debug_info_size = GetDebugInfoSize();
@@ -555,7 +555,9 @@ DWARFCompileUnit::Index
lldb_private::UniqueCStringMap<dw_offset_t>& method_name_to_function_die,
lldb_private::UniqueCStringMap<dw_offset_t>& selector_name_to_function_die,
lldb_private::UniqueCStringMap<dw_offset_t>& name_to_type_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die
+ lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die,
+ const DWARFDebugRanges *debug_ranges,
+ DWARFDebugAranges *aranges
)
{
const DataExtractor* debug_str = &m_dwarf2Data->get_debug_str_data();
@@ -599,6 +601,10 @@ DWARFCompileUnit::Index
bool has_address = false;
bool has_location = false;
bool is_global_or_static_variable = false;
+ dw_addr_t lo_pc = DW_INVALID_ADDRESS;
+ dw_addr_t hi_pc = DW_INVALID_ADDRESS;
+ DWARFDebugRanges::RangeList ranges;
+
dw_offset_t specification_die_offset = DW_INVALID_OFFSET;
const size_t num_attributes = die.GetAttributes(m_dwarf2Data, this, attributes);
if (num_attributes > 0)
@@ -634,7 +640,36 @@ DWARFCompileUnit::Index
break;
case DW_AT_low_pc:
+ has_address = true;
+ if (tag == DW_TAG_subprogram && attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
+ {
+ lo_pc = form_value.Unsigned();
+ }
+ break;
+
+ case DW_AT_high_pc:
+ has_address = true;
+ if (tag == DW_TAG_subprogram && attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
+ {
+ hi_pc = form_value.Unsigned();
+ }
+ break;
+
case DW_AT_ranges:
+ if (tag == DW_TAG_subprogram && attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
+ {
+ if (debug_ranges)
+ {
+ debug_ranges->FindRanges(form_value.Unsigned(), ranges);
+ // All DW_AT_ranges are relative to the base address of the
+ // compile unit. We add the compile unit base address to make
+ // sure all the addresses are properly fixed up.
+ ranges.AddOffset(GetBaseAddress());
+ }
+ }
+ has_address = true;
+ break;
+
case DW_AT_entry_pc:
has_address = true;
break;
@@ -693,6 +728,22 @@ DWARFCompileUnit::Index
break;
}
}
+
+ if (tag == DW_TAG_subprogram)
+ {
+ if (lo_pc != DW_INVALID_ADDRESS && hi_pc != DW_INVALID_ADDRESS)
+ {
+ aranges->AppendRange (m_offset, lo_pc, hi_pc);
+ }
+ else
+ {
+ for (size_t i=0, num_ranges = ranges.Size(); i<num_ranges; ++i)
+ {
+ const DWARFDebugRanges::Range *range = ranges.RangeAtIndex (i);
+ aranges->AppendRange (m_offset, range->begin_offset, range->end_offset);
+ }
+ }
+ }
}
switch (tag)
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
index d269537ce69..0e097dd5c86 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
@@ -26,7 +26,7 @@ public:
DWARFDebugInfoEntry** function_die,
DWARFDebugInfoEntry** block_die);
- size_t AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT_MAX) const;
+ size_t AppendDIEsWithTag (const dw_tag_t tag, DWARFDIECollection& matching_dies, uint32_t depth = UINT32_MAX) const;
void Clear();
bool Verify(lldb_private::Stream *s) const;
void Dump(lldb_private::Stream *s) const;
@@ -147,7 +147,9 @@ public:
lldb_private::UniqueCStringMap<dw_offset_t>& method_name_to_function_die,
lldb_private::UniqueCStringMap<dw_offset_t>& selector_name_to_function_die,
lldb_private::UniqueCStringMap<dw_offset_t>& name_to_type_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die);
+ lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die,
+ const DWARFDebugRanges* debug_ranges,
+ DWARFDebugAranges *aranges);
protected:
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp
index c51a2dde34d..9c5f05ec5be 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAbbrev.cpp
@@ -45,7 +45,7 @@ DWARFAbbreviationDeclarationSet::Extract(const DataExtractor& data, uint32_t* of
else
{
if (prev_abbr_code + 1 != abbrevDeclaration.Code())
- m_idx_offset = UINT_MAX; // Out of order indexes, we can't do O(1) lookups...
+ m_idx_offset = UINT32_MAX; // Out of order indexes, we can't do O(1) lookups...
}
prev_abbr_code = abbrevDeclaration.Code();
}
@@ -69,7 +69,7 @@ DWARFAbbreviationDeclarationSet::Dump(Stream *s) const
const DWARFAbbreviationDeclaration*
DWARFAbbreviationDeclarationSet::GetAbbreviationDeclaration(dw_uleb128_t abbrCode) const
{
- if (m_idx_offset == UINT_MAX)
+ if (m_idx_offset == UINT32_MAX)
{
DWARFAbbreviationDeclarationCollConstIter pos;
DWARFAbbreviationDeclarationCollConstIter end = m_decls.end();
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
index 39c5a7fd189..1c8ef58c3c5 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
@@ -35,7 +35,6 @@ DWARFDebugAranges::DWARFDebugAranges() :
//----------------------------------------------------------------------
static bool RangeLessThan (const DWARFDebugAranges::Range& range1, const DWARFDebugAranges::Range& range2)
{
-// printf("RangeLessThan -- 0x%8.8x < 0x%8.8x ? %d\n", range1.lo_pc, range1.lo_pc, range1.lo_pc < range2.lo_pc);
return range1.lo_pc < range2.lo_pc;
}
@@ -274,6 +273,54 @@ DWARFDebugAranges::InsertRange(const DWARFDebugAranges::Range& range)
}
+void
+DWARFDebugAranges::AppendRange (dw_offset_t offset, dw_addr_t low_pc, dw_addr_t high_pc)
+{
+ if (!m_aranges.empty())
+ {
+ if (m_aranges.back().offset == offset && m_aranges.back().hi_pc == low_pc)
+ {
+ m_aranges.back().hi_pc = high_pc;
+ return;
+ }
+ }
+ m_aranges.push_back (DWARFDebugAranges::Range(low_pc, high_pc, offset));
+}
+
+void
+DWARFDebugAranges::Sort()
+{
+ // Sort our address range entries
+ std::stable_sort (m_aranges.begin(), m_aranges.end(), RangeLessThan);
+
+ // Merge any entries that have the same offset and same start/end address
+ RangeColl::iterator pos = m_aranges.begin();
+ RangeColl::iterator end = m_aranges.end();
+ while (pos != end)
+ {
+ RangeColl::iterator next_pos = pos + 1;
+ if (next_pos != end &&
+ pos->offset == next_pos->offset &&
+ pos->hi_pc == next_pos->lo_pc)
+ {
+ // We have found an entry whose end address it he same as the
+ // next entry's start address and the offsets are the same so
+ // we can merge these two entries.
+ pos->hi_pc = next_pos->hi_pc;
+ // Erase the next entry that wasn't needed
+ pos = m_aranges.erase (next_pos);
+ // Now recompute the end of the collection
+ end = m_aranges.end();
+ }
+ else
+ {
+ // Two entries have either different offsets or there are gaps
+ // in the address range, move along, nothing to see here.
+ pos = next_pos;
+ }
+ }
+}
+
//----------------------------------------------------------------------
// FindAddress
//----------------------------------------------------------------------
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
index f3db949bf26..0861376fc66 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
@@ -59,8 +59,13 @@ public:
bool GetMaxRange(dw_addr_t& lo_pc, dw_addr_t& hi_pc) const;
bool Extract(const lldb_private::DataExtractor &debug_aranges_data);
bool Generate(SymbolFileDWARF* dwarf2Data);
- void InsertRange(dw_offset_t cu_offset, dw_addr_t low_pc, dw_addr_t high_pc);
- void InsertRange(const DWARFDebugAranges::Range& range);
+ void InsertRange (dw_offset_t cu_offset, dw_addr_t low_pc, dw_addr_t high_pc);
+ void InsertRange (const DWARFDebugAranges::Range& range);
+
+ // Use append range multiple times and then call sort
+ void AppendRange (dw_offset_t cu_offset, dw_addr_t low_pc, dw_addr_t high_pc);
+ void Sort();
+
const Range* RangeAtIndex(uint32_t idx) const
{
if (idx < m_aranges.size())
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
index fcb0ccf1189..abe26ef0b38 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp
@@ -868,7 +868,7 @@ typedef struct DumpInfo
strm(init_strm),
die_offset(off),
recurse_depth(depth),
- found_depth(UINT_MAX),
+ found_depth(UINT32_MAX),
found_die(false),
ancestors()
{
@@ -959,7 +959,7 @@ static dw_offset_t DumpCallback
// We have already found our DIE and are printing it's children. Obey
// our recurse depth and return an invalid offset if we get done
// dumping all the the children
- if (dumpInfo->recurse_depth == UINT_MAX || curr_depth <= dumpInfo->found_depth + dumpInfo->recurse_depth)
+ if (dumpInfo->recurse_depth == UINT32_MAX || curr_depth <= dumpInfo->found_depth + dumpInfo->recurse_depth)
die->Dump(dwarf2Data, cu, s, 0);
}
else if (dumpInfo->die_offset > die->GetOffset())
@@ -1076,7 +1076,7 @@ DWARFDebugInfo::Dump
else
{
s->Printf(" for DIE entry at .debug_info[0x%8.8x]", die_offset);
- if (recurse_depth != UINT_MAX)
+ if (recurse_depth != UINT32_MAX)
s->Printf(" recursing %u levels deep.", recurse_depth);
s->EOL();
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
index 19eef06d3d1..50a7e9ba5ed 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
@@ -56,7 +56,7 @@ DWARFDebugInfoEntry::Attributes::FindAttributeIndex(dw_attr_t attr) const
if (pos->attr == attr)
return std::distance(beg, pos);
}
- return UINT_MAX;
+ return UINT32_MAX;
}
void
@@ -69,14 +69,14 @@ DWARFDebugInfoEntry::Attributes::Append(const DWARFCompileUnit *cu, dw_offset_t
bool
DWARFDebugInfoEntry::Attributes::ContainsAttribute(dw_attr_t attr) const
{
- return FindAttributeIndex(attr) != UINT_MAX;
+ return FindAttributeIndex(attr) != UINT32_MAX;
}
bool
DWARFDebugInfoEntry::Attributes::RemoveAttribute(dw_attr_t attr)
{
uint32_t attr_index = FindAttributeIndex(attr);
- if (attr_index != UINT_MAX)
+ if (attr_index != UINT32_MAX)
{
m_infos.erase(m_infos.begin() + attr_index);
return true;
@@ -584,9 +584,9 @@ DWARFDebugInfoEntry::Compare
if (a_attr_count != b_attr_count)
{
uint32_t is_decl_index = a_attrs.FindAttributeIndex(DW_AT_declaration);
- uint32_t a_name_index = UINT_MAX;
- uint32_t b_name_index = UINT_MAX;
- if (is_decl_index != UINT_MAX)
+ uint32_t a_name_index = UINT32_MAX;
+ uint32_t b_name_index = UINT32_MAX;
+ if (is_decl_index != UINT32_MAX)
{
if (a_attr_count == 2)
{
@@ -597,13 +597,13 @@ DWARFDebugInfoEntry::Compare
else
{
is_decl_index = b_attrs.FindAttributeIndex(DW_AT_declaration);
- if (is_decl_index != UINT_MAX && a_attr_count == 2)
+ if (is_decl_index != UINT32_MAX && a_attr_count == 2)
{
a_name_index = a_attrs.FindAttributeIndex(DW_AT_name);
b_name_index = b_attrs.FindAttributeIndex(DW_AT_name);
}
}
- if (a_name_index != UINT_MAX && b_name_index != UINT_MAX)
+ if (a_name_index != UINT32_MAX && b_name_index != UINT32_MAX)
{
if (a_attrs.ExtractFormValueAtIndex(dwarf2Data, a_name_index, a_form_value) &&
b_attrs.ExtractFormValueAtIndex(dwarf2Data, b_name_index, b_form_value))
@@ -794,6 +794,7 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
dw_addr_t lo_pc = DW_INVALID_ADDRESS;
dw_addr_t hi_pc = DW_INVALID_ADDRESS;
std::vector<dw_offset_t> die_offsets;
+ bool set_frame_base_loclist_addr = false;
if (m_abbrevDecl)
{
const DataExtractor& debug_info_data = dwarf2Data->get_debug_info_data();
@@ -892,18 +893,26 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
{
uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
uint32_t block_length = form_value.Unsigned();
- frame_base->SetOpcodeData(debug_info_data, block_offset, block_length, NULL);
+ frame_base->SetOpcodeData(debug_info_data, block_offset, block_length);
}
else
{
- const DataExtractor& debug_loc_data = dwarf2Data->get_debug_loc_data();
+ const DataExtractor &debug_loc_data = dwarf2Data->get_debug_loc_data();
const dw_offset_t debug_loc_offset = form_value.Unsigned();
size_t loc_list_length = DWARFLocationList::Size(debug_loc_data, debug_loc_offset);
if (loc_list_length > 0)
{
- Address base_address(cu->GetBaseAddress(), dwarf2Data->GetObjectFile()->GetSectionList());
- frame_base->SetOpcodeData(debug_loc_data, debug_loc_offset, loc_list_length, &base_address);
+ frame_base->SetOpcodeData(debug_loc_data, debug_loc_offset, loc_list_length);
+ if (lo_pc != DW_INVALID_ADDRESS)
+ {
+ assert (lo_pc >= cu->GetBaseAddress());
+ frame_base->SetLocationListSlide(lo_pc - cu->GetBaseAddress());
+ }
+ else
+ {
+ set_frame_base_loclist_addr = true;
+ }
}
}
}
@@ -928,6 +937,12 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
ranges.AddRange(lo_pc, lo_pc);
}
}
+
+ if (set_frame_base_loclist_addr)
+ {
+ assert (ranges.LowestAddress(0) >= cu->GetBaseAddress());
+ frame_base->SetLocationListSlide(ranges.LowestAddress(0) - cu->GetBaseAddress());
+ }
if (ranges.Size() == 0 || (name == NULL) || (mangled == NULL))
{
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp
index 2b3f39b24f3..ed658032b63 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.cpp
@@ -1008,7 +1008,7 @@ static bool FindMatchingAddress (const DWARFDebugLine::Row& row1, const DWARFDeb
uint32_t
DWARFDebugLine::LineTable::LookupAddress(dw_addr_t address, dw_addr_t cu_high_pc) const
{
- uint32_t index = UINT_MAX;
+ uint32_t index = UINT32_MAX;
if (!rows.empty())
{
// Use the lower_bound algorithm to perform a binary search since we know
@@ -1036,7 +1036,7 @@ DWARFDebugLine::LineTable::LookupAddress(dw_addr_t address, dw_addr_t cu_high_pc
if (index > 0)
--index;
else
- index = UINT_MAX;
+ index = UINT32_MAX;
}
}
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index c8fef6504f2..0dbd479c5ab 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -418,19 +418,29 @@ SymbolFileDWARF::DebugAbbrev() const
DWARFDebugAranges*
SymbolFileDWARF::DebugAranges()
{
- if (m_aranges.get() == NULL)
- {
- Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this);
- m_aranges.reset(new DWARFDebugAranges());
- if (m_aranges.get())
- {
- const DataExtractor &debug_aranges_data = get_debug_aranges_data();
- if (debug_aranges_data.GetByteSize() > 0)
- m_aranges->Extract(debug_aranges_data);
- else
- m_aranges->Generate(this);
- }
- }
+ // It turns out that llvm-gcc doesn't generate .debug_aranges in .o files
+ // and we are already parsing all of the DWARF because the .debug_pubnames
+ // is useless (it only mentions symbols that are externally visible), so
+ // don't use the .debug_aranges section, we should be using a debug aranges
+ // we got from SymbolFileDWARF::Index().
+
+ if (!m_indexed)
+ Index();
+
+
+// if (m_aranges.get() == NULL)
+// {
+// Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this);
+// m_aranges.reset(new DWARFDebugAranges());
+// if (m_aranges.get())
+// {
+// const DataExtractor &debug_aranges_data = get_debug_aranges_data();
+// if (debug_aranges_data.GetByteSize() > 0)
+// m_aranges->Extract(debug_aranges_data);
+// else
+// m_aranges->Generate(this);
+// }
+// }
return m_aranges.get();
}
@@ -1492,7 +1502,7 @@ SymbolFileDWARF::GetCompUnitForDWARFCompUnit(DWARFCompileUnit* cu, uint32_t cu_i
if (dc_cu.get())
{
// Figure out the compile unit index if we weren't given one
- if (cu_idx == UINT_MAX)
+ if (cu_idx == UINT32_MAX)
DebugInfo()->GetCompileUnit(cu->GetOffset(), &cu_idx);
m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(dc_cu, cu_idx);
@@ -1507,7 +1517,7 @@ SymbolFileDWARF::GetFunction (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* f
sc.Clear();
// Check if the symbol vendor already knows about this compile unit?
sc.module_sp = m_obj_file->GetModule()->GetSP();
- sc.comp_unit = GetCompUnitForDWARFCompUnit(cu, UINT_MAX);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(cu, UINT32_MAX);
sc.function = sc.comp_unit->FindFunctionByUID (func_die->GetOffset()).get();
if (sc.function == NULL)
@@ -1669,7 +1679,7 @@ SymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line,
uint32_t line_idx = line_table->FindLineEntryIndexByFileIndex (0, file_idx, line, false, &sc.line_entry);
found_line = sc.line_entry.line;
- while (line_idx != UINT_MAX)
+ while (line_idx != UINT32_MAX)
{
sc.function = NULL;
sc.block = NULL;
@@ -1742,6 +1752,8 @@ SymbolFileDWARF::Index ()
DWARFDebugInfo* debug_info = DebugInfo();
if (debug_info)
{
+ m_aranges.reset(new DWARFDebugAranges());
+
uint32_t cu_idx = 0;
const uint32_t num_compile_units = GetNumCompileUnits();
for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
@@ -1755,7 +1767,9 @@ SymbolFileDWARF::Index ()
m_method_name_to_function_die,
m_selector_name_to_function_die,
m_name_to_global_die,
- m_name_to_type_die);
+ m_name_to_type_die,
+ DebugRanges(),
+ m_aranges.get());
// Keep memory down by clearing DIEs if this generate function
// caused them to be parsed
@@ -1769,6 +1783,7 @@ SymbolFileDWARF::Index ()
m_selector_name_to_function_die.Sort();
m_name_to_global_die.Sort();
m_name_to_type_die.Sort();
+ m_aranges->Sort();
}
}
@@ -1804,10 +1819,10 @@ SymbolFileDWARF::FindGlobalVariables (const ConstString &name, bool append, uint
sc.module_sp = m_obj_file->GetModule()->GetSP();
assert (sc.module_sp);
- sc.comp_unit = GetCompUnitForDWARFCompUnit(cu, UINT_MAX);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(cu, UINT32_MAX);
assert(sc.comp_unit != NULL);
- ParseVariables(sc, cu_sp.get(), die, false, false, &variables);
+ ParseVariables(sc, cu_sp.get(), LLDB_INVALID_ADDRESS, die, false, false, &variables);
if (variables.GetSize() - original_size >= max_matches)
break;
@@ -1854,10 +1869,10 @@ SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append
assert (sc.module_sp);
- sc.comp_unit = GetCompUnitForDWARFCompUnit(cu, UINT_MAX);
+ sc.comp_unit = GetCompUnitForDWARFCompUnit(cu, UINT32_MAX);
assert(sc.comp_unit != NULL);
- ParseVariables(sc, cu_sp.get(), die, false, false, &variables);
+ ParseVariables(sc, cu_sp.get(), LLDB_INVALID_ADDRESS, die, false, false, &variables);
if (variables.GetSize() - original_size >= max_matches)
break;
@@ -3308,7 +3323,11 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc)
if (sc.function)
{
const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(sc.function->GetID());
- return ParseVariables(sc, dwarf_cu, function_die->GetFirstChild(), true, true);
+
+ dw_addr_t func_lo_pc = function_die->GetAttributeValueAsUnsigned (this, dwarf_cu, DW_AT_low_pc, DW_INVALID_ADDRESS);
+ assert (func_lo_pc != DW_INVALID_ADDRESS);
+
+ return ParseVariables(sc, dwarf_cu, func_lo_pc, function_die->GetFirstChild(), true, true);
}
else if (sc.comp_unit)
{
@@ -3328,7 +3347,7 @@ SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc)
const size_t num_globals = dwarf_cu->GetNumGlobals();
for (size_t idx=0; idx<num_globals; ++idx)
{
- VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, dwarf_cu->GetGlobalDIEAtIndex (idx)));
+ VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, dwarf_cu->GetGlobalDIEAtIndex (idx), LLDB_INVALID_ADDRESS));
if (var_sp)
{
variables->AddVariable(var_sp);
@@ -3348,7 +3367,8 @@ SymbolFileDWARF::ParseVariableDIE
(
const SymbolContext& sc,
const DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die
+ const DWARFDebugInfoEntry *die,
+ const lldb::addr_t func_low_pc
)
{
@@ -3393,7 +3413,7 @@ SymbolFileDWARF::ParseVariableDIE
uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart();
uint32_t block_length = form_value.Unsigned();
- location.SetOpcodeData(get_debug_info_data(), block_offset, block_length, NULL);
+ location.SetOpcodeData(get_debug_info_data(), block_offset, block_length);
}
else
{
@@ -3403,8 +3423,9 @@ SymbolFileDWARF::ParseVariableDIE
size_t loc_list_length = DWARFLocationList::Size(debug_loc_data, debug_loc_offset);
if (loc_list_length > 0)
{
- Address base_address(dwarf_cu->GetBaseAddress(), m_obj_file->GetSectionList());
- location.SetOpcodeData(debug_loc_data, debug_loc_offset, loc_list_length, &base_address);
+ location.SetOpcodeData(debug_loc_data, debug_loc_offset, loc_list_length);
+ assert (func_low_pc != LLDB_INVALID_ADDRESS);
+ location.SetLocationListSlide (func_low_pc - dwarf_cu->GetBaseAddress());
}
}
}
@@ -3489,6 +3510,7 @@ SymbolFileDWARF::ParseVariables
(
const SymbolContext& sc,
const DWARFCompileUnit* dwarf_cu,
+ const lldb::addr_t func_low_pc,
const DWARFDebugInfoEntry *orig_die,
bool parse_siblings,
bool parse_children,
@@ -3565,7 +3587,7 @@ SymbolFileDWARF::ParseVariables
(tag == DW_TAG_constant) ||
(tag == DW_TAG_formal_parameter && sc.function))
{
- VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die));
+ VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, func_low_pc));
if (var_sp)
{
variables->AddVariable(var_sp);
@@ -3578,7 +3600,7 @@ SymbolFileDWARF::ParseVariables
if (!skip_children && parse_children && die->HasChildren())
{
- vars_added += ParseVariables(sc, dwarf_cu, die->GetFirstChild(), true, true);
+ vars_added += ParseVariables(sc, dwarf_cu, func_low_pc, die->GetFirstChild(), true, true);
//vars_added += ParseVariables(sc, dwarf_cu, die->GetFirstChild(), parse_siblings, parse_children);
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index fc4325a5447..2d86359f010 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -218,7 +218,7 @@ protected:
bool ParseCompileUnit(DWARFCompileUnit* cu, lldb::CompUnitSP& compile_unit_sp);
DWARFCompileUnit* GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid);
DWARFCompileUnit* GetNextUnparsedDWARFCompileUnit(DWARFCompileUnit* prev_cu);
- lldb_private::CompileUnit* GetCompUnitForDWARFCompUnit(DWARFCompileUnit* cu, uint32_t cu_idx = UINT_MAX);
+ lldb_private::CompileUnit* GetCompUnitForDWARFCompUnit(DWARFCompileUnit* cu, uint32_t cu_idx = UINT32_MAX);
bool GetFunction (DWARFCompileUnit* cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc);
lldb_private::Function * ParseCompileUnitFunction (const lldb_private::SymbolContext& sc, const DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die);
size_t ParseFunctionBlocks (const lldb_private::SymbolContext& sc,
@@ -234,11 +234,13 @@ protected:
lldb::VariableSP ParseVariableDIE(
const lldb_private::SymbolContext& sc,
const DWARFCompileUnit* dwarf_cu,
- const DWARFDebugInfoEntry *die);
+ const DWARFDebugInfoEntry *die,
+ const lldb::addr_t func_low_pc);
size_t ParseVariables(
const lldb_private::SymbolContext& sc,
const DWARFCompileUnit* dwarf_cu,
+ const lldb::addr_t func_low_pc,
const DWARFDebugInfoEntry *die,
bool parse_siblings,
bool parse_children,
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 0140dd2dc70..b99a30ce476 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -617,30 +617,15 @@ SymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint3
{
SectionList *oso_section_list = oso_objfile->GetSectionList();
+ SectionSP oso_symbol_section_sp (oso_section_list->FindSectionContainingLinkedFileAddress (exe_file_addr, UINT32_MAX));
- SectionSP oso_section_sp(oso_section_list->FindSectionByName(exe_so_addr.GetSection()->GetName()));
- if (oso_section_sp)
+ if (oso_symbol_section_sp)
{
- SectionSP oso_symbol_section_sp (oso_section_sp->GetChildren().FindSectionContainingLinkedFileAddress (exe_file_addr));
-
- if (oso_symbol_section_sp)
- {
- const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress();
- Address oso_so_addr (oso_symbol_section_sp.get(), exe_file_addr - linked_file_addr);
- if (oso_so_addr.IsSectionOffset())
- resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
- }
+ const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress();
+ Address oso_so_addr (oso_symbol_section_sp.get(), exe_file_addr - linked_file_addr);
+ if (oso_so_addr.IsSectionOffset())
+ resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
}
- // Map the load address from in the executable back to a
- // section/offset address in the .o file so we can do
- // lookups in the .o DWARF.
-// Address oso_so_addr (exe_load_addr, false, comp_unit_info->debug_map_sections_sp.get());
-//
-// // Make sure we were able to resolve this back to a .o
-// // section offset address, and if so, resolve the context
-// // for everything that was asked for.
-// if (oso_so_addr.IsSectionOffset())
-// resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc);
}
}
}
OpenPOWER on IntegriCloud