diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index cfc20e404a88..73ef3885fbab 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -55,9 +55,13 @@ std::vector SpecificAllocBase::Instances; bool link(ArrayRef Args, raw_ostream &Diag) { ErrorCount = 0; ErrorOS = &Diag; + Config = make(); Config->Argv = {Args.begin(), Args.end()}; Config->ColorDiagnostics = ErrorOS->has_colors(); + + Symtab = make(); + Driver = make(); Driver->link(Args); return !ErrorCount; @@ -118,15 +122,15 @@ void LinkerDriver::addBuffer(std::unique_ptr MB) { FilePaths.push_back(MBRef.getBufferIdentifier()); if (Magic == file_magic::archive) - return Symtab.addFile(make(MBRef)); + return Symtab->addFile(make(MBRef)); if (Magic == file_magic::bitcode) - return Symtab.addFile(make(MBRef)); + return Symtab->addFile(make(MBRef)); if (Magic == file_magic::coff_cl_gl_object) error(MBRef.getBufferIdentifier() + ": is not a native COFF file. " "Recompile without /GL"); else - Symtab.addFile(make(MBRef)); + Symtab->addFile(make(MBRef)); } void LinkerDriver::enqueuePath(StringRef Path) { @@ -146,7 +150,7 @@ void LinkerDriver::addArchiveBuffer(MemoryBufferRef MB, StringRef SymName, StringRef ParentName) { file_magic Magic = identify_magic(MB.getBuffer()); if (Magic == file_magic::coff_import_library) { - Symtab.addFile(make(MB)); + Symtab->addFile(make(MB)); return; } @@ -161,7 +165,7 @@ void LinkerDriver::addArchiveBuffer(MemoryBufferRef MB, StringRef SymName, } Obj->ParentName = ParentName; - Symtab.addFile(Obj); + Symtab->addFile(Obj); log("Loaded " + toString(Obj) + " for " + SymName); } @@ -314,7 +318,7 @@ void LinkerDriver::addLibSearchPaths() { } SymbolBody *LinkerDriver::addUndefined(StringRef Name) { - SymbolBody *B = Symtab.addUndefined(Name); + SymbolBody *B = Symtab->addUndefined(Name); Config->GCRoot.insert(B); return B; } @@ -337,8 +341,8 @@ StringRef LinkerDriver::findDefaultEntry() { {"wWinMain", "wWinMainCRTStartup"}, }; for (auto E : Entries) { - StringRef Entry = Symtab.findMangle(mangle(E[0])); - if (!Entry.empty() && !isa(Symtab.find(Entry)->body())) + StringRef Entry = Symtab->findMangle(mangle(E[0])); + if (!Entry.empty() && !isa(Symtab->find(Entry)->body())) return mangle(E[1]); } return ""; @@ -347,9 +351,9 @@ StringRef LinkerDriver::findDefaultEntry() { WindowsSubsystem LinkerDriver::inferSubsystem() { if (Config->DLL) return IMAGE_SUBSYSTEM_WINDOWS_GUI; - if (Symtab.findUnderscore("main") || Symtab.findUnderscore("wmain")) + if (Symtab->findUnderscore("main") || Symtab->findUnderscore("wmain")) return IMAGE_SUBSYSTEM_WINDOWS_CUI; - if (Symtab.findUnderscore("WinMain") || Symtab.findUnderscore("wWinMain")) + if (Symtab->findUnderscore("WinMain") || Symtab->findUnderscore("wWinMain")) return IMAGE_SUBSYSTEM_WINDOWS_GUI; return IMAGE_SUBSYSTEM_UNKNOWN; } @@ -654,7 +658,7 @@ void LinkerDriver::invokeMSVC(opt::InputArgList &Args) { } } - std::vector ObjFiles = Symtab.compileBitcodeFiles(); + std::vector ObjFiles = Symtab->compileBitcodeFiles(); runMSVCLinker(Rsp, ObjFiles); for (StringRef Path : Temps) @@ -1071,21 +1075,21 @@ void LinkerDriver::link(ArrayRef ArgsArr) { if (Config->ImageBase == uint64_t(-1)) Config->ImageBase = getDefaultImageBase(); - Symtab.addSynthetic(mangle("__ImageBase"), nullptr); + Symtab->addSynthetic(mangle("__ImageBase"), nullptr); if (Config->Machine == I386) { - Symtab.addAbsolute("___safe_se_handler_table", 0); - Symtab.addAbsolute("___safe_se_handler_count", 0); + Symtab->addAbsolute("___safe_se_handler_table", 0); + Symtab->addAbsolute("___safe_se_handler_count", 0); } // We do not support /guard:cf (control flow protection) yet. // Define CFG symbols anyway so that we can link MSVC 2015 CRT. - Symtab.addAbsolute(mangle("__guard_fids_count"), 0); - Symtab.addAbsolute(mangle("__guard_fids_table"), 0); - Symtab.addAbsolute(mangle("__guard_flags"), 0x100); - Symtab.addAbsolute(mangle("__guard_iat_count"), 0); - Symtab.addAbsolute(mangle("__guard_iat_table"), 0); - Symtab.addAbsolute(mangle("__guard_longjmp_count"), 0); - Symtab.addAbsolute(mangle("__guard_longjmp_table"), 0); + Symtab->addAbsolute(mangle("__guard_fids_count"), 0); + Symtab->addAbsolute(mangle("__guard_fids_table"), 0); + Symtab->addAbsolute(mangle("__guard_flags"), 0x100); + Symtab->addAbsolute(mangle("__guard_iat_count"), 0); + Symtab->addAbsolute(mangle("__guard_iat_table"), 0); + Symtab->addAbsolute(mangle("__guard_longjmp_count"), 0); + Symtab->addAbsolute(mangle("__guard_longjmp_table"), 0); // This code may add new undefined symbols to the link, which may enqueue more // symbol resolution tasks, so we need to continue executing tasks until we @@ -1094,7 +1098,7 @@ void LinkerDriver::link(ArrayRef ArgsArr) { // Windows specific -- if entry point is not found, // search for its mangled names. if (Config->Entry) - Symtab.mangleMaybe(Config->Entry); + Symtab->mangleMaybe(Config->Entry); // Windows specific -- Make sure we resolve all dllexported symbols. for (Export &E : Config->Exports) { @@ -1102,7 +1106,7 @@ void LinkerDriver::link(ArrayRef ArgsArr) { continue; E.Sym = addUndefined(E.Name); if (!E.Directives) - Symtab.mangleMaybe(E.Sym); + Symtab->mangleMaybe(E.Sym); } // Add weak aliases. Weak aliases is a mechanism to give remaining @@ -1110,16 +1114,16 @@ void LinkerDriver::link(ArrayRef ArgsArr) { for (auto Pair : Config->AlternateNames) { StringRef From = Pair.first; StringRef To = Pair.second; - Symbol *Sym = Symtab.find(From); + Symbol *Sym = Symtab->find(From); if (!Sym) continue; if (auto *U = dyn_cast(Sym->body())) if (!U->WeakAlias) - U->WeakAlias = Symtab.addUndefined(To); + U->WeakAlias = Symtab->addUndefined(To); } // Windows specific -- if __load_config_used can be resolved, resolve it. - if (Symtab.findUnderscore("_load_config_used")) + if (Symtab->findUnderscore("_load_config_used")) addUndefined(mangle("_load_config_used")); } while (run()); @@ -1135,11 +1139,11 @@ void LinkerDriver::link(ArrayRef ArgsArr) { // Do LTO by compiling bitcode input files to a set of native COFF files then // link those files. - Symtab.addCombinedLTOObjects(); + Symtab->addCombinedLTOObjects(); run(); // Make sure we have resolved all symbols. - Symtab.reportRemainingUndefines(); + Symtab->reportRemainingUndefines(); // Windows specific -- if no /subsystem is given, we need to infer // that from entry point name. @@ -1170,7 +1174,7 @@ void LinkerDriver::link(ArrayRef ArgsArr) { for (auto Pair : Config->AlignComm) { StringRef Name = Pair.first; int Align = Pair.second; - Symbol *Sym = Symtab.find(Name); + Symbol *Sym = Symtab->find(Name); if (!Sym) { warn("/aligncomm symbol " + Name + " not found"); continue; @@ -1189,14 +1193,14 @@ void LinkerDriver::link(ArrayRef ArgsArr) { // Identify unreferenced COMDAT sections. if (Config->DoGC) - markLive(Symtab.getChunks()); + markLive(Symtab->getChunks()); // Identify identical COMDAT sections to merge them. if (Config->DoICF) - doICF(Symtab.getChunks()); + doICF(Symtab->getChunks()); // Write the result. - writeResult(&Symtab); + writeResult(); // Call exit to avoid calling destructors. exit(0); diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h index f5b04366b52d..c580140e88a3 100644 --- a/lld/COFF/Driver.h +++ b/lld/COFF/Driver.h @@ -66,7 +66,6 @@ private: class LinkerDriver { public: - LinkerDriver() { coff::Symtab = &Symtab; } void link(llvm::ArrayRef Args); // Used by the resolver to parse .drectve section contents. @@ -77,8 +76,6 @@ public: StringRef ParentName); private: - SymbolTable Symtab; - std::unique_ptr Tar; // for /linkrepro // Opens a file. Path has to be resolved already. diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index c6f9625a146b..1a55a0f6b765 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -108,7 +108,6 @@ public: // The writer writes a SymbolTable result to a file. class Writer { public: - Writer(SymbolTable *T) : Symtab(T) {} void run(); private: @@ -138,7 +137,6 @@ private: uint32_t getSizeOfInitializedData(); std::map> binImports(); - SymbolTable *Symtab; std::unique_ptr Buffer; std::vector OutputSections; std::vector Strtab; @@ -164,7 +162,7 @@ private: namespace lld { namespace coff { -void writeResult(SymbolTable *T) { Writer(T).run(); } +void writeResult() { Writer().run(); } void OutputSection::setRVA(uint64_t RVA) { Header.VirtualAddress = RVA; diff --git a/lld/COFF/Writer.h b/lld/COFF/Writer.h index fef575423878..e423a8e8097e 100644 --- a/lld/COFF/Writer.h +++ b/lld/COFF/Writer.h @@ -18,11 +18,9 @@ namespace lld { namespace coff { -class SymbolTable; - static const int PageSize = 4096; -void writeResult(SymbolTable *T); +void writeResult(); // OutputSection represents a section in an output file. It's a // container of chunks. OutputSection and Chunk are 1:N relationship.