diff options
-rw-r--r-- | lld/ELF/Error.cpp | 12 | ||||
-rw-r--r-- | lld/ELF/Error.h | 1 | ||||
-rw-r--r-- | lld/ELF/InputFiles.cpp | 12 | ||||
-rw-r--r-- | lld/ELF/InputFiles.h | 18 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 8 |
5 files changed, 36 insertions, 15 deletions
diff --git a/lld/ELF/Error.cpp b/lld/ELF/Error.cpp index 6c9fb090694..bbe9fa1759c 100644 --- a/lld/ELF/Error.cpp +++ b/lld/ELF/Error.cpp @@ -14,6 +14,10 @@ #include "llvm/Support/Error.h" #include "llvm/Support/raw_ostream.h" +#if !defined(_MSC_VER) && !defined(__MINGW32__) +#include <unistd.h> +#endif + using namespace llvm; namespace lld { @@ -43,9 +47,15 @@ void elf::error(std::error_code EC, const Twine &Prefix) { error(Prefix + ": " + EC.message()); } +void elf::exitLld(int Val) { + outs().flush(); + errs().flush(); + _exit(Val); +} + void elf::fatal(const Twine &Msg) { *ErrorOS << Argv0 << ": error: " << Msg << "\n"; - exit(1); + exitLld(1); } void elf::fatal(std::error_code EC, const Twine &Prefix) { diff --git a/lld/ELF/Error.h b/lld/ELF/Error.h index 6cb954820d5..5776d835467 100644 --- a/lld/ELF/Error.h +++ b/lld/ELF/Error.h @@ -45,6 +45,7 @@ template <typename T> void error(const ErrorOr<T> &V, const Twine &Prefix) { error(V.getError(), Prefix); } +LLVM_ATTRIBUTE_NORETURN void exitLld(int Val); LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg); LLVM_ATTRIBUTE_NORETURN void fatal(std::error_code EC, const Twine &Prefix); diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 507090d563d..b0c177fc48c 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -386,7 +386,8 @@ elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec) { // If -r is given, we do not interpret or apply relocation // but just copy relocation sections to output. if (Config->Relocatable) - return new (IAlloc.Allocate()) InputSection<ELFT>(this, &Sec, Name); + return new (GAlloc<ELFT>::IAlloc.Allocate()) + InputSection<ELFT>(this, &Sec, Name); // Find the relocation target section and associate this // section with it. @@ -428,11 +429,14 @@ elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec) { // .eh_frame_hdr section for runtime. So we handle them with a special // class. For relocatable outputs, they are just passed through. if (Name == ".eh_frame" && !Config->Relocatable) - return new (EHAlloc.Allocate()) EhInputSection<ELFT>(this, &Sec, Name); + return new (GAlloc<ELFT>::EHAlloc.Allocate()) + EhInputSection<ELFT>(this, &Sec, Name); if (shouldMerge(Sec)) - return new (MAlloc.Allocate()) MergeInputSection<ELFT>(this, &Sec, Name); - return new (IAlloc.Allocate()) InputSection<ELFT>(this, &Sec, Name); + return new (GAlloc<ELFT>::MAlloc.Allocate()) + MergeInputSection<ELFT>(this, &Sec, Name); + return new (GAlloc<ELFT>::IAlloc.Allocate()) + InputSection<ELFT>(this, &Sec, Name); } template <class ELFT> void elf::ObjectFile<ELFT>::initializeSymbols() { diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index ca232fc5451..083e86772b8 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -38,6 +38,21 @@ class InputFile; namespace lld { namespace elf { +template <class ELFT> struct GAlloc { + static llvm::SpecificBumpPtrAllocator<InputSection<ELFT>> IAlloc; + static llvm::SpecificBumpPtrAllocator<MergeInputSection<ELFT>> MAlloc; + static llvm::SpecificBumpPtrAllocator<EhInputSection<ELFT>> EHAlloc; +}; + +template <class ELFT> +llvm::SpecificBumpPtrAllocator<InputSection<ELFT>> GAlloc<ELFT>::IAlloc; + +template <class ELFT> +llvm::SpecificBumpPtrAllocator<MergeInputSection<ELFT>> GAlloc<ELFT>::MAlloc; + +template <class ELFT> +llvm::SpecificBumpPtrAllocator<EhInputSection<ELFT>> GAlloc<ELFT>::EHAlloc; + using llvm::object::Archive; class InputFile; @@ -233,9 +248,6 @@ private: // MIPS .MIPS.abiflags section defined by this file. std::unique_ptr<MipsAbiFlagsInputSection<ELFT>> MipsAbiFlags; - llvm::SpecificBumpPtrAllocator<InputSection<ELFT>> IAlloc; - llvm::SpecificBumpPtrAllocator<MergeInputSection<ELFT>> MAlloc; - llvm::SpecificBumpPtrAllocator<EhInputSection<ELFT>> EHAlloc; std::unique_ptr<DIHelper<ELFT>> DIH; }; diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index a280194ee5d..8a39398587b 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -23,10 +23,6 @@ #include "llvm/Support/raw_ostream.h" #include <climits> -#if !defined(_MSC_VER) && !defined(__MINGW32__) -#include <unistd.h> -#endif - using namespace llvm; using namespace llvm::ELF; using namespace llvm::object; @@ -324,9 +320,7 @@ template <class ELFT> void Writer<ELFT>::run() { // Flush the output streams and exit immediately. A full shutdown is a good // test that we are keeping track of all allocated memory, but actually // freeing it is a waste of time in a regular linker run. - outs().flush(); - errs().flush(); - _exit(0); + exitLld(0); } } |