folly: symbolizer: dwarf: don't fallback to linear scan if address missing from ...
authorLucian Grijincu <lucian@fb.com>
Tue, 23 Feb 2016 09:50:18 +0000 (01:50 -0800)
committerfacebook-github-bot-0 <folly-bot@fb.com>
Tue, 23 Feb 2016 10:20:24 +0000 (02:20 -0800)
Summary:Presence of .debug_aranges implies user expects fast address lookup.
Some addresses might not be avaialble in .debug_aranges.

Don't do slow lookup in .debug_info, as it can lead to unexpected slowdowns.

override-unit-failures

Reviewed By: philippv

Differential Revision: D2965323

fb-gh-sync-id: 405daefd57cdff4344fd231c5f5b7ff4dcd9df8c
shipit-source-id: 405daefd57cdff4344fd231c5f5b7ff4dcd9df8c

folly/experimental/symbolizer/Dwarf.cpp

index c13420ca422fd6a2b84e2a3af41afe58470e5210..f9e9709d2d8f05ad21ed4e4049f6d871d2b41936 100644 (file)
@@ -573,19 +573,22 @@ bool Dwarf::findAddress(uintptr_t address, LocationInfo& locationInfo) const {
     // Fast path: find the right .debug_info entry by looking up the
     // address in .debug_aranges.
     uint64_t offset = 0;
-    if (findDebugInfoOffset(address, aranges_, offset)) {
-      // Read compilation unit header from .debug_info
-      folly::StringPiece infoEntry(info_);
-      infoEntry.advance(offset);
-      findLocation(address, infoEntry, locationInfo);
-      return true;
+    if (!findDebugInfoOffset(address, aranges_, offset)) {
+      // NOTE: clang doesn't generate entries in .debug_aranges for
+      // some functions, but always generates .debug_info entries.
+      // We could read them from .debug_info but that's too slow.
+      // If .debug_aranges is present fast address lookup is assumed.
+      return false;
     }
+    // Read compilation unit header from .debug_info
+    folly::StringPiece infoEntry(info_);
+    infoEntry.advance(offset);
+    findLocation(address, infoEntry, locationInfo);
+    return true;
   }
 
   // Slow path (linear scan): Iterate over all .debug_info entries
   // and look for the address in each compilation unit.
-  // NOTE: clang doesn't generate entries in .debug_aranges for some
-  // functions, but always generates .debug_info entries.
   folly::StringPiece infoEntry(info_);
   while (!infoEntry.empty() && !locationInfo.hasFileAndLine) {
     findLocation(address, infoEntry, locationInfo);