Index: lld/trunk/COFF/InputFiles.cpp =================================================================== --- lld/trunk/COFF/InputFiles.cpp +++ lld/trunk/COFF/InputFiles.cpp @@ -291,7 +291,8 @@ } else { bool Replaceable = (SymbolDef == LTO_SYMBOL_DEFINITION_TENTATIVE || (Attrs & LTO_SYMBOL_COMDAT)); - SymbolBodies.push_back(new (Alloc) DefinedBitcode(SymName, Replaceable)); + SymbolBodies.push_back(new (Alloc) DefinedBitcode(this, SymName, + Replaceable)); } } Index: lld/trunk/COFF/Symbols.h =================================================================== --- lld/trunk/COFF/Symbols.h +++ lld/trunk/COFF/Symbols.h @@ -28,6 +28,7 @@ using llvm::object::coff_symbol_generic; class ArchiveFile; +class BitcodeFile; class InputFile; class ObjectFile; class SymbolBody; @@ -334,15 +335,19 @@ }; class DefinedBitcode : public Defined { + friend SymbolBody; public: - DefinedBitcode(StringRef N, bool IsReplaceable) - : Defined(DefinedBitcodeKind, N) { + DefinedBitcode(BitcodeFile *F, StringRef N, bool IsReplaceable) + : Defined(DefinedBitcodeKind, N), File(F) { this->IsReplaceable = IsReplaceable; } static bool classof(const SymbolBody *S) { return S->kind() == DefinedBitcodeKind; } + +private: + BitcodeFile *File; }; } // namespace coff Index: lld/trunk/COFF/Symbols.cpp =================================================================== --- lld/trunk/COFF/Symbols.cpp +++ lld/trunk/COFF/Symbols.cpp @@ -138,6 +138,9 @@ if (auto *D = dyn_cast(this)) { N += " "; N += D->File->getShortName(); + } else if (auto *D = dyn_cast(this)) { + N += " "; + N += D->File->getShortName(); } return N; } Index: lld/trunk/test/COFF/Inputs/conflict.ll =================================================================== --- lld/trunk/test/COFF/Inputs/conflict.ll +++ lld/trunk/test/COFF/Inputs/conflict.ll @@ -0,0 +1,3 @@ +define void @foo() { + ret void +} Index: lld/trunk/test/COFF/conflict.test =================================================================== --- lld/trunk/test/COFF/conflict.test +++ lld/trunk/test/COFF/conflict.test @@ -3,7 +3,12 @@ # RUN: not lld -flavor link2 /out:%t.exe %t1.obj %t2.obj >& %t.log # RUN: FileCheck %s < %t.log -# CHECK: duplicate symbol: foo {{.+}} and foo {{.+}} +# RUN: llvm-as -o %t.lto1.obj %S/Inputs/conflict.ll +# RUN: llvm-as -o %t.lto2.obj %S/Inputs/conflict.ll +# RUN: not lld -flavor link2 /out:%t.exe %t.lto1.obj %t.lto2.obj >& %t.log +# RUN: FileCheck %s < %t.log + +# CHECK: duplicate symbol: foo {{.+}}1.obj and foo {{.+}}2.obj --- header: