COFF: Simplify Writer::createImportTables.
A short import library has up to two symbols, so we don't have
to do a for-loop and type dispatch in createImportTables.
llvm-svn: 245200
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 538b6bb..871c40c 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -298,16 +298,16 @@
ExtName = ExtName.substr(0, ExtName.find('@'));
break;
}
- auto *ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, ExtName, Hdr);
+ ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, ExtName, Hdr);
SymbolBodies.push_back(ImpSym);
// If type is function, we need to create a thunk which jump to an
// address pointed by the __imp_ symbol. (This allows you to call
// DLL functions just like regular non-DLL functions.)
- if (Hdr->getType() == llvm::COFF::IMPORT_CODE) {
- auto *B = new (Alloc) DefinedImportThunk(Name, ImpSym, Hdr->Machine);
- SymbolBodies.push_back(B);
- }
+ if (Hdr->getType() != llvm::COFF::IMPORT_CODE)
+ return;
+ ThunkSym = new (Alloc) DefinedImportThunk(Name, ImpSym, Hdr->Machine);
+ SymbolBodies.push_back(ThunkSym);
}
void BitcodeFile::parse() {
diff --git a/lld/COFF/InputFiles.h b/lld/COFF/InputFiles.h
index d93b2b6..e2e80f1 100644
--- a/lld/COFF/InputFiles.h
+++ b/lld/COFF/InputFiles.h
@@ -33,6 +33,8 @@
class Chunk;
class Defined;
+class DefinedImportData;
+class DefinedImportThunk;
class Lazy;
class SymbolBody;
class Undefined;
@@ -182,6 +184,9 @@
static bool classof(const InputFile *F) { return F->kind() == ImportKind; }
std::vector<SymbolBody *> &getSymbols() override { return SymbolBodies; }
+ DefinedImportData *ImpSym = nullptr;
+ DefinedImportThunk *ThunkSym = nullptr;
+
private:
void parse() override;
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 87a74f4..deceb60 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -367,19 +367,13 @@
return;
OutputSection *Text = createSection(".text");
for (ImportFile *File : Symtab->ImportFiles) {
- for (SymbolBody *B : File->getSymbols()) {
- auto *Import = dyn_cast<DefinedImportData>(B);
- if (!Import) {
- // Linker-created function thunks for DLL symbols are added to
- // .text section.
- Text->addChunk(cast<DefinedImportThunk>(B)->getChunk());
- continue;
- }
- if (Config->DelayLoads.count(Import->getDLLName().lower())) {
- DelayIdata.add(Import);
- } else {
- Idata.add(Import);
- }
+ if (DefinedImportThunk *Thunk = File->ThunkSym)
+ Text->addChunk(Thunk->getChunk());
+ DefinedImportData *Imp = File->ImpSym;
+ if (Config->DelayLoads.count(Imp->getDLLName().lower())) {
+ DelayIdata.add(Imp);
+ } else {
+ Idata.add(Imp);
}
}
if (!Idata.empty()) {