From aa4f4450af0b6e5406189679713b61f225d0ab1b Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 8 Dec 2016 18:49:04 +0000 Subject: [PATCH] Revert r289084: Start using make() in COFF. This reverts commit r289084 to appease buildbots. llvm-svn: 289086 --- lld/COFF/Driver.cpp | 19 ++++++++++--------- lld/COFF/Error.cpp | 9 +-------- lld/COFF/InputFiles.cpp | 17 ++++++++++------- lld/COFF/InputFiles.h | 4 ++-- lld/COFF/SymbolTable.cpp | 19 ++++++++++--------- lld/COFF/SymbolTable.h | 6 +++--- lld/COFF/Symbols.cpp | 13 ++++++------- 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 ba3f36a81c2f..fbdb2d0f4690 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 Args) { - Config = make(); - Driver = make(); + 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 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(MB); + return std::unique_ptr(new ArchiveFile(MB)); if (Magic == file_magic::bitcode) - return make(MB); + return std::unique_ptr(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(MB); + return std::unique_ptr(new ObjectFile(MB)); } static bool isDecorated(StringRef Sym) { @@ -571,7 +572,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 (InputFile *File : Symtab.getFiles()) { + for (std::unique_ptr &File : Symtab.getFiles()) { MachineTypes MT = File->getMachineType(); if (MT == IMAGE_FILE_MACHINE_UNKNOWN) continue; @@ -580,7 +581,7 @@ void LinkerDriver::link(llvm::ArrayRef 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 c0166336580c..80ca84219c54 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 -#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 0def6111c244..a00d76291039 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 #include #include @@ -98,10 +97,14 @@ MutableArrayRef 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 Bin = check(createBinary(MB), toString(this)); + + if (auto *Obj = dyn_cast(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 66e503938886..14aecd45be81 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 COFFObj; llvm::BumpPtrAllocator Alloc; const coff_section *SXData = nullptr; diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index 77d15e4c7eb5..c22126a219f2 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 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(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() << ": undefined symbol: " << U->getName() << "\n"; - for (InputFile *File : Files) - if (!isa(File)) + for (std::unique_ptr &File : Files) + if (!isa(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 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 SymbolTable::getChunks() { diff --git a/lld/COFF/SymbolTable.h b/lld/COFF/SymbolTable.h index a8644fd70e36..034fa130e075 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 &getFiles() { return Files; } + void addFile(std::unique_ptr File); + std::vector> &getFiles() { return Files; } void step(); void run(); bool queueEmpty(); @@ -111,7 +111,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 298791101243..564586231347 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 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(nullptr); file_magic Magic = identify_magic(MBRef.getBuffer()); if (Magic == file_magic::coff_import_library) - return make(MBRef); + return std::unique_ptr(new ImportFile(MBRef)); - InputFile *Obj; + std::unique_ptr Obj; if (Magic == file_magic::coff_object) - Obj = make(MBRef); + Obj.reset(new ObjectFile(MBRef)); else if (Magic == file_magic::bitcode) - Obj = make(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 1089fdcb7dc7..a38e7308842a 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 getMember(); int getFileIndex() { return File->Index; }