summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/SymbolFile
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-10-08 00:49:15 +0000
committerGreg Clayton <gclayton@apple.com>2011-10-08 00:49:15 +0000
commitea3e7d5ccf4f00741e4b106978bd8dab5cece3a1 (patch)
tree383f59653e8cae73dea0347a3d84b49310e5eaf1 /lldb/source/Plugins/SymbolFile
parent0ad4caa26384fad46de9baba4fa326890cfebbcc (diff)
downloadbcm5719-llvm-ea3e7d5ccf4f00741e4b106978bd8dab5cece3a1.tar.gz
bcm5719-llvm-ea3e7d5ccf4f00741e4b106978bd8dab5cece3a1.zip
Added more functionality to Range template classes in RangeMap.h and converted remaining DWARF areas that were using ranges over to this class. Also converted lldb_private::Block to use it.
llvm-svn: 141460
Diffstat (limited to 'lldb/source/Plugins/SymbolFile')
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp6
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp25
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp232
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h63
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp29
6 files changed, 140 insertions, 217 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
index 8c269b9f2da..ab2f9c4f16e 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.cpp
@@ -113,7 +113,7 @@ DWARFDebugAranges::Dump (Log *log) const
if (log == NULL)
return;
- const size_t num_entries = m_aranges.GetNumEntries();
+ const size_t num_entries = m_aranges.GetSize();
for (size_t i=0; i<num_entries; ++i)
{
const RangeToDIE::Entry *entry = m_aranges.GetEntryAtIndex(i);
@@ -141,7 +141,7 @@ DWARFDebugAranges::Sort (bool minimize)
size_t orig_arange_size = 0;
if (log)
{
- orig_arange_size = m_aranges.GetNumEntries();
+ orig_arange_size = m_aranges.GetSize();
log->Printf ("DWARFDebugAranges::Sort(minimize = %u) with %zu entries", minimize, orig_arange_size);
}
@@ -152,7 +152,7 @@ DWARFDebugAranges::Sort (bool minimize)
{
if (minimize)
{
- const size_t new_arange_size = m_aranges.GetNumEntries();
+ const size_t new_arange_size = m_aranges.GetSize();
const size_t delta = orig_arange_size - new_arange_size;
log->Printf ("DWARFDebugAranges::Sort() %zu entries after minimizing (%zu entries combined for %zu bytes saved)",
new_arange_size, delta, delta * sizeof(Range));
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
index 90dc4fc43c1..78e1dfddc3f 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugAranges.h
@@ -69,7 +69,7 @@ public:
uint32_t
GetNumRanges() const
{
- return m_aranges.GetNumEntries();
+ return m_aranges.GetSize();
}
dw_offset_t
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
index 152867a5467..bcce74c60c9 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
@@ -933,7 +933,7 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
// 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(cu->GetBaseAddress());
+ ranges.Slide(cu->GetBaseAddress());
}
break;
@@ -1024,26 +1024,25 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
}
}
- size_t numRanges = ranges.Size();
-
- if (numRanges == 0)
+ if (ranges.IsEmpty())
{
if (lo_pc != DW_INVALID_ADDRESS)
{
- if (hi_pc != DW_INVALID_ADDRESS)
- ranges.AddRange(lo_pc, hi_pc);
+ if (hi_pc != DW_INVALID_ADDRESS && hi_pc > lo_pc)
+ ranges.Append(DWARFDebugRanges::Range (lo_pc, hi_pc - lo_pc));
else
- ranges.AddRange(lo_pc, lo_pc);
+ ranges.Append(DWARFDebugRanges::Range (lo_pc, 0));
}
}
if (set_frame_base_loclist_addr)
{
- assert (ranges.LowestAddress(0) >= cu->GetBaseAddress());
- frame_base->SetLocationListSlide(ranges.LowestAddress(0) - cu->GetBaseAddress());
+ dw_addr_t lowest_range_pc = ranges.GetMinRangeBase(0);
+ assert (lowest_range_pc >= cu->GetBaseAddress());
+ frame_base->SetLocationListSlide (lowest_range_pc - cu->GetBaseAddress());
}
- if (ranges.Size() == 0 || (name == NULL) || (mangled == NULL))
+ if (ranges.IsEmpty() || name == NULL || mangled == NULL)
{
std::vector<dw_offset_t>::const_iterator pos;
std::vector<dw_offset_t>::const_iterator end = die_offsets.end();
@@ -1060,7 +1059,7 @@ DWARFDebugInfoEntry::GetDIENamesAndRanges
}
}
}
- return ranges.Size() > 0;
+ return !ranges.IsEmpty();
}
//----------------------------------------------------------------------
@@ -2038,8 +2037,8 @@ DWARFDebugInfoEntry::LookupAddress
// 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(cu->GetBaseAddress());
- if (ranges.Lookup(address))
+ ranges.Slide (cu->GetBaseAddress());
+ if (ranges.FindEntryThatContains(address))
{
found_address = true;
// puts("***MATCH***");
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
index 3502d56a82e..f69b370b515 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp
@@ -30,94 +30,62 @@ DWARFDebugRanges::Extract(SymbolFileDWARF* dwarf2Data)
RangeList range_list;
dw_offset_t offset = 0;
dw_offset_t debug_ranges_offset = offset;
- while (range_list.Extract(dwarf2Data, &offset))
+ while (Extract(dwarf2Data, &offset, range_list))
{
m_range_map[debug_ranges_offset] = range_list;
debug_ranges_offset = offset;
}
}
-bool
-DWARFDebugRanges::RangeList::AddRange(dw_addr_t lo_addr, dw_addr_t hi_addr)
-{
- if (lo_addr <= hi_addr)
- {
- Range range(lo_addr, hi_addr);
- ranges.push_back(range);
- return true;
- }
- return false;
-}
-
-const DWARFDebugRanges::Range*
-DWARFDebugRanges::RangeList::Lookup(dw_addr_t offset) const
-{
- Range::const_iterator pos = ranges.begin();
- Range::const_iterator end_pos = ranges.end();
- for (pos = ranges.begin(); pos != end_pos; ++pos)
- {
- if (pos->begin_offset <= offset && offset < pos->end_offset)
- {
- return &(*pos);
- }
- }
- return NULL;
-}
-
-size_t
-DWARFDebugRanges::RangeList::Size() const
-{
- return ranges.size();
-}
-
-void
-DWARFDebugRanges::RangeList::AddOffset(dw_addr_t offset)
-{
- if (!ranges.empty())
- {
- Range::iterator pos = ranges.begin();
- Range::iterator end_pos = ranges.end();
- for (pos = ranges.begin(); pos != end_pos; ++pos)
- {
- // assert for unsigned overflows
- assert (~pos->begin_offset >= offset);
- assert (~pos->end_offset >= offset);
- pos->begin_offset += offset;
- pos->end_offset += offset;
- }
- }
-}
-
-void
-DWARFDebugRanges::RangeList::SubtractOffset(dw_addr_t offset)
-{
- if (!ranges.empty())
- {
- Range::iterator pos = ranges.begin();
- Range::iterator end_pos = ranges.end();
- for (pos = ranges.begin(); pos != end_pos; ++pos)
- {
- assert (pos->begin_offset >= offset);
- assert (pos->end_offset >= offset);
- pos->begin_offset -= offset;
- pos->end_offset -= offset;
- }
- }
-}
-
-
-const DWARFDebugRanges::Range*
-DWARFDebugRanges::RangeList::RangeAtIndex(size_t i) const
-{
- if (i < ranges.size())
- return &ranges[i];
- return NULL;
-}
+//void
+//DWARFDebugRanges::RangeList::AddOffset(dw_addr_t offset)
+//{
+// if (!ranges.empty())
+// {
+// Range::iterator pos = ranges.begin();
+// Range::iterator end_pos = ranges.end();
+// for (pos = ranges.begin(); pos != end_pos; ++pos)
+// {
+// // assert for unsigned overflows
+// assert (~pos->begin_offset >= offset);
+// assert (~pos->end_offset >= offset);
+// pos->begin_offset += offset;
+// pos->end_offset += offset;
+// }
+// }
+//}
+//
+//void
+//DWARFDebugRanges::RangeList::SubtractOffset(dw_addr_t offset)
+//{
+// if (!ranges.empty())
+// {
+// Range::iterator pos = ranges.begin();
+// Range::iterator end_pos = ranges.end();
+// for (pos = ranges.begin(); pos != end_pos; ++pos)
+// {
+// assert (pos->begin_offset >= offset);
+// assert (pos->end_offset >= offset);
+// pos->begin_offset -= offset;
+// pos->end_offset -= offset;
+// }
+// }
+//}
+//
+//
+//const DWARFDebugRanges::Range*
+//DWARFDebugRanges::RangeList::RangeAtIndex(size_t i) const
+//{
+// if (i < ranges.size())
+// return &ranges[i];
+// return NULL;
+//}
bool
-DWARFDebugRanges::RangeList::Extract(SymbolFileDWARF* dwarf2Data, uint32_t* offset_ptr)
+DWARFDebugRanges::Extract(SymbolFileDWARF* dwarf2Data, uint32_t* offset_ptr, RangeList &range_list)
{
- Clear();
+ range_list.Clear();
+
uint32_t range_offset = *offset_ptr;
const DataExtractor& debug_ranges_data = dwarf2Data->get_debug_ranges_data();
uint32_t addr_size = debug_ranges_data.GetAddressByteSize();
@@ -154,65 +122,65 @@ DWARFDebugRanges::RangeList::Extract(SymbolFileDWARF* dwarf2Data, uint32_t* offs
}
// Filter out empty ranges
- if (begin != end)
- ranges.push_back(Range(begin, end));
+ if (begin < end)
+ range_list.Append(Range(begin, end - begin));
}
// Make sure we consumed at least something
return range_offset != *offset_ptr;
}
-
-dw_addr_t
-DWARFDebugRanges::RangeList::LowestAddress(const dw_addr_t cu_base_addr) const
-{
- dw_addr_t addr = DW_INVALID_ADDRESS;
- dw_addr_t curr_base_addr = cu_base_addr;
- if (!ranges.empty())
- {
- Range::const_iterator pos = ranges.begin();
- Range::const_iterator end_pos = ranges.end();
- for (pos = ranges.begin(); pos != end_pos; ++pos)
- {
- if (pos->begin_offset == DW_INVALID_ADDRESS)
- curr_base_addr = pos->end_offset;
- else if (curr_base_addr != DW_INVALID_ADDRESS)
- {
- dw_addr_t curr_addr = curr_base_addr + pos->begin_offset;
- if (addr > curr_addr)
- addr = curr_addr;
- }
- }
- }
- return addr;
-}
-
-dw_addr_t
-DWARFDebugRanges::RangeList::HighestAddress(const dw_addr_t cu_base_addr) const
-{
- dw_addr_t addr = 0;
- dw_addr_t curr_base_addr = cu_base_addr;
- if (!ranges.empty())
- {
- Range::const_iterator pos = ranges.begin();
- Range::const_iterator end_pos = ranges.end();
- for (pos = ranges.begin(); pos != end_pos; ++pos)
- {
- if (pos->begin_offset == DW_INVALID_ADDRESS)
- curr_base_addr = pos->end_offset;
- else if (curr_base_addr != DW_INVALID_ADDRESS)
- {
- dw_addr_t curr_addr = curr_base_addr + pos->end_offset;
- if (addr < curr_addr)
- addr = curr_addr;
- }
- }
- }
- if (addr != 0)
- return addr;
- return DW_INVALID_ADDRESS;
-}
-
+//
+//dw_addr_t
+//DWARFDebugRanges::RangeList::LowestAddress(const dw_addr_t cu_base_addr) const
+//{
+// dw_addr_t addr = DW_INVALID_ADDRESS;
+// dw_addr_t curr_base_addr = cu_base_addr;
+// if (!ranges.empty())
+// {
+// Range::const_iterator pos = ranges.begin();
+// Range::const_iterator end_pos = ranges.end();
+// for (pos = ranges.begin(); pos != end_pos; ++pos)
+// {
+// if (pos->begin_offset == DW_INVALID_ADDRESS)
+// curr_base_addr = pos->end_offset;
+// else if (curr_base_addr != DW_INVALID_ADDRESS)
+// {
+// dw_addr_t curr_addr = curr_base_addr + pos->begin_offset;
+// if (addr > curr_addr)
+// addr = curr_addr;
+// }
+// }
+// }
+// return addr;
+//}
+//
+//dw_addr_t
+//DWARFDebugRanges::RangeList::HighestAddress(const dw_addr_t cu_base_addr) const
+//{
+// dw_addr_t addr = 0;
+// dw_addr_t curr_base_addr = cu_base_addr;
+// if (!ranges.empty())
+// {
+// Range::const_iterator pos = ranges.begin();
+// Range::const_iterator end_pos = ranges.end();
+// for (pos = ranges.begin(); pos != end_pos; ++pos)
+// {
+// if (pos->begin_offset == DW_INVALID_ADDRESS)
+// curr_base_addr = pos->end_offset;
+// else if (curr_base_addr != DW_INVALID_ADDRESS)
+// {
+// dw_addr_t curr_addr = curr_base_addr + pos->end_offset;
+// if (addr < curr_addr)
+// addr = curr_addr;
+// }
+// }
+// }
+// if (addr != 0)
+// return addr;
+// return DW_INVALID_ADDRESS;
+//}
+//
void
DWARFDebugRanges::Dump(Stream &s, const DataExtractor& debug_ranges_data, uint32_t* offset_ptr, dw_addr_t cu_base_addr)
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
index 362b99dc766..9145cc12648 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
@@ -11,66 +11,17 @@
#define SymbolFileDWARF_DWARFDebugRanges_h_
#include "SymbolFileDWARF.h"
+
#include <map>
#include <vector>
+#include "lldb/Core/RangeMap.h"
class DWARFDebugRanges
{
public:
-
- //------------------------------------------------------------------
- // Address range
- //------------------------------------------------------------------
- struct Range
- {
- Range(dw_addr_t begin = DW_INVALID_ADDRESS, dw_addr_t end = DW_INVALID_ADDRESS) :
- begin_offset(begin),
- end_offset(end)
- {
- }
-
- void Clear()
- {
- begin_offset = DW_INVALID_ADDRESS;
- end_offset = DW_INVALID_ADDRESS;
- }
-
- dw_addr_t begin_offset;
- dw_addr_t end_offset;
-
- typedef std::vector<Range> collection;
- typedef collection::iterator iterator;
- typedef collection::const_iterator const_iterator;
-
- };
-
- //------------------------------------------------------------------
- // Collection of ranges
- //------------------------------------------------------------------
- struct RangeList
- {
- RangeList() :
- ranges()
- {
- }
-
- bool Extract(SymbolFileDWARF* dwarf2Data, uint32_t* offset_ptr);
- bool AddRange(dw_addr_t lo_addr, dw_addr_t hi_addr);
- void Clear()
- {
- ranges.clear();
- }
-
- dw_addr_t LowestAddress(const dw_addr_t base_addr) const;
- dw_addr_t HighestAddress(const dw_addr_t base_addr) const;
- void AddOffset(dw_addr_t offset);
- void SubtractOffset(dw_addr_t offset);
- size_t Size() const;
- const Range* RangeAtIndex(size_t i) const;
- const Range* Lookup(dw_addr_t offset) const;
- Range::collection ranges;
- };
+ typedef lldb_private::RangeArray<dw_addr_t, dw_addr_t> RangeList;
+ typedef RangeList::Entry Range;
DWARFDebugRanges();
~DWARFDebugRanges();
@@ -79,6 +30,12 @@ public:
bool FindRanges(dw_offset_t debug_ranges_offset, DWARFDebugRanges::RangeList& range_list) const;
protected:
+
+ bool
+ Extract (SymbolFileDWARF* dwarf2Data,
+ uint32_t* offset_ptr,
+ RangeList &range_list);
+
typedef std::map<dw_offset_t, RangeList> range_map;
typedef range_map::iterator range_map_iterator;
typedef range_map::const_iterator range_map_const_iterator;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 5204d070ff5..bcbb448807e 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -650,20 +650,19 @@ SymbolFileDWARF::ParseCompileUnitAtIndex(uint32_t cu_idx)
}
static void
-AddRangesToBlock
-(
- Block& block,
- DWARFDebugRanges::RangeList& ranges,
- addr_t block_base_addr
-)
+AddRangesToBlock (Block& block,
+ DWARFDebugRanges::RangeList& ranges,
+ addr_t block_base_addr)
{
- ranges.SubtractOffset (block_base_addr);
- size_t range_idx = 0;
- const DWARFDebugRanges::Range *debug_range;
- for (range_idx = 0; (debug_range = ranges.RangeAtIndex(range_idx)) != NULL; range_idx++)
+ const size_t num_ranges = ranges.GetSize();
+ for (size_t i = 0; i<num_ranges; ++i)
{
- block.AddRange(VMRange (debug_range->begin_offset, debug_range->end_offset));
+ const DWARFDebugRanges::Range &range = ranges.GetEntryRef (i);
+ const addr_t range_base = range.GetRangeBase();
+ assert (range_base >= block_base_addr);
+ block.AddRange(Block::Range (range_base - block_base_addr, range.GetByteSize()));;
}
+ block.FinalizeRanges ();
}
@@ -690,8 +689,8 @@ SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, DWARFCompile
{
// Union of all ranges in the function DIE (if the function is discontiguous)
AddressRange func_range;
- lldb::addr_t lowest_func_addr = func_ranges.LowestAddress(0);
- lldb::addr_t highest_func_addr = func_ranges.HighestAddress(0);
+ lldb::addr_t lowest_func_addr = func_ranges.GetMinRangeBase (0);
+ lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd (0);
if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr)
{
func_range.GetBaseAddress().ResolveAddressUsingFileSections (lowest_func_addr, m_obj_file->GetSectionList());
@@ -1054,7 +1053,7 @@ SymbolFileDWARF::ParseFunctionBlocks
if (tag == DW_TAG_subprogram)
{
assert (subprogram_low_pc == LLDB_INVALID_ADDRESS);
- subprogram_low_pc = ranges.LowestAddress(0);
+ subprogram_low_pc = ranges.GetMinRangeBase(0);
}
else if (tag == DW_TAG_inlined_subroutine)
{
@@ -1068,7 +1067,7 @@ SymbolFileDWARF::ParseFunctionBlocks
// function the offset will be for that function.
if (subprogram_low_pc == LLDB_INVALID_ADDRESS)
{
- subprogram_low_pc = ranges.LowestAddress(0);
+ subprogram_low_pc = ranges.GetMinRangeBase(0);
}
}
OpenPOWER on IntegriCloud