[DWARF parser] Respect address ranges specified in compile unit DIE.
authorAlexey Samsonov <samsonov@google.com>
Fri, 18 Apr 2014 20:30:27 +0000 (20:30 +0000)
committerAlexey Samsonov <samsonov@google.com>
Fri, 18 Apr 2014 20:30:27 +0000 (20:30 +0000)
When address ranges for compile unit are specified in compile unit DIE
itself, there is no need to collect ranges from children subprogram DIEs.

This change speeds up llvm-symbolizer on Clang-produced binaries with
full debug info. For instance, symbolizing a first address in a 1Gb binary
is now 2x faster (1s vs. 2s).

llvm-svn: 206641

llvm/lib/DebugInfo/DWARFUnit.cpp

index 6b8d97c..7aba46c 100644 (file)
@@ -299,6 +299,13 @@ void DWARFUnit::clearDIEs(bool KeepCUDie) {
 }
 
 void DWARFUnit::collectAddressRanges(DWARFAddressRangesVector &CURanges) {
+  // First, check if CU DIE describes address ranges for the unit.
+  const auto &CUDIERanges = getCompileUnitDIE()->getAddressRanges(this);
+  if (!CUDIERanges.empty()) {
+    CURanges.insert(CURanges.end(), CUDIERanges.begin(), CUDIERanges.end());
+    return;
+  }
+
   // This function is usually called if there in no .debug_aranges section
   // in order to produce a compile unit level set of address ranges that
   // is accurate. If the DIEs weren't parsed, then we don't want all dies for