[llvm] 3d381a7 - [llvm-nm][MachO] Don't call getFlags on redacted symbols

Francis Visoiu Mistrih via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 4 22:06:02 PST 2020


Author: Francis Visoiu Mistrih
Date: 2020-12-04T21:48:53-08:00
New Revision: 3d381a710220100722465ead9c64874621edead4

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

LOG: [llvm-nm][MachO] Don't call getFlags on redacted symbols

Avoid calling getFlags on a non-existent symbol.

The way this is triggered is by calling strip -N on a binary, which sets
the MH_NLIST_OUTOFSYNC_WITH_DYLDINFO header flag. Then, in the
LC_FUNCTION_STARTS command, nm is trying to print the stripped symbols
and needs the proper checks.

Added: 
    llvm/test/tools/llvm-nm/AArch64/Inputs/redacted-function.macho-aarch64
    llvm/test/tools/llvm-nm/AArch64/macho-redacted-function.test

Modified: 
    llvm/tools/llvm-nm/llvm-nm.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-nm/AArch64/Inputs/redacted-function.macho-aarch64 b/llvm/test/tools/llvm-nm/AArch64/Inputs/redacted-function.macho-aarch64
new file mode 100755
index 000000000000..eebb208b421c
Binary files /dev/null and b/llvm/test/tools/llvm-nm/AArch64/Inputs/redacted-function.macho-aarch64 
diff er

diff  --git a/llvm/test/tools/llvm-nm/AArch64/macho-redacted-function.test b/llvm/test/tools/llvm-nm/AArch64/macho-redacted-function.test
new file mode 100644
index 000000000000..c662f54c93b6
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/AArch64/macho-redacted-function.test
@@ -0,0 +1,16 @@
+RUN: llvm-nm %p/Inputs/redacted-function.macho-aarch64 | FileCheck %s
+
+CHECK: <redacted function 1>
+
+# Generated with:
+# $ cat /tmp/a.c
+# static int i(void) {
+#   return 0;
+# }
+#
+# int main(void) {
+#   return i();
+# }
+#
+# $ xcrun -sdk watchos clang -arch arm64_32 /tmp/a.c -o /tmp/redacted-function.macho-aarch64
+# $ xcrun -sdk watchos strip -N /tmp/redacted-function.macho-aarch64

diff  --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp
index a34352d1512c..9680149d4f8c 100644
--- a/llvm/tools/llvm-nm/llvm-nm.cpp
+++ b/llvm/tools/llvm-nm/llvm-nm.cpp
@@ -316,18 +316,20 @@ struct NMSymbol {
 static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) {
   bool ADefined;
   // Symbol flags have been checked in the caller.
-  uint32_t AFlags = cantFail(A.Sym.getFlags());
-  if (A.Sym.getRawDataRefImpl().p)
+  if (A.Sym.getRawDataRefImpl().p) {
+    uint32_t AFlags = cantFail(A.Sym.getFlags());
     ADefined = !(AFlags & SymbolRef::SF_Undefined);
-  else
+  } else {
     ADefined = A.TypeChar != 'U';
+  }
   bool BDefined;
   // Symbol flags have been checked in the caller.
-  uint32_t BFlags = cantFail(B.Sym.getFlags());
-  if (B.Sym.getRawDataRefImpl().p)
+  if (B.Sym.getRawDataRefImpl().p) {
+    uint32_t BFlags = cantFail(B.Sym.getFlags());
     BDefined = !(BFlags & SymbolRef::SF_Undefined);
-  else
+  } else {
     BDefined = B.TypeChar != 'U';
+  }
   return std::make_tuple(ADefined, A.Address, A.Name, A.Size) <
          std::make_tuple(BDefined, B.Address, B.Name, B.Size);
 }


        


More information about the llvm-commits mailing list