diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index c20b54a5d42e4..985528ed4294c 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -1537,7 +1537,7 @@ void PDBLinker::addImportFilesToPDB() { if (!file->thunkSym) continue; - if (!file->thunkSym->isLive()) + if (!file->thunkSym->isLive() && !file->impchkThunk) continue; std::string dll = StringRef(file->dllName).lower(); @@ -1562,53 +1562,61 @@ void PDBLinker::addImportFilesToPDB() { mod->setObjFileName(libPath); } - DefinedImportThunk *thunk = cast(file->thunkSym); - Chunk *thunkChunk = thunk->getChunk(); - OutputSection *thunkOS = ctx.getOutputSection(thunkChunk); - ObjNameSym ons(SymbolRecordKind::ObjNameSym); Compile3Sym cs(SymbolRecordKind::Compile3Sym); - Thunk32Sym ts(SymbolRecordKind::Thunk32Sym); - ScopeEndSym es(SymbolRecordKind::ScopeEndSym); ons.Name = file->dllName; ons.Signature = 0; fillLinkerVerRecord(cs, ctx.config.machine); - ts.Name = thunk->getName(); - ts.Parent = 0; - ts.End = 0; - ts.Next = 0; - ts.Thunk = ThunkOrdinal::Standard; - ts.Length = thunkChunk->getSize(); - ts.Segment = thunkOS->sectionIndex; - ts.Offset = thunkChunk->getRVA() - thunkOS->getRVA(); - llvm::BumpPtrAllocator &bAlloc = lld::bAlloc(); mod->addSymbol(codeview::SymbolSerializer::writeOneSymbol( ons, bAlloc, CodeViewContainer::Pdb)); mod->addSymbol(codeview::SymbolSerializer::writeOneSymbol( cs, bAlloc, CodeViewContainer::Pdb)); - CVSymbol newSym = codeview::SymbolSerializer::writeOneSymbol( - ts, bAlloc, CodeViewContainer::Pdb); + auto addThunk = [&](Symbol *sym, Chunk *chunk) { + OutputSection *thunkOS = ctx.getOutputSection(chunk); + + Thunk32Sym ts(SymbolRecordKind::Thunk32Sym); + ScopeEndSym es(SymbolRecordKind::ScopeEndSym); + + ts.Name = sym->getName(); + ts.Parent = 0; + ts.End = 0; + ts.Next = 0; + ts.Thunk = ThunkOrdinal::Standard; + ts.Length = chunk->getSize(); + ts.Segment = thunkOS->sectionIndex; + ts.Offset = chunk->getRVA() - thunkOS->getRVA(); - // Write ptrEnd for the S_THUNK32. - ScopeRecord *thunkSymScope = - getSymbolScopeFields(const_cast(newSym.data().data())); + CVSymbol newSym = codeview::SymbolSerializer::writeOneSymbol( + ts, bAlloc, CodeViewContainer::Pdb); - mod->addSymbol(newSym); + // Write ptrEnd for the S_THUNK32. + ScopeRecord *thunkSymScope = + getSymbolScopeFields(const_cast(newSym.data().data())); - newSym = codeview::SymbolSerializer::writeOneSymbol(es, bAlloc, - CodeViewContainer::Pdb); - thunkSymScope->ptrEnd = mod->getNextSymbolOffset(); + mod->addSymbol(newSym); - mod->addSymbol(newSym); + newSym = codeview::SymbolSerializer::writeOneSymbol( + es, bAlloc, CodeViewContainer::Pdb); + thunkSymScope->ptrEnd = mod->getNextSymbolOffset(); + + mod->addSymbol(newSym); + + pdb::SectionContrib sc = + createSectionContrib(ctx, chunk, mod->getModuleIndex()); + mod->setFirstSectionContrib(sc); + }; - pdb::SectionContrib sc = - createSectionContrib(ctx, thunk->getChunk(), mod->getModuleIndex()); - mod->setFirstSectionContrib(sc); + if (file->auxThunkSym && file->auxThunkSym->isLive()) + addThunk(file->thunkSym, file->auxThunkSym->getChunk()); + if (file->impchkThunk) + addThunk(file->impchkThunk->sym, file->impchkThunk); + if (file->thunkSym->isLive()) + addThunk(file->thunkSym, file->thunkSym->getChunk()); } } diff --git a/lld/test/COFF/arm64ec-pdb.test b/lld/test/COFF/arm64ec-pdb.test index 97b77039153c6..2739a1f7f75da 100644 --- a/lld/test/COFF/arm64ec-pdb.test +++ b/lld/test/COFF/arm64ec-pdb.test @@ -11,7 +11,7 @@ RUN: llvm-pdbutil dump out.pdb -all | FileCheck %s CHECK: Streams CHECK-NEXT: ============================================================ -CHECK: Stream 10 ( 104 bytes): [Module "Import:test.dll"] +CHECK: Stream 10 ( 184 bytes): [Module "Import:test.dll"] CHECK-NEXT: Blocks: [9] CHECK-NEXT: Stream 11 ({{[ 0-9]+}} bytes): [Module "* Linker *"] CHECK-NEXT: Blocks: [10] @@ -27,7 +27,7 @@ CHECK-NEXT: Mod 2 (debug info not present): [{{.*}}loadconfig-arm64ec.obj] CHECK-NEXT: Mod 0003 | `test.dll`: CHECK-NEXT: Mod 3 (debug info not present): [test.dll] CHECK-NEXT: Mod 0004 | `Import:test.dll`: -CHECK-NEXT: Stream 10, 104 bytes +CHECK-NEXT: Stream 10, 184 bytes CHECK: Modules CHECK-NEXT: ============================================================ @@ -127,8 +127,16 @@ CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0 CHECK-NEXT: flags = none CHECK-NEXT: 64 | S_THUNK32 [size = 32] `func` CHECK-NEXT: parent = 0, end = 96, next = 0 -CHECK-NEXT: kind = thunk, size = 6, addr = 0001:4096 +CHECK-NEXT: kind = thunk, size = 12, addr = 0001:0008 CHECK-NEXT: 96 | S_END [size = 4] +CHECK-NEXT: 100 | S_THUNK32 [size = 40] `__impchk_func` +CHECK-NEXT: parent = 0, end = 140, next = 0 +CHECK-NEXT: kind = thunk, size = 20, addr = 0001:0020 +CHECK-NEXT: 140 | S_END [size = 4] +CHECK-NEXT: 144 | S_THUNK32 [size = 32] `func` +CHECK-NEXT: parent = 0, end = 176, next = 0 +CHECK-NEXT: kind = thunk, size = 6, addr = 0001:4096 +CHECK-NEXT: 176 | S_END [size = 4] CHECK-NEXT: Mod 0005 | `* Linker *`: CHECK-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `* Linker *` CHECK-NEXT: 24 | S_COMPILE3 [size = 40]