[PATCH] D38230: [dsymutil] Better support for symbol aliases

Jonas Devlieghere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 25 05:05:16 PDT 2017


JDevlieghere created this revision.

This patch adds logic to follow a symbol's aliases when the symbol name
cannot be found in the current object file. It checks the main binary
for the symbol's address and queries the current object for its aliases
(symbols with the same address) before printing out a warning.


Repository:
  rL LLVM

https://reviews.llvm.org/D38230

Files:
  test/tools/dsymutil/Inputs/alias/bar.o
  test/tools/dsymutil/Inputs/alias/foo.o
  test/tools/dsymutil/Inputs/alias/foobar
  test/tools/dsymutil/X86/alias.test
  tools/dsymutil/MachODebugMapParser.cpp


Index: tools/dsymutil/MachODebugMapParser.cpp
===================================================================
--- tools/dsymutil/MachODebugMapParser.cpp
+++ tools/dsymutil/MachODebugMapParser.cpp
@@ -70,6 +70,7 @@
                             sys::TimePoint<std::chrono::seconds> Timestamp);
   void resetParserState();
   uint64_t getMainBinarySymbolAddress(StringRef Name);
+  std::vector<StringRef> getMainBinarySymbolNames(uint64_t Value);
   void loadMainBinarySymbols(const MachOObjectFile &MainBinary);
   void loadCurrentObjectFileSymbols(const object::MachOObjectFile &Obj);
   void handleStabSymbolTableEntry(uint32_t StringIndex, uint8_t Type,
@@ -382,9 +383,22 @@
   }
 
   auto ObjectSymIt = CurrentObjectAddresses.find(Name);
-  if (ObjectSymIt == CurrentObjectAddresses.end())
+
+  // If the symbol name is not in the current object, we query all its aliases
+  // from the main binary.
+  if (ObjectSymIt == CurrentObjectAddresses.end()) {
+    for (const auto &Alias : getMainBinarySymbolNames(Value)) {
+      ObjectSymIt = CurrentObjectAddresses.find(Alias);
+      if (ObjectSymIt != CurrentObjectAddresses.end())
+        break;
+    }
+  }
+
+  if (ObjectSymIt == CurrentObjectAddresses.end()) {
     return Warning("could not find object file symbol for symbol " +
                    Twine(Name));
+  }
+
   if (!CurrentDebugMapObject->addSymbol(Name, ObjectSymIt->getValue(), Value,
                                         Size))
     return Warning(Twine("failed to insert symbol '") + Name +
@@ -429,6 +443,19 @@
   return Sym->second;
 }
 
+/// Get all symbol names in the main binary for the given value.
+std::vector<StringRef>
+MachODebugMapParser::getMainBinarySymbolNames(uint64_t Value) {
+  std::vector<StringRef> Names;
+  for (auto It = MainBinarySymbolAddresses.begin(),
+            End = MainBinarySymbolAddresses.end();
+       It != End; It++) {
+    if (It->second == Value)
+      Names.push_back(It->first());
+  }
+  return Names;
+}
+
 /// Load the interesting main binary symbols' addresses into
 /// MainBinarySymbolAddresses.
 void MachODebugMapParser::loadMainBinarySymbols(
Index: test/tools/dsymutil/X86/alias.test
===================================================================
--- /dev/null
+++ test/tools/dsymutil/X86/alias.test
@@ -0,0 +1,19 @@
+# RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/alias \
+# RUN: %p/../Inputs/alias/foobar -o - 2>&1 | llvm-dwarfdump - | FileCheck %s
+# CHECK-NOT: could not find object file symbol for symbol
+# CHECK: DW_AT_name ("foo.c")
+# CHECK: DW_AT_name ("bar.c")
+
+# Source:
+#   $ cat foo.c
+#   int foo = 1;
+#   $ cat bar.c
+#   extern int bar;
+#   int main() {
+#     return bar;
+#   }
+
+# Compile with:
+#   $ clang -g -O0 bar.c -c -o bar.o
+#   $ clang -g -O0 foo.c -c -o foo.o
+#   $ ld -arch x86_64 -macosx_version_min 10.13.0 foo.o bar.o -lSystem -alias _foo _bar -o foobar


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38230.116508.patch
Type: text/x-patch
Size: 2898 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170925/4b450520/attachment.bin>


More information about the llvm-commits mailing list