[llvm] f9fb9da - [dsymutil] Fix handling of aliases to private external symbols

Jonas Devlieghere via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 14 20:19:07 PDT 2020


Author: Jonas Devlieghere
Date: 2020-10-14T20:18:56-07:00
New Revision: f9fb9da36c34d2745b74dc30e6c26f7d3f48466c

URL: https://github.com/llvm/llvm-project/commit/f9fb9da36c34d2745b74dc30e6c26f7d3f48466c
DIFF: https://github.com/llvm/llvm-project/commit/f9fb9da36c34d2745b74dc30e6c26f7d3f48466c.diff

LOG: [dsymutil] Fix handling of aliases to private external symbols

dsymutil was incorrectly ignoring aliases to private extern symbols in
the MachODebugMapParser. This resulted in spurious warnings about not
being able to find symbols.

rdar://49652389

Differential revision: https://reviews.llvm.org/D89444

Added: 
    llvm/test/tools/dsymutil/ARM/private-extern-alias.test
    llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/main.o
    llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.o
    llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.out

Modified: 
    llvm/tools/dsymutil/MachODebugMapParser.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/dsymutil/ARM/private-extern-alias.test b/llvm/test/tools/dsymutil/ARM/private-extern-alias.test
new file mode 100644
index 000000000000..99301febb15f
--- /dev/null
+++ b/llvm/test/tools/dsymutil/ARM/private-extern-alias.test
@@ -0,0 +1,29 @@
+$ cat private_extern.c
+__attribute__((visibility("hidden")))
+int* foo() {
+  int i = 10;
+  volatile int* j = &i;
+  return j;
+}
+
+int* bar() {
+  return foo();
+}
+
+$ cat main.c
+int* bar();
+int main() {
+  return *bar();
+}
+
+$ cat alias_list
+_foo _baz
+
+$ xcrun --sdk iphoneos clang -g private_extern.c -c -o private_extern.o -target arm64-apple-ios14.0
+$ xcrun --sdk iphoneos clang -g main.c -c -o main.o -target arm64-apple-ios14.0
+$ xcrun --sdk iphoneos clang private_extern.o main.o -target arm64-apple-ios14.0 -o private_extern.out -Xlinker -alias_list -Xlinker alias_list
+
+RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/private_extern/private_extern.out -o %t.dSYM --verbose 2>&1 | FileCheck %s
+CHECK-NOT: could not find object file symbol for symbol _baz
+CHECK: { sym: _foo, objAddr: 0x0000000000000000, binAddr: 0x0000000100007F58, size: 0x00000020 }
+CHECK: { sym: _baz, objAddr: 0x0000000000000000, binAddr: 0x0000000100007F58, size: 0x00000000 }

diff  --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/main.o b/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/main.o
new file mode 100644
index 000000000000..d9cf74ee6440
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/main.o 
diff er

diff  --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.o b/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.o
new file mode 100644
index 000000000000..b7f1a6a8e847
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.o 
diff er

diff  --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.out b/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.out
new file mode 100755
index 000000000000..fff5df162cf7
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/private/tmp/private_extern/private_extern.out 
diff er

diff  --git a/llvm/tools/dsymutil/MachODebugMapParser.cpp b/llvm/tools/dsymutil/MachODebugMapParser.cpp
index 617b708561c4..3323a0514e32 100644
--- a/llvm/tools/dsymutil/MachODebugMapParser.cpp
+++ b/llvm/tools/dsymutil/MachODebugMapParser.cpp
@@ -562,7 +562,9 @@ void MachODebugMapParser::loadMainBinarySymbols(
       continue;
     }
     Section = *SectionOrErr;
-    if (Section == MainBinary.section_end() || Section->isText())
+    if ((Section == MainBinary.section_end() || Section->isText()) &&
+        !(SymType &
+          MachO::N_PEXT)) // Alias to non-external (was a private external)
       continue;
     uint64_t Addr = cantFail(Sym.getValue());
     Expected<StringRef> NameOrErr = Sym.getName();


        


More information about the llvm-commits mailing list