Index: lld/trunk/COFF/InputFiles.cpp =================================================================== --- lld/trunk/COFF/InputFiles.cpp +++ lld/trunk/COFF/InputFiles.cpp @@ -199,7 +199,7 @@ COFFObj->getSymbolName(Sym, Name); auto *U = new (Alloc) Undefined(Name); auto *Aux = (const coff_aux_weak_external *)AuxP; - U->WeakAlias = cast(SparseSymbolBodies[Aux->TagIndex]); + U->WeakAlias = SparseSymbolBodies[Aux->TagIndex]; return U; } Index: lld/trunk/COFF/SymbolTable.cpp =================================================================== --- lld/trunk/COFF/SymbolTable.cpp +++ lld/trunk/COFF/SymbolTable.cpp @@ -126,10 +126,11 @@ if (!Undef) continue; StringRef Name = Undef->getName(); - // A weak alias may have been resovled, so check for that. A weak alias - // may be an weak alias to other symbol, so check recursively. - for (Undefined *U = Undef->WeakAlias; U; U = U->WeakAlias) { - if (auto *D = dyn_cast(U->repl())) { + // A weak alias may have been resolved, so check for that. A weak alias + // may be a weak alias to another symbol, so check recursively. + for (SymbolBody *A = Undef->WeakAlias; A; + A = cast(A)->WeakAlias) { + if (auto *D = dyn_cast(A->repl())) { Sym->Body = D; goto next; } Index: lld/trunk/COFF/Symbols.h =================================================================== --- lld/trunk/COFF/Symbols.h +++ lld/trunk/COFF/Symbols.h @@ -253,7 +253,7 @@ // undefined symbol a second chance if it would remain undefined. // If it remains undefined, it'll be replaced with whatever the // Alias pointer points to. - Undefined *WeakAlias = nullptr; + SymbolBody *WeakAlias = nullptr; }; // Windows-specific classes. Index: lld/trunk/test/COFF/weak-external.test =================================================================== --- lld/trunk/test/COFF/weak-external.test +++ lld/trunk/test/COFF/weak-external.test @@ -0,0 +1,29 @@ +# RUN: yaml2obj %s > %t.obj +# RUN: lld -flavor link2 /out:%t.exe /entry:g /subsystem:console %t.obj + +--- +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: '.text' + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 16 + SectionData: 00 +symbols: + - Name: 'f' + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: 'g' + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_WEAK_EXTERNAL + WeakExternal: + TagIndex: 0 + Characteristics: IMAGE_WEAK_EXTERN_SEARCH_LIBRARY +...