Skip to content

Commit 54e7fa2

Browse files
committed
[LLD][COFF] Add S_THUNK32 PDB records for all ARM64EC import thunks
1 parent ffe49b7 commit 54e7fa2

File tree

2 files changed

+48
-32
lines changed

2 files changed

+48
-32
lines changed

lld/COFF/PDB.cpp

+37-29
Original file line numberDiff line numberDiff line change
@@ -1537,7 +1537,7 @@ void PDBLinker::addImportFilesToPDB() {
15371537
if (!file->thunkSym)
15381538
continue;
15391539

1540-
if (!file->thunkSym->isLive())
1540+
if (!file->thunkSym->isLive() && !file->impchkThunk)
15411541
continue;
15421542

15431543
std::string dll = StringRef(file->dllName).lower();
@@ -1562,53 +1562,61 @@ void PDBLinker::addImportFilesToPDB() {
15621562
mod->setObjFileName(libPath);
15631563
}
15641564

1565-
DefinedImportThunk *thunk = cast<DefinedImportThunk>(file->thunkSym);
1566-
Chunk *thunkChunk = thunk->getChunk();
1567-
OutputSection *thunkOS = ctx.getOutputSection(thunkChunk);
1568-
15691565
ObjNameSym ons(SymbolRecordKind::ObjNameSym);
15701566
Compile3Sym cs(SymbolRecordKind::Compile3Sym);
1571-
Thunk32Sym ts(SymbolRecordKind::Thunk32Sym);
1572-
ScopeEndSym es(SymbolRecordKind::ScopeEndSym);
15731567

15741568
ons.Name = file->dllName;
15751569
ons.Signature = 0;
15761570

15771571
fillLinkerVerRecord(cs, ctx.config.machine);
15781572

1579-
ts.Name = thunk->getName();
1580-
ts.Parent = 0;
1581-
ts.End = 0;
1582-
ts.Next = 0;
1583-
ts.Thunk = ThunkOrdinal::Standard;
1584-
ts.Length = thunkChunk->getSize();
1585-
ts.Segment = thunkOS->sectionIndex;
1586-
ts.Offset = thunkChunk->getRVA() - thunkOS->getRVA();
1587-
15881573
llvm::BumpPtrAllocator &bAlloc = lld::bAlloc();
15891574
mod->addSymbol(codeview::SymbolSerializer::writeOneSymbol(
15901575
ons, bAlloc, CodeViewContainer::Pdb));
15911576
mod->addSymbol(codeview::SymbolSerializer::writeOneSymbol(
15921577
cs, bAlloc, CodeViewContainer::Pdb));
15931578

1594-
CVSymbol newSym = codeview::SymbolSerializer::writeOneSymbol(
1595-
ts, bAlloc, CodeViewContainer::Pdb);
1579+
auto addThunk = [&](Symbol *sym, Chunk *chunk) {
1580+
OutputSection *thunkOS = ctx.getOutputSection(chunk);
1581+
1582+
Thunk32Sym ts(SymbolRecordKind::Thunk32Sym);
1583+
ScopeEndSym es(SymbolRecordKind::ScopeEndSym);
1584+
1585+
ts.Name = sym->getName();
1586+
ts.Parent = 0;
1587+
ts.End = 0;
1588+
ts.Next = 0;
1589+
ts.Thunk = ThunkOrdinal::Standard;
1590+
ts.Length = chunk->getSize();
1591+
ts.Segment = thunkOS->sectionIndex;
1592+
ts.Offset = chunk->getRVA() - thunkOS->getRVA();
15961593

1597-
// Write ptrEnd for the S_THUNK32.
1598-
ScopeRecord *thunkSymScope =
1599-
getSymbolScopeFields(const_cast<uint8_t *>(newSym.data().data()));
1594+
CVSymbol newSym = codeview::SymbolSerializer::writeOneSymbol(
1595+
ts, bAlloc, CodeViewContainer::Pdb);
16001596

1601-
mod->addSymbol(newSym);
1597+
// Write ptrEnd for the S_THUNK32.
1598+
ScopeRecord *thunkSymScope =
1599+
getSymbolScopeFields(const_cast<uint8_t *>(newSym.data().data()));
16021600

1603-
newSym = codeview::SymbolSerializer::writeOneSymbol(es, bAlloc,
1604-
CodeViewContainer::Pdb);
1605-
thunkSymScope->ptrEnd = mod->getNextSymbolOffset();
1601+
mod->addSymbol(newSym);
16061602

1607-
mod->addSymbol(newSym);
1603+
newSym = codeview::SymbolSerializer::writeOneSymbol(
1604+
es, bAlloc, CodeViewContainer::Pdb);
1605+
thunkSymScope->ptrEnd = mod->getNextSymbolOffset();
1606+
1607+
mod->addSymbol(newSym);
1608+
1609+
pdb::SectionContrib sc =
1610+
createSectionContrib(ctx, chunk, mod->getModuleIndex());
1611+
mod->setFirstSectionContrib(sc);
1612+
};
16081613

1609-
pdb::SectionContrib sc =
1610-
createSectionContrib(ctx, thunk->getChunk(), mod->getModuleIndex());
1611-
mod->setFirstSectionContrib(sc);
1614+
if (file->auxThunkSym && file->auxThunkSym->isLive())
1615+
addThunk(file->thunkSym, file->auxThunkSym->getChunk());
1616+
if (file->impchkThunk)
1617+
addThunk(file->impchkThunk->sym, file->impchkThunk);
1618+
if (file->thunkSym->isLive())
1619+
addThunk(file->thunkSym, file->thunkSym->getChunk());
16121620
}
16131621
}
16141622

