Index: COFF/SymbolTable.cpp =================================================================== --- COFF/SymbolTable.cpp +++ COFF/SymbolTable.cpp @@ -276,12 +276,18 @@ if (!Body->isExternal()) continue; - // Find an existing Symbol. We should not see any new symbols at this point. + // Find an existing Symbol. We should not see any new undefined symbols at + // this point. StringRef Name = Body->getName(); - Symbol *Sym = Symtab[Name]; + Symbol *&Sym = Symtab[Name]; if (!Sym) { - llvm::errs() << "LTO: unexpected new symbol: " << Name << '\n'; - return make_error_code(LLDError::BrokenFile); + Sym = new (Alloc) Symbol(Body); + if (!isa(Body)) { + llvm::errs() << "LTO: undefined symbol: " << Name << '\n'; + return make_error_code(LLDError::BrokenFile); + } + Body->setBackref(Sym); + continue; } Body->setBackref(Sym); Index: test/COFF/lto-new-symbol.ll =================================================================== --- /dev/null +++ test/COFF/lto-new-symbol.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as -o %t.obj %s +; RUN: lld -flavor link2 /out:%t.exe /entry:foo /subsystem:console %t.obj + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc" + +define void @foo(<4 x i32>* %p, <4 x float>* %q, i1 %t) nounwind { +entry: + br label %loop +loop: + store <4 x i32>, <4 x i32>* %p + store <4 x float>, <4 x float>* %q + br i1 %t, label %loop, label %ret +ret: + ret void +}