Skip to content

Commit 97aa56a

Browse files
authored
[LLD][COFF] Move delayLoadHelper and tailMergeUnwindInfoChunk to SymbolTable (NFC) (llvm#124729)
In preparation for ARM64X delay-load import support (llvm#124600).
1 parent db6fa74 commit 97aa56a

File tree

6 files changed

+31
-38
lines changed

6 files changed

+31
-38
lines changed

lld/COFF/Config.h

-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ struct Configuration {
164164
bool noimplib = false;
165165
std::set<std::string> delayLoads;
166166
std::map<std::string, int> dllOrder;
167-
Symbol *delayLoadHelper = nullptr;
168167
Symbol *arm64ECIcallHelper = nullptr;
169168

170169
llvm::DenseSet<llvm::StringRef> saveTempsArgs;

lld/COFF/DLL.cpp

+17-24
Original file line numberDiff line numberDiff line change
@@ -911,21 +911,18 @@ uint64_t DelayLoadContents::getDirSize() {
911911
return dirs.size() * sizeof(delay_import_directory_table_entry);
912912
}
913913

914-
void DelayLoadContents::create(Defined *h) {
915-
helper = h;
914+
void DelayLoadContents::create() {
916915
std::vector<std::vector<DefinedImportData *>> v = binImports(ctx, imports);
917916

918-
Chunk *unwind = newTailMergeUnwindInfoChunk();
919-
920917
// Create .didat contents for each DLL.
921918
for (std::vector<DefinedImportData *> &syms : v) {
922919
// Create the delay import table header.
923920
dllNames.push_back(make<StringChunk>(syms[0]->getDLLName()));
924921
auto *dir = make<DelayDirectoryChunk>(dllNames.back());
925922

926923
size_t base = addresses.size();
927-
Chunk *tm = newTailMergeChunk(dir);
928-
Chunk *pdataChunk = unwind ? newTailMergePDataChunk(tm, unwind) : nullptr;
924+
Chunk *tm = newTailMergeChunk(ctx.symtab, dir);
925+
Chunk *pdataChunk = newTailMergePDataChunk(ctx.symtab, tm);
929926
for (DefinedImportData *s : syms) {
930927
Chunk *t = newThunkChunk(s, tm);
931928
auto *a = make<DelayAddressChunk>(ctx, t);
@@ -982,15 +979,18 @@ void DelayLoadContents::create(Defined *h) {
982979
dirs.push_back(dir);
983980
}
984981

985-
if (unwind)
986-
unwindinfo.push_back(unwind);
982+
ctx.forEachSymtab([&](SymbolTable &symtab) {
983+
if (symtab.tailMergeUnwindInfoChunk)
984+
unwindinfo.push_back(symtab.tailMergeUnwindInfoChunk);
985+
});
987986
// Add null terminator.
988987
dirs.push_back(
989988
make<NullChunk>(sizeof(delay_import_directory_table_entry), 4));
990989
}
991990

992-
Chunk *DelayLoadContents::newTailMergeChunk(Chunk *dir) {
993-
switch (ctx.config.machine) {
991+
Chunk *DelayLoadContents::newTailMergeChunk(SymbolTable &symtab, Chunk *dir) {
992+
auto helper = cast<Defined>(symtab.delayLoadHelper);
993+
switch (symtab.machine) {
994994
case AMD64:
995995
case ARM64EC:
996996
return make<TailMergeChunkX64>(dir, helper);
@@ -1005,21 +1005,14 @@ Chunk *DelayLoadContents::newTailMergeChunk(Chunk *dir) {
10051005
}
10061006
}
10071007

1008-
Chunk *DelayLoadContents::newTailMergeUnwindInfoChunk() {
1009-
switch (ctx.config.machine) {
1010-
case AMD64:
1011-
case ARM64EC:
1012-
return make<TailMergeUnwindInfoX64>();
1013-
// FIXME: Add support for other architectures.
1014-
default:
1015-
return nullptr; // Just don't generate unwind info.
1016-
}
1017-
}
1018-
Chunk *DelayLoadContents::newTailMergePDataChunk(Chunk *tm, Chunk *unwind) {
1019-
switch (ctx.config.machine) {
1008+
Chunk *DelayLoadContents::newTailMergePDataChunk(SymbolTable &symtab,
1009+
Chunk *tm) {
1010+
switch (symtab.machine) {
10201011
case AMD64:
10211012
case ARM64EC:
1022-
return make<TailMergePDataChunkX64>(tm, unwind);
1013+
if (!symtab.tailMergeUnwindInfoChunk)
1014+
symtab.tailMergeUnwindInfoChunk = make<TailMergeUnwindInfoX64>();
1015+
return make<TailMergePDataChunkX64>(tm, symtab.tailMergeUnwindInfoChunk);
10231016
// FIXME: Add support for other architectures.
10241017
default:
10251018
return nullptr; // Just don't generate unwind info.
@@ -1028,7 +1021,7 @@ Chunk *DelayLoadContents::newTailMergePDataChunk(Chunk *tm, Chunk *unwind) {
10281021

10291022
Chunk *DelayLoadContents::newThunkChunk(DefinedImportData *s,
10301023
Chunk *tailMerge) {
1031-
switch (ctx.config.machine) {
1024+
switch (s->file->getMachineType()) {
10321025
case AMD64:
10331026
case ARM64EC:
10341027
return make<ThunkChunkX64>(s, tailMerge);

lld/COFF/DLL.h

+3-5
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class DelayLoadContents {
4242
DelayLoadContents(COFFLinkerContext &ctx) : ctx(ctx) {}
4343
void add(DefinedImportData *sym) { imports.push_back(sym); }
4444
bool empty() { return imports.empty(); }
45-
void create(Defined *helper);
45+
void create();
4646
std::vector<Chunk *> getChunks();
4747
std::vector<Chunk *> getDataChunks();
4848
ArrayRef<Chunk *> getCodeChunks() { return thunks; }
@@ -56,11 +56,9 @@ class DelayLoadContents {
5656

5757
private:
5858
Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
59-
Chunk *newTailMergeChunk(Chunk *dir);
60-
Chunk *newTailMergePDataChunk(Chunk *tm, Chunk *unwind);
61-
Chunk *newTailMergeUnwindInfoChunk();
59+
Chunk *newTailMergeChunk(SymbolTable &symtab, Chunk *dir);
60+
Chunk *newTailMergePDataChunk(SymbolTable &symtab, Chunk *tm);
6261

63-
Defined *helper;
6462
std::vector<DefinedImportData *> imports;
6563
std::vector<Chunk *> dirs;
6664
std::vector<Chunk *> moduleHandles;

lld/COFF/Driver.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -2353,12 +2353,13 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
23532353
llvm::TimeTraceScope timeScope("Delay load");
23542354
for (auto *arg : args.filtered(OPT_delayload)) {
23552355
config->delayLoads.insert(StringRef(arg->getValue()).lower());
2356-
if (config->machine == I386) {
2357-
config->delayLoadHelper = ctx.symtab.addGCRoot("___delayLoadHelper2@8");
2358-
} else {
2359-
config->delayLoadHelper =
2360-
ctx.symtab.addGCRoot("__delayLoadHelper2", true);
2361-
}
2356+
ctx.forEachSymtab([&](SymbolTable &symtab) {
2357+
if (symtab.machine == I386) {
2358+
symtab.delayLoadHelper = symtab.addGCRoot("___delayLoadHelper2@8");
2359+
} else {
2360+
symtab.delayLoadHelper = symtab.addGCRoot("__delayLoadHelper2", true);
2361+
}
2362+
});
23622363
}
23632364
}
23642365

lld/COFF/SymbolTable.h

+3
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ class SymbolTable {
158158
Chunk *edataStart = nullptr;
159159
Chunk *edataEnd = nullptr;
160160

161+
Symbol *delayLoadHelper = nullptr;
162+
Chunk *tailMergeUnwindInfoChunk = nullptr;
163+
161164
void fixupExports();
162165
void assignExportOrdinals();
163166
void parseModuleDefs(StringRef path);

lld/COFF/Writer.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -1307,8 +1307,7 @@ void Writer::appendImportThunks() {
13071307
}
13081308

13091309
if (!delayIdata.empty()) {
1310-
Defined *helper = cast<Defined>(ctx.config.delayLoadHelper);
1311-
delayIdata.create(helper);
1310+
delayIdata.create();
13121311
for (Chunk *c : delayIdata.getChunks())
13131312
didatSec->addChunk(c);
13141313
for (Chunk *c : delayIdata.getDataChunks())

0 commit comments

Comments
 (0)