lld/test/COFF/arm64ec-pdb.test

+11-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ RUN: llvm-pdbutil dump out.pdb -all | FileCheck %s
1111

1212
CHECK: Streams
1313
CHECK-NEXT: ============================================================
14-
CHECK: Stream 10 ( 104 bytes): [Module "Import:test.dll"]
14+
CHECK: Stream 10 ( 184 bytes): [Module "Import:test.dll"]
1515
CHECK-NEXT: Blocks: [9]
1616
CHECK-NEXT: Stream 11 ({{[ 0-9]+}} bytes): [Module "* Linker *"]
1717
CHECK-NEXT: Blocks: [10]
@@ -27,7 +27,7 @@ CHECK-NEXT: Mod 2 (debug info not present): [{{.*}}loadconfig-arm64ec.obj]
2727
CHECK-NEXT: Mod 0003 | `test.dll`:
2828
CHECK-NEXT: Mod 3 (debug info not present): [test.dll]
2929
CHECK-NEXT: Mod 0004 | `Import:test.dll`:
30-
CHECK-NEXT: Stream 10, 104 bytes
30+
CHECK-NEXT: Stream 10, 184 bytes
3131

3232
CHECK: Modules
3333
CHECK-NEXT: ============================================================
@@ -127,8 +127,16 @@ CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0
127127
CHECK-NEXT: flags = none
128128
CHECK-NEXT: 64 | S_THUNK32 [size = 32] `func`
129129
CHECK-NEXT: parent = 0, end = 96, next = 0
130-
CHECK-NEXT: kind = thunk, size = 6, addr = 0001:4096
130+
CHECK-NEXT: kind = thunk, size = 12, addr = 0001:0008
131131
CHECK-NEXT: 96 | S_END [size = 4]
132+
CHECK-NEXT: 100 | S_THUNK32 [size = 40] `__impchk_func`
133+
CHECK-NEXT: parent = 0, end = 140, next = 0
134+
CHECK-NEXT: kind = thunk, size = 20, addr = 0001:0020
135+
CHECK-NEXT: 140 | S_END [size = 4]
136+
CHECK-NEXT: 144 | S_THUNK32 [size = 32] `func`
137+
CHECK-NEXT: parent = 0, end = 176, next = 0
138+
CHECK-NEXT: kind = thunk, size = 6, addr = 0001:4096
139+
CHECK-NEXT: 176 | S_END [size = 4]
132140
CHECK-NEXT: Mod 0005 | `* Linker *`:
133141
CHECK-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `* Linker *`
134142
CHECK-NEXT: 24 | S_COMPILE3 [size = 40]

0 commit comments

Comments
 (0)