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); } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits