[llvm-nm] Always use opaque pointers (PR55506)
authorNikita Popov <npopov@redhat.com>
Tue, 17 May 2022 08:50:18 +0000 (10:50 +0200)
committerNikita Popov <npopov@redhat.com>
Wed, 18 May 2022 07:46:14 +0000 (09:46 +0200)
Always enable opaque pointers in llvm-nm, because the tool doesn't
actually care, and this allows us to read both typed pointer and
opaque pointer bitcode files in one archive. Previously this
depended on the order inside the archive (it would work with an
opaque pointer bitcode file first, but fail with a typed pointer
bitcode file first).

Fixes https://github.com/llvm/llvm-project/issues/55506.

Differential Revision: https://reviews.llvm.org/D125751

llvm/test/tools/llvm-nm/opaque-pointers.ll [new file with mode: 0644]
llvm/tools/llvm-nm/llvm-nm.cpp

diff --git a/llvm/test/tools/llvm-nm/opaque-pointers.ll b/llvm/test/tools/llvm-nm/opaque-pointers.ll
new file mode 100644 (file)
index 0000000..0bda500
--- /dev/null
@@ -0,0 +1,13 @@
+; RUN: llvm-as -opaque-pointers=0 < %s > %t.typed.bc
+; RUN: llvm-as -opaque-pointers=1 < %s > %t.opaque.bc
+; RUN: llvm-ar cr %t.a %t.typed.bc %t.opaque.bc
+; RUN: llvm-nm --just-symbol-name %t.a | FileCheck %s
+
+; CHECK-LABEL: typed.bc:
+; CHECK: test
+; CHECK-LABEL: opaque.bc:
+; CHECK: test
+
+define void @test() {
+  ret void
+}
index 0f39333..f0def8b 100644 (file)
@@ -2254,7 +2254,11 @@ static std::vector<NMSymbol> dumpSymbolNamesFromFile(StringRef Filename) {
   if (error(BufferOrErr.getError(), Filename))
     return SymbolList;
 
+  // Always enable opaque pointers, to handle archives with mixed typed and
+  // opaque pointer bitcode files gracefully. As we're only reading symbols,
+  // the used pointer types don't matter.
   LLVMContext Context;
+  Context.setOpaquePointers(true);
   LLVMContext *ContextPtr = NoLLVMBitcode ? nullptr : &Context;
   Expected<std::unique_ptr<Binary>> BinaryOrErr =
       createBinary(BufferOrErr.get()->getMemBufferRef(), ContextPtr);