diff options
-rw-r--r-- | lld/COFF/Driver.cpp | 19 | ||||
-rw-r--r-- | lld/COFF/Error.cpp | 9 | ||||
-rw-r--r-- | lld/COFF/InputFiles.cpp | 17 | ||||
-rw-r--r-- | lld/COFF/InputFiles.h | 4 | ||||
-rw-r--r-- | lld/COFF/SymbolTable.cpp | 19 | ||||
-rw-r--r-- | lld/COFF/SymbolTable.h | 6 | ||||
-rw-r--r-- | lld/COFF/Symbols.cpp | 13 | ||||
-rw-r--r-- | lld/COFF/Symbols.h | 2 |
8 files changed, 43 insertions, 46 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index ba3f36a81c2..fbdb2d0f469 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -15,7 +15,6 @@ #include "Symbols.h" #include "Writer.h" #include "lld/Driver/Driver.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/LibDriver/LibDriver.h" @@ -44,8 +43,10 @@ Configuration *Config; LinkerDriver *Driver; bool link(llvm::ArrayRef<const char *> Args) { - Config = make<Configuration>(); - Driver = make<LinkerDriver>(); + Configuration C; + LinkerDriver D; + Config = &C; + Driver = &D; Driver->link(Args); return true; } @@ -68,7 +69,7 @@ MemoryBufferRef LinkerDriver::openFile(StringRef Path) { return MBRef; } -static InputFile *createFile(MemoryBufferRef MB) { +static std::unique_ptr<InputFile> createFile(MemoryBufferRef MB) { if (Driver->Cpio) Driver->Cpio->append(relativeToRoot(MB.getBufferIdentifier()), MB.getBuffer()); @@ -76,15 +77,15 @@ static InputFile *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 make<ArchiveFile>(MB); + return std::unique_ptr<InputFile>(new ArchiveFile(MB)); if (Magic == file_magic::bitcode) - return make<BitcodeFile>(MB); + return std::unique_ptr<InputFile>(new BitcodeFile(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 make<ObjectFile>(MB); + return std::unique_ptr<InputFile>(new ObjectFile(MB)); } static bool isDecorated(StringRef Sym) { @@ -571,7 +572,7 @@ void LinkerDriver::link(llvm::ArrayRef<const char *> 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 (InputFile *File : Symtab.getFiles()) { + for (std::unique_ptr<InputFile> &File : Symtab.getFiles()) { MachineTypes MT = File->getMachineType(); if (MT == IMAGE_FILE_MACHINE_UNKNOWN) continue; @@ -580,7 +581,7 @@ void LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) { continue; } if (Config->Machine != MT) - fatal(toString(File) + ": machine type " + machineToStr(MT) + + fatal(toString(File.get()) + ": machine type " + machineToStr(MT) + " conflicts with " + machineToStr(Config->Machine)); } if (Config->Machine == IMAGE_FILE_MACHINE_UNKNOWN) { diff --git a/lld/COFF/Error.cpp b/lld/COFF/Error.cpp index c0166336580..80ca84219c5 100644 --- a/lld/COFF/Error.cpp +++ b/lld/COFF/Error.cpp @@ -14,10 +14,6 @@ #include "llvm/Support/Process.h" #include "llvm/Support/raw_ostream.h" -#if !defined(_MSC_VER) && !defined(__MINGW32__) -#include <unistd.h> -#endif - using namespace llvm; namespace lld { @@ -33,10 +29,7 @@ void fatal(const Twine &Msg) { } errs() << Msg << "\n"; - - outs().flush(); - errs().flush(); - _exit(1); + exit(1); } void fatal(std::error_code EC, const Twine &Msg) { diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 0def6111c24..a00d7629103 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -7,14 +7,12 @@ // //===----------------------------------------------------------------------===// -#include "InputFiles.h" #include "Chunks.h" #include "Config.h" #include "Driver.h" #include "Error.h" +#include "InputFiles.h" #include "Symbols.h" -#include "lld/Support/Memory.h" -#include "llvm-c/lto.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Triple.h" #include "llvm/ADT/Twine.h" @@ -29,6 +27,7 @@ #include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" #include "llvm/Target/TargetOptions.h" +#include "llvm-c/lto.h" #include <cstring> #include <system_error> #include <utility> @@ -98,10 +97,14 @@ MutableArrayRef<Lazy> ArchiveFile::getLazySymbols() { return LazySymbols; } void ObjectFile::parse() { // Parse a memory buffer as a COFF file. - std::error_code EC; - COFFObj = new COFFObjectFile(MB, EC); - if (EC) - fatal(EC, "failed to parse object"); + std::unique_ptr<Binary> Bin = check(createBinary(MB), toString(this)); + + if (auto *Obj = dyn_cast<COFFObjectFile>(Bin.get())) { + Bin.release(); + COFFObj.reset(Obj); + } else { + fatal(toString(this) + " is not a COFF file"); + } // Read section and symbol tables. initializeChunks(); diff --git a/lld/COFF/InputFiles.h b/lld/COFF/InputFiles.h index 66e50393888..14aecd45be8 100644 --- a/lld/COFF/InputFiles.h +++ b/lld/COFF/InputFiles.h @@ -127,7 +127,7 @@ public: } // Returns the underying COFF file. - COFFObjectFile *getCOFFObj() { return COFFObj; } + COFFObjectFile *getCOFFObj() { return COFFObj.get(); } // True if this object file is compatible with SEH. // COFF-specific and x86-only. @@ -145,7 +145,7 @@ private: Defined *createDefined(COFFSymbolRef Sym, const void *Aux, bool IsFirst); Undefined *createUndefined(COFFSymbolRef Sym); - COFFObjectFile *COFFObj; + std::unique_ptr<COFFObjectFile> COFFObj; llvm::BumpPtrAllocator Alloc; const coff_section *SXData = nullptr; diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index 77d15e4c7eb..c22126a219f 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -24,14 +24,15 @@ using namespace llvm; namespace lld { namespace coff { -void SymbolTable::addFile(InputFile *File) { +void SymbolTable::addFile(std::unique_ptr<InputFile> FileP) { #if LLVM_ENABLE_THREADS std::launch Policy = std::launch::async; #else std::launch Policy = std::launch::deferred; #endif - Files.push_back(File); + InputFile *File = FileP.get(); + Files.push_back(std::move(FileP)); if (auto *F = dyn_cast<ArchiveFile>(File)) { ArchiveQueue.push_back( std::async(Policy, [=]() { F->parse(); return F; })); @@ -155,11 +156,11 @@ void SymbolTable::reportRemainingUndefines(bool Resolve) { for (Undefined *U : Config->GCRoot) if (Undefs.count(U->repl())) llvm::errs() << "<root>: undefined symbol: " << U->getName() << "\n"; - for (InputFile *File : Files) - if (!isa<ArchiveFile>(File)) + for (std::unique_ptr<InputFile> &File : Files) + if (!isa<ArchiveFile>(File.get())) for (SymbolBody *Sym : File->getSymbols()) if (Undefs.count(Sym->repl())) - llvm::errs() << toString(File) + llvm::errs() << toString(File.get()) << ": undefined symbol: " << Sym->getName() << "\n"; if (!Config->Force) fatal("link failed"); @@ -229,16 +230,16 @@ Symbol *SymbolTable::insert(SymbolBody *New) { // Reads an archive member file pointed by a given symbol. void SymbolTable::addMemberFile(Lazy *Body) { - InputFile *File = Body->getMember(); + std::unique_ptr<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) << " for " << Body->getName() - << "\n"; - addFile(File); + llvm::outs() << "Loaded " << toString(File.get()) << " for " + << Body->getName() << "\n"; + addFile(std::move(File)); } std::vector<Chunk *> SymbolTable::getChunks() { diff --git a/lld/COFF/SymbolTable.h b/lld/COFF/SymbolTable.h index a8644fd70e3..034fa130e07 100644 --- a/lld/COFF/SymbolTable.h +++ b/lld/COFF/SymbolTable.h @@ -49,8 +49,8 @@ struct Symbol; // to replace the lazy symbol. The logic is implemented in resolve(). class SymbolTable { public: - void addFile(InputFile *File); - std::vector<InputFile *> &getFiles() { return Files; } + void addFile(std::unique_ptr<InputFile> File); + std::vector<std::unique_ptr<InputFile>> &getFiles() { return Files; } void step(); void run(); bool queueEmpty(); @@ -111,7 +111,7 @@ private: llvm::DenseMap<StringRef, Symbol *> Symtab; - std::vector<InputFile *> Files; + std::vector<std::unique_ptr<InputFile>> Files; std::vector<std::future<ArchiveFile *>> ArchiveQueue; std::vector<std::future<InputFile *>> ObjectQueue; diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 29879110124..56458623134 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -11,7 +11,6 @@ #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" @@ -182,23 +181,23 @@ DefinedImportThunk::DefinedImportThunk(StringRef Name, DefinedImportData *S, } } -InputFile *Lazy::getMember() { +std::unique_ptr<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 nullptr; + return std::unique_ptr<InputFile>(nullptr); file_magic Magic = identify_magic(MBRef.getBuffer()); if (Magic == file_magic::coff_import_library) - return make<ImportFile>(MBRef); + return std::unique_ptr<InputFile>(new ImportFile(MBRef)); - InputFile *Obj; + std::unique_ptr<InputFile> Obj; if (Magic == file_magic::coff_object) - Obj = make<ObjectFile>(MBRef); + Obj.reset(new ObjectFile(MBRef)); else if (Magic == file_magic::bitcode) - Obj = make<BitcodeFile>(MBRef); + Obj.reset(new BitcodeFile(MBRef)); else fatal("unknown file type: " + File->getName()); diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index 1089fdcb7dc..a38e7308842 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. - InputFile *getMember(); + std::unique_ptr<InputFile> getMember(); int getFileIndex() { return File->Index; } |