diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 8719c0fa1a1e..ba3f36a81c2f 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -68,7 +68,7 @@ MemoryBufferRef LinkerDriver::openFile(StringRef Path) { return MBRef; } -static std::unique_ptr createFile(MemoryBufferRef MB) { +static InputFile *createFile(MemoryBufferRef MB) { if (Driver->Cpio) Driver->Cpio->append(relativeToRoot(MB.getBufferIdentifier()), MB.getBuffer()); @@ -76,15 +76,15 @@ static std::unique_ptr createFile(MemoryBufferRef MB) { // File type is detected by contents, not by file extension. file_magic Magic = identify_magic(MB.getBuffer()); if (Magic == file_magic::archive) - return std::unique_ptr(new ArchiveFile(MB)); + return make(MB); if (Magic == file_magic::bitcode) - return std::unique_ptr(new BitcodeFile(MB)); + return make(MB); if (Magic == file_magic::coff_cl_gl_object) fatal(MB.getBufferIdentifier() + ": is not a native COFF file. " "Recompile without /GL"); if (Config->OutputFile == "") Config->OutputFile = getOutputPath(MB.getBufferIdentifier()); - return std::unique_ptr(new ObjectFile(MB)); + return make(MB); } static bool isDecorated(StringRef Sym) { @@ -571,7 +571,7 @@ void LinkerDriver::link(llvm::ArrayRef ArgsArr) { // Determine machine type and check if all object files are // for the same CPU type. Note that this needs to be done before // any call to mangle(). - for (std::unique_ptr &File : Symtab.getFiles()) { + for (InputFile *File : Symtab.getFiles()) { MachineTypes MT = File->getMachineType(); if (MT == IMAGE_FILE_MACHINE_UNKNOWN) continue; @@ -580,7 +580,7 @@ void LinkerDriver::link(llvm::ArrayRef ArgsArr) { continue; } if (Config->Machine != MT) - fatal(toString(File.get()) + ": machine type " + machineToStr(MT) + + fatal(toString(File) + ": machine type " + machineToStr(MT) + " conflicts with " + machineToStr(Config->Machine)); } if (Config->Machine == IMAGE_FILE_MACHINE_UNKNOWN) { diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index c22126a219f2..b90a5ae4f3ad 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -7,12 +7,13 @@ // //===----------------------------------------------------------------------===// +#include "SymbolTable.h" #include "Config.h" #include "Driver.h" #include "Error.h" -#include "SymbolTable.h" #include "Symbols.h" #include "lld/Core/Parallel.h" +#include "lld/Support/Memory.h" #include "llvm/IR/LLVMContext.h" #include "llvm/LTO/legacy/LTOCodeGenerator.h" #include "llvm/Support/Debug.h" @@ -24,15 +25,14 @@ using namespace llvm; namespace lld { namespace coff { -void SymbolTable::addFile(std::unique_ptr FileP) { +void SymbolTable::addFile(InputFile *File) { #if LLVM_ENABLE_THREADS std::launch Policy = std::launch::async; #else std::launch Policy = std::launch::deferred; #endif - InputFile *File = FileP.get(); - Files.push_back(std::move(FileP)); + Files.push_back(File); if (auto *F = dyn_cast(File)) { ArchiveQueue.push_back( std::async(Policy, [=]() { F->parse(); return F; })); @@ -156,11 +156,11 @@ void SymbolTable::reportRemainingUndefines(bool Resolve) { for (Undefined *U : Config->GCRoot) if (Undefs.count(U->repl())) llvm::errs() << ": undefined symbol: " << U->getName() << "\n"; - for (std::unique_ptr &File : Files) - if (!isa(File.get())) + for (InputFile *File : Files) + if (!isa(File)) for (SymbolBody *Sym : File->getSymbols()) if (Undefs.count(Sym->repl())) - llvm::errs() << toString(File.get()) + llvm::errs() << toString(File) << ": undefined symbol: " << Sym->getName() << "\n"; if (!Config->Force) fatal("link failed"); @@ -230,16 +230,16 @@ Symbol *SymbolTable::insert(SymbolBody *New) { // Reads an archive member file pointed by a given symbol. void SymbolTable::addMemberFile(Lazy *Body) { - std::unique_ptr File = Body->getMember(); + InputFile *File = Body->getMember(); // getMember returns an empty buffer if the member was already // read from the library. if (!File) return; if (Config->Verbose) - llvm::outs() << "Loaded " << toString(File.get()) << " for " - << Body->getName() << "\n"; - addFile(std::move(File)); + llvm::outs() << "Loaded " << toString(File) << " for " << Body->getName() + << "\n"; + addFile(File); } std::vector SymbolTable::getChunks() { diff --git a/lld/COFF/SymbolTable.h b/lld/COFF/SymbolTable.h index 034fa130e075..9c5264d777a8 100644 --- a/lld/COFF/SymbolTable.h +++ b/lld/COFF/SymbolTable.h @@ -32,6 +32,8 @@ namespace coff { class Chunk; class Defined; +class DefinedAbsolute; +class DefinedRelative; class Lazy; class SectionChunk; class SymbolBody; @@ -49,8 +51,8 @@ struct Symbol; // to replace the lazy symbol. The logic is implemented in resolve(). class SymbolTable { public: - void addFile(std::unique_ptr File); - std::vector> &getFiles() { return Files; } + void addFile(InputFile *File); + std::vector &getFiles() { return Files; } void step(); void run(); bool queueEmpty(); @@ -111,7 +113,7 @@ private: llvm::DenseMap Symtab; - std::vector> Files; + std::vector Files; std::vector> ArchiveQueue; std::vector> ObjectQueue; diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 564586231347..298791101243 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -11,6 +11,7 @@ #include "Error.h" #include "InputFiles.h" #include "Strings.h" +#include "lld/Support/Memory.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" @@ -181,23 +182,23 @@ DefinedImportThunk::DefinedImportThunk(StringRef Name, DefinedImportData *S, } } -std::unique_ptr Lazy::getMember() { +InputFile *Lazy::getMember() { MemoryBufferRef MBRef = File->getMember(&Sym); // getMember returns an empty buffer if the member was already // read from the library. if (MBRef.getBuffer().empty()) - return std::unique_ptr(nullptr); + return nullptr; file_magic Magic = identify_magic(MBRef.getBuffer()); if (Magic == file_magic::coff_import_library) - return std::unique_ptr(new ImportFile(MBRef)); + return make(MBRef); - std::unique_ptr Obj; + InputFile *Obj; if (Magic == file_magic::coff_object) - Obj.reset(new ObjectFile(MBRef)); + Obj = make(MBRef); else if (Magic == file_magic::bitcode) - Obj.reset(new BitcodeFile(MBRef)); + Obj = make(MBRef); else fatal("unknown file type: " + File->getName()); diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index a38e7308842a..1089fdcb7dc7 100644 --- a/lld/COFF/Symbols.h +++ b/lld/COFF/Symbols.h @@ -256,7 +256,7 @@ public: // Returns an object file for this symbol, or a nullptr if the file // was already returned. - std::unique_ptr getMember(); + InputFile *getMember(); int getFileIndex() { return File->Index; }