[PATCH] D54922: [dsymutil] Gather local symbol addresses in addition to global in the main executable.

Jonas Devlieghere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 30 10:59:18 PST 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL348021: [dsymutil] Gather global and local symbol addresses in the main executable. (authored by JDevlieghere, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D54922?vs=175364&id=176162#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D54922/new/

https://reviews.llvm.org/D54922

Files:
  llvm/trunk/test/tools/dsymutil/Inputs/global_downgraded_to_static.x86_64
  llvm/trunk/test/tools/dsymutil/Inputs/global_downgraded_to_static/1.o
  llvm/trunk/test/tools/dsymutil/Inputs/global_downgraded_to_static/1.r.o
  llvm/trunk/test/tools/dsymutil/Inputs/global_downgraded_to_static/2.o
  llvm/trunk/test/tools/dsymutil/X86/global_downgraded_to_static.c
  llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp


Index: llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp
===================================================================
--- llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp
+++ llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp
@@ -511,14 +511,16 @@
     // Skip undefined and STAB entries.
     if ((Type == SymbolRef::ST_Debug) || (Type == SymbolRef::ST_Unknown))
       continue;
-    // The only symbols of interest are the global variables. These
-    // are the only ones that need to be queried because the address
-    // of common data won't be described in the debug map. All other
-    // addresses should be fetched for the debug map.
+    // In theory, the only symbols of interest are the global variables. These
+    // are the only ones that need to be queried because the address of common
+    // data won't be described in the debug map. All other addresses should be
+    // fetched for the debug map. In reality, by playing with 'ld -r' and
+    // export lists, you can get symbols described as N_GSYM in the debug map,
+    // but associated with a local symbol. Gather all the symbols, but prefer
+    // the global ones.
     uint8_t SymType =
         MainBinary.getSymbolTableEntry(Sym.getRawDataRefImpl()).n_type;
-    if (!(SymType & (MachO::N_EXT | MachO::N_PEXT)))
-      continue;
+    bool Extern = SymType & (MachO::N_EXT | MachO::N_PEXT);
     Expected<section_iterator> SectionOrErr = Sym.getSection();
     if (!SectionOrErr) {
       // TODO: Actually report errors helpfully.
@@ -538,7 +540,11 @@
     StringRef Name = *NameOrErr;
     if (Name.size() == 0 || Name[0] == '\0')
       continue;
-    MainBinarySymbolAddresses[Name] = Addr;
+    // Override only if the new key is global.
+    if (Extern)
+      MainBinarySymbolAddresses[Name] = Addr;
+    else
+      MainBinarySymbolAddresses.try_emplace(Name, Addr);
   }
 }
 
Index: llvm/trunk/test/tools/dsymutil/X86/global_downgraded_to_static.c
===================================================================
--- llvm/trunk/test/tools/dsymutil/X86/global_downgraded_to_static.c
+++ llvm/trunk/test/tools/dsymutil/X86/global_downgraded_to_static.c
@@ -0,0 +1,24 @@
+// REQUIRES : system-darwin
+// RUN: dsymutil -oso-prepend-path %p/.. -dump-debug-map %p/../Inputs/global_downgraded_to_static.x86_64 2>&1 | FileCheck %s
+//
+//  To build:
+//    clang -g -c -DFILE1 global_downgraded_to_static.c -o 1.o
+//    clang -g -c -DFILE2 global_downgraded_to_static.c -o 2.o
+//    ld -r -exported_symbol _foo 1.o -o 1.r.o
+//    clang 1.r.o 2.o -o global_downgraded_to_static.x86_64
+
+#if defined(FILE1)
+int global_to_become_static = 42;
+// CHECK: sym: _global_to_become_static,
+// CHECK-SAME: binAddr: 0x0000000100001000
+int foo() {
+  return global_to_become_static;
+}
+#elif defined(FILE2)
+int foo(void);
+int main() {
+  return foo();
+}
+#else
+#error Define FILE1 or FILE2
+#endif


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D54922.176162.patch
Type: text/x-patch
Size: 2890 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181130/e4b3b7ce/attachment.bin>


More information about the llvm-commits mailing list