[llvm-branch-commits] [llvm] 3d381a7 - [llvm-nm][MachO] Don't call getFlags on redacted symbols
Francis Visoiu Mistrih via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Dec 4 22:10:24 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-branch-commits
mailing list