[LLD][COFF] Move delayLoadHelper and tailMergeUnwindInfoChunk to SymbolTable (NFC) (#124729)

In preparation for ARM64X delay-load import support (#124600).
This commit is contained in:
Jacek Caban
2025-01-28 12:07:35 +01:00
committed by GitHub
parent db6fa74dfe
commit 97aa56ada5
6 changed files with 31 additions and 38 deletions

View File

@@ -164,7 +164,6 @@ struct Configuration {
bool noimplib = false;
std::set<std::string> delayLoads;
std::map<std::string, int> dllOrder;
Symbol *delayLoadHelper = nullptr;
Symbol *arm64ECIcallHelper = nullptr;
llvm::DenseSet<llvm::StringRef> saveTempsArgs;

View File

@@ -911,12 +911,9 @@ uint64_t DelayLoadContents::getDirSize() {
return dirs.size() * sizeof(delay_import_directory_table_entry);
}
void DelayLoadContents::create(Defined *h) {
helper = h;
void DelayLoadContents::create() {
std::vector<std::vector<DefinedImportData *>> v = binImports(ctx, imports);
Chunk *unwind = newTailMergeUnwindInfoChunk();
// Create .didat contents for each DLL.
for (std::vector<DefinedImportData *> &syms : v) {
// Create the delay import table header.
@@ -924,8 +921,8 @@ void DelayLoadContents::create(Defined *h) {
auto *dir = make<DelayDirectoryChunk>(dllNames.back());
size_t base = addresses.size();
Chunk *tm = newTailMergeChunk(dir);
Chunk *pdataChunk = unwind ? newTailMergePDataChunk(tm, unwind) : nullptr;
Chunk *tm = newTailMergeChunk(ctx.symtab, dir);
Chunk *pdataChunk = newTailMergePDataChunk(ctx.symtab, tm);
for (DefinedImportData *s : syms) {
Chunk *t = newThunkChunk(s, tm);
auto *a = make<DelayAddressChunk>(ctx, t);
@@ -982,15 +979,18 @@ void DelayLoadContents::create(Defined *h) {
dirs.push_back(dir);
}
if (unwind)
unwindinfo.push_back(unwind);
ctx.forEachSymtab([&](SymbolTable &symtab) {
if (symtab.tailMergeUnwindInfoChunk)
unwindinfo.push_back(symtab.tailMergeUnwindInfoChunk);
});
// Add null terminator.
dirs.push_back(
make<NullChunk>(sizeof(delay_import_directory_table_entry), 4));
}
Chunk *DelayLoadContents::newTailMergeChunk(Chunk *dir) {
switch (ctx.config.machine) {
Chunk *DelayLoadContents::newTailMergeChunk(SymbolTable &symtab, Chunk *dir) {
auto helper = cast<Defined>(symtab.delayLoadHelper);
switch (symtab.machine) {
case AMD64:
case ARM64EC:
return make<TailMergeChunkX64>(dir, helper);
@@ -1005,21 +1005,14 @@ Chunk *DelayLoadContents::newTailMergeChunk(Chunk *dir) {
}
}
Chunk *DelayLoadContents::newTailMergeUnwindInfoChunk() {
switch (ctx.config.machine) {
Chunk *DelayLoadContents::newTailMergePDataChunk(SymbolTable &symtab,
Chunk *tm) {
switch (symtab.machine) {
case AMD64:
case ARM64EC:
return make<TailMergeUnwindInfoX64>();
// FIXME: Add support for other architectures.
default:
return nullptr; // Just don't generate unwind info.
}
}
Chunk *DelayLoadContents::newTailMergePDataChunk(Chunk *tm, Chunk *unwind) {
switch (ctx.config.machine) {
case AMD64:
case ARM64EC:
return make<TailMergePDataChunkX64>(tm, unwind);
if (!symtab.tailMergeUnwindInfoChunk)
symtab.tailMergeUnwindInfoChunk = make<TailMergeUnwindInfoX64>();
return make<TailMergePDataChunkX64>(tm, symtab.tailMergeUnwindInfoChunk);
// FIXME: Add support for other architectures.
default:
return nullptr; // Just don't generate unwind info.
@@ -1028,7 +1021,7 @@ Chunk *DelayLoadContents::newTailMergePDataChunk(Chunk *tm, Chunk *unwind) {
Chunk *DelayLoadContents::newThunkChunk(DefinedImportData *s,
Chunk *tailMerge) {
switch (ctx.config.machine) {
switch (s->file->getMachineType()) {
case AMD64:
case ARM64EC:
return make<ThunkChunkX64>(s, tailMerge);

View File

@@ -42,7 +42,7 @@ public:
DelayLoadContents(COFFLinkerContext &ctx) : ctx(ctx) {}
void add(DefinedImportData *sym) { imports.push_back(sym); }
bool empty() { return imports.empty(); }
void create(Defined *helper);
void create();
std::vector<Chunk *> getChunks();
std::vector<Chunk *> getDataChunks();
ArrayRef<Chunk *> getCodeChunks() { return thunks; }
@@ -56,11 +56,9 @@ public:
private:
Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
Chunk *newTailMergeChunk(Chunk *dir);
Chunk *newTailMergePDataChunk(Chunk *tm, Chunk *unwind);
Chunk *newTailMergeUnwindInfoChunk();
Chunk *newTailMergeChunk(SymbolTable &symtab, Chunk *dir);
Chunk *newTailMergePDataChunk(SymbolTable &symtab, Chunk *tm);
Defined *helper;
std::vector<DefinedImportData *> imports;
std::vector<Chunk *> dirs;
std::vector<Chunk *> moduleHandles;

View File

@@ -2353,12 +2353,13 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
llvm::TimeTraceScope timeScope("Delay load");
for (auto *arg : args.filtered(OPT_delayload)) {
config->delayLoads.insert(StringRef(arg->getValue()).lower());
if (config->machine == I386) {
config->delayLoadHelper = ctx.symtab.addGCRoot("___delayLoadHelper2@8");
} else {
config->delayLoadHelper =
ctx.symtab.addGCRoot("__delayLoadHelper2", true);
}
ctx.forEachSymtab([&](SymbolTable &symtab) {
if (symtab.machine == I386) {
symtab.delayLoadHelper = symtab.addGCRoot("___delayLoadHelper2@8");
} else {
symtab.delayLoadHelper = symtab.addGCRoot("__delayLoadHelper2", true);
}
});
}
}

View File

@@ -158,6 +158,9 @@ public:
Chunk *edataStart = nullptr;
Chunk *edataEnd = nullptr;
Symbol *delayLoadHelper = nullptr;
Chunk *tailMergeUnwindInfoChunk = nullptr;
void fixupExports();
void assignExportOrdinals();
void parseModuleDefs(StringRef path);

View File

@@ -1307,8 +1307,7 @@ void Writer::appendImportThunks() {
}
if (!delayIdata.empty()) {
Defined *helper = cast<Defined>(ctx.config.delayLoadHelper);
delayIdata.create(helper);
delayIdata.create();
for (Chunk *c : delayIdata.getChunks())
didatSec->addChunk(c);
for (Chunk *c : delayIdata.getDataChunks())