diff --git a/llvm/test/tools/llvm-dis/multiple-files-equivalent.ll b/llvm/test/tools/llvm-dis/multiple-files-equivalent.ll new file mode 100644 index 0000000000000..21f7abb67b286 --- /dev/null +++ b/llvm/test/tools/llvm-dis/multiple-files-equivalent.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as -o %t0 %s +; RUN: cp %t0 %t1 +; RUN: llvm-dis %t0 %t1 +; RUN: FileCheck %s < %t0.ll +; RUN: FileCheck %s < %t1.ll + +; Test that if we disassemble the same bitcode twice, the type names are +; unchanged between the two. This protects against a bug whereby state was +; preserved across inputs and the types ended up with different names. + +; CHECK: %Foo = type { ptr } +%Foo = type { ptr } + +; CHECK: @foo = global %Foo zeroinitializer +@foo = global %Foo zeroinitializer diff --git a/llvm/tools/llvm-dis/llvm-dis.cpp b/llvm/tools/llvm-dis/llvm-dis.cpp index 744201289b4a4..49acc9cd456ff 100644 --- a/llvm/tools/llvm-dis/llvm-dis.cpp +++ b/llvm/tools/llvm-dis/llvm-dis.cpp @@ -191,10 +191,6 @@ int main(int argc, char **argv) { if (LoadBitcodeIntoNewDbgInfoFormat == cl::boolOrDefault::BOU_UNSET) LoadBitcodeIntoNewDbgInfoFormat = cl::boolOrDefault::BOU_TRUE; - LLVMContext Context; - Context.setDiagnosticHandler( - std::make_unique(argv[0])); - if (InputFilenames.size() < 1) { InputFilenames.push_back("-"); } else if (InputFilenames.size() > 1 && !OutputFilename.empty()) { @@ -204,6 +200,12 @@ int main(int argc, char **argv) { } for (const auto &InputFilename : InputFilenames) { + // Use a fresh context for each input to avoid state + // cross-contamination across inputs (e.g. type name collisions). + LLVMContext Context; + Context.setDiagnosticHandler( + std::make_unique(argv[0])); + ErrorOr> BufferOrErr = MemoryBuffer::getFileOrSTDIN(InputFilename); if (std::error_code EC = BufferOrErr.getError()) {