[LLD][COFF] Move delayLoadHelper and tailMergeUnwindInfoChunk to SymbolTable (NFC) (#124729)
In preparation for ARM64X delay-load import support (#124600).
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user