From e73e418bb454b6d6e936b8c2591d0d4e827dcaba Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Mon, 17 Aug 2015 07:27:45 +0000 Subject: [PATCH] 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 --- lld/COFF/InputFiles.cpp | 10 +++++----- lld/COFF/InputFiles.h | 5 +++++ lld/COFF/Writer.cpp | 20 +++++++------------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 538b6bbcdfbc..871c40c8423f 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -298,16 +298,16 @@ void ImportFile::parse() { 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 d93b2b6adb4d..e2e80f11e573 100644 --- a/lld/COFF/InputFiles.h +++ b/lld/COFF/InputFiles.h @@ -33,6 +33,8 @@ using llvm::object::coff_section; class Chunk; class Defined; +class DefinedImportData; +class DefinedImportThunk; class Lazy; class SymbolBody; class Undefined; @@ -182,6 +184,9 @@ public: static bool classof(const InputFile *F) { return F->kind() == ImportKind; } std::vector &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 87a74f46ff2d..deceb6078db2 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -367,19 +367,13 @@ void Writer::createImportTables() { return; OutputSection *Text = createSection(".text"); for (ImportFile *File : Symtab->ImportFiles) { - for (SymbolBody *B : File->getSymbols()) { - auto *Import = dyn_cast(B); - if (!Import) { - // Linker-created function thunks for DLL symbols are added to - // .text section. - Text->addChunk(cast(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()) {