From 9381eb104563cacdded3c4597d0845707b02737e Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sun, 18 Dec 2016 14:06:06 +0000 Subject: [PATCH] Remove lld/Support/Memory.h. I thought for a while about how to remove it, but it looks like we can just copy the file for now. Of course I'm not happy about that, but it's just less than 50 lines of code, and we already have duplicate code in Error.h and some other places. I want to solve them all at once later. Differential Revision: https://reviews.llvm.org/D27819 llvm-svn: 290062 --- lld/COFF/CMakeLists.txt | 1 - lld/COFF/Driver.cpp | 6 ++- lld/COFF/DriverUtils.cpp | 2 +- lld/COFF/InputFiles.cpp | 6 +-- lld/COFF/Memory.h | 52 +++++++++++++++++++++++++ lld/COFF/ModuleDef.cpp | 2 +- lld/COFF/SymbolTable.cpp | 2 +- lld/COFF/Symbols.cpp | 2 +- lld/COFF/Symbols.h | 2 +- lld/COFF/Writer.cpp | 2 +- lld/ELF/CMakeLists.txt | 1 - lld/ELF/Driver.cpp | 6 ++- lld/ELF/DriverUtils.cpp | 2 +- lld/ELF/InputFiles.cpp | 2 +- lld/ELF/InputSection.cpp | 2 +- lld/ELF/LinkerScript.cpp | 2 +- lld/ELF/Memory.h | 67 ++++++++++++++++++++++++++++++++ lld/ELF/OutputSections.cpp | 2 +- lld/ELF/SymbolTable.cpp | 2 +- lld/ELF/SyntheticSections.cpp | 2 +- lld/ELF/Target.cpp | 2 +- lld/ELF/Thunks.cpp | 2 +- lld/ELF/Writer.cpp | 2 +- lld/include/lld/Support/Memory.h | 8 +++- lld/lib/CMakeLists.txt | 1 - lld/lib/Support/CMakeLists.txt | 9 ----- lld/lib/Support/Memory.cpp | 27 ------------- 27 files changed, 154 insertions(+), 62 deletions(-) create mode 100644 lld/COFF/Memory.h create mode 100644 lld/ELF/Memory.h delete mode 100644 lld/lib/Support/CMakeLists.txt delete mode 100644 lld/lib/Support/Memory.cpp diff --git a/lld/COFF/CMakeLists.txt b/lld/COFF/CMakeLists.txt index a0ff9c528408..70a33b9fdd81 100644 --- a/lld/COFF/CMakeLists.txt +++ b/lld/COFF/CMakeLists.txt @@ -40,7 +40,6 @@ add_lld_library(lldCOFF LINK_LIBS lldCore - lldSupport ${PTHREAD_LIB} DEPENDS diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index e2b5e4939d74..dc3a00ba55ed 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -11,11 +11,11 @@ #include "Config.h" #include "Error.h" #include "InputFiles.h" +#include "Memory.h" #include "SymbolTable.h" #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" @@ -50,6 +50,10 @@ namespace coff { Configuration *Config; LinkerDriver *Driver; +BumpPtrAllocator BAlloc; +StringSaver Saver{BAlloc}; +std::vector SpecificAllocBase::Instances; + bool link(ArrayRef Args) { Config = make(); Driver = make(); diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp index cca185d40658..14dd004f1c04 100644 --- a/lld/COFF/DriverUtils.cpp +++ b/lld/COFF/DriverUtils.cpp @@ -16,8 +16,8 @@ #include "Config.h" #include "Driver.h" #include "Error.h" +#include "Memory.h" #include "Symbols.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Object/COFF.h" diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 14846456cb3c..0a97c2185f89 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -7,14 +7,15 @@ // //===----------------------------------------------------------------------===// +#include "InputFiles.h" #include "Chunks.h" #include "Config.h" #include "Driver.h" #include "Error.h" -#include "InputFiles.h" +#include "Memory.h" #include "SymbolTable.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,7 +30,6 @@ #include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" #include "llvm/Target/TargetOptions.h" -#include "llvm-c/lto.h" #include #include #include diff --git a/lld/COFF/Memory.h b/lld/COFF/Memory.h new file mode 100644 index 000000000000..526f11344a09 --- /dev/null +++ b/lld/COFF/Memory.h @@ -0,0 +1,52 @@ +//===- Memory.h -------------------------------------------------*- C++ -*-===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// See ELF/Memory.h +// +//===----------------------------------------------------------------------===// + +#ifndef LLD_COFF_MEMORY_H +#define LLD_COFF_MEMORY_H + +#include "llvm/Support/Allocator.h" +#include "llvm/Support/StringSaver.h" +#include + +namespace lld { +namespace coff { + +extern llvm::BumpPtrAllocator BAlloc; +extern llvm::StringSaver Saver; + +struct SpecificAllocBase { + SpecificAllocBase() { Instances.push_back(this); } + virtual ~SpecificAllocBase() = default; + virtual void reset() = 0; + static std::vector Instances; +}; + +template struct SpecificAlloc : public SpecificAllocBase { + void reset() override { Alloc.DestroyAll(); } + llvm::SpecificBumpPtrAllocator Alloc; +}; + +template T *make(U &&... Args) { + static SpecificAlloc Alloc; + return new (Alloc.Alloc.Allocate()) T(std::forward(Args)...); +} + +inline void freeArena() { + for (SpecificAllocBase *Alloc : SpecificAllocBase::Instances) + Alloc->reset(); + BAlloc.Reset(); +} +} +} + +#endif diff --git a/lld/COFF/ModuleDef.cpp b/lld/COFF/ModuleDef.cpp index 6c8ef71395aa..a273b6f535db 100644 --- a/lld/COFF/ModuleDef.cpp +++ b/lld/COFF/ModuleDef.cpp @@ -18,7 +18,7 @@ #include "Config.h" #include "Error.h" -#include "lld/Support/Memory.h" +#include "Memory.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/StringSaver.h" diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index a39bcd2215b7..9cc0b75c1510 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -11,8 +11,8 @@ #include "Config.h" #include "Driver.h" #include "Error.h" +#include "Memory.h" #include "Symbols.h" -#include "lld/Support/Memory.h" #include "llvm/IR/LLVMContext.h" #include "llvm/LTO/legacy/LTOCodeGenerator.h" #include "llvm/Support/Debug.h" diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index a8ec4ffd5bce..6de85d581f49 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -10,8 +10,8 @@ #include "Symbols.h" #include "Error.h" #include "InputFiles.h" +#include "Memory.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" diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index 506489b4175d..bc9ad4aa8aff 100644 --- a/lld/COFF/Symbols.h +++ b/lld/COFF/Symbols.h @@ -12,8 +12,8 @@ #include "Chunks.h" #include "Config.h" +#include "Memory.h" #include "lld/Core/LLVM.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/Object/Archive.h" #include "llvm/Object/COFF.h" diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 98fd6c4470cd..ae18eb4a80f3 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -12,11 +12,11 @@ #include "DLL.h" #include "Error.h" #include "InputFiles.h" +#include "Memory.h" #include "PDB.h" #include "SymbolTable.h" #include "Symbols.h" #include "lld/Core/Parallel.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringSwitch.h" diff --git a/lld/ELF/CMakeLists.txt b/lld/ELF/CMakeLists.txt index c7c2bf5c331f..2e9d2b941fd9 100644 --- a/lld/ELF/CMakeLists.txt +++ b/lld/ELF/CMakeLists.txt @@ -53,7 +53,6 @@ add_lld_library(lldELF LINK_LIBS lldConfig lldCore - lldSupport ${PTHREAD_LIB} DEPENDS diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 67f067847c0d..521b6182e28f 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -14,6 +14,7 @@ #include "InputFiles.h" #include "InputSection.h" #include "LinkerScript.h" +#include "Memory.h" #include "Strings.h" #include "SymbolTable.h" #include "Target.h" @@ -21,7 +22,6 @@ #include "Writer.h" #include "lld/Config/Version.h" #include "lld/Driver/Driver.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/CommandLine.h" @@ -42,6 +42,10 @@ using namespace lld::elf; Configuration *elf::Config; LinkerDriver *elf::Driver; +BumpPtrAllocator elf::BAlloc; +StringSaver elf::Saver{BAlloc}; +std::vector elf::SpecificAllocBase::Instances; + bool elf::link(ArrayRef Args, bool CanExitEarly, raw_ostream &Error) { ErrorCount = 0; diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index 179dfd356e62..6a270a6d09df 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -15,10 +15,10 @@ #include "Driver.h" #include "Error.h" +#include "Memory.h" #include "ScriptParser.h" #include "lld/Config/Version.h" #include "lld/Core/Reproduce.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Triple.h" diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index b7f1aea31e76..2a8659921463 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -12,10 +12,10 @@ #include "Error.h" #include "InputSection.h" #include "LinkerScript.h" +#include "Memory.h" #include "SymbolTable.h" #include "Symbols.h" #include "SyntheticSections.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Bitcode/BitcodeReader.h" #include "llvm/CodeGen/Analysis.h" diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 8382a6b70855..963995e3d74b 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -13,12 +13,12 @@ #include "Error.h" #include "InputFiles.h" #include "LinkerScript.h" +#include "Memory.h" #include "OutputSections.h" #include "Relocations.h" #include "SyntheticSections.h" #include "Target.h" #include "Thunks.h" -#include "lld/Support/Memory.h" #include "llvm/Support/Compression.h" #include "llvm/Support/Endian.h" #include diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 7387c9c25905..ab6435c5482e 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -15,6 +15,7 @@ #include "Config.h" #include "Driver.h" #include "InputSection.h" +#include "Memory.h" #include "OutputSections.h" #include "ScriptParser.h" #include "Strings.h" @@ -23,7 +24,6 @@ #include "SyntheticSections.h" #include "Target.h" #include "Writer.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" diff --git a/lld/ELF/Memory.h b/lld/ELF/Memory.h new file mode 100644 index 000000000000..e5a04ed1e5a8 --- /dev/null +++ b/lld/ELF/Memory.h @@ -0,0 +1,67 @@ +//===- Memory.h -------------------------------------------------*- C++ -*-===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines arena allocators. +// +// Almost all large objects, such as files, sections or symbols, are +// used for the entire lifetime of the linker once they are created. +// This usage characteristic makes arena allocator an attractive choice +// where the entire linker is one arena. With an arena, newly created +// objects belong to the arena and freed all at once when everything is done. +// Arena allocators are efficient and easy to understand. +// Most objects are allocated using the arena allocators defined by this file. +// +// If you edit this file, please edit COFF/Memory.h too. +// +//===----------------------------------------------------------------------===// + +#ifndef LLD_ELF_MEMORY_H +#define LLD_ELF_MEMORY_H + +#include "llvm/Support/Allocator.h" +#include "llvm/Support/StringSaver.h" +#include + +namespace lld { +namespace elf { + +// Use this arena if your object doesn't have a destructor. +extern llvm::BumpPtrAllocator BAlloc; +extern llvm::StringSaver Saver; + +// These two classes are hack to keep track of all +// SpecificBumpPtrAllocator instances. +struct SpecificAllocBase { + SpecificAllocBase() { Instances.push_back(this); } + virtual ~SpecificAllocBase() = default; + virtual void reset() = 0; + static std::vector Instances; +}; + +template struct SpecificAlloc : public SpecificAllocBase { + void reset() override { Alloc.DestroyAll(); } + llvm::SpecificBumpPtrAllocator Alloc; +}; + +// Use this arena if your object has a destructor. +// Your destructor will be invoked from freeArena(). +template T *make(U &&... Args) { + static SpecificAlloc Alloc; + return new (Alloc.Alloc.Allocate()) T(std::forward(Args)...); +} + +inline void freeArena() { + for (SpecificAllocBase *Alloc : SpecificAllocBase::Instances) + Alloc->reset(); + BAlloc.Reset(); +} +} +} + +#endif diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index f8daa57fd855..cfb8ac9c5688 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -11,12 +11,12 @@ #include "Config.h" #include "EhFrame.h" #include "LinkerScript.h" +#include "Memory.h" #include "Strings.h" #include "SymbolTable.h" #include "SyntheticSections.h" #include "Target.h" #include "Threads.h" -#include "lld/Support/Memory.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/MD5.h" #include "llvm/Support/MathExtras.h" diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 2d7273583c67..2578f6e91324 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -18,8 +18,8 @@ #include "Config.h" #include "Error.h" #include "LinkerScript.h" +#include "Memory.h" #include "Symbols.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/STLExtras.h" using namespace llvm; diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 96a4f70f880b..ea5e924e4934 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -19,6 +19,7 @@ #include "Error.h" #include "InputFiles.h" #include "LinkerScript.h" +#include "Memory.h" #include "OutputSections.h" #include "Strings.h" #include "SymbolTable.h" @@ -26,7 +27,6 @@ #include "Threads.h" #include "Writer.h" #include "lld/Config/Version.h" -#include "lld/Support/Memory.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/Endian.h" #include "llvm/Support/MD5.h" diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index cbb70d439132..9e292dc0b3de 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -27,12 +27,12 @@ #include "Target.h" #include "Error.h" #include "InputFiles.h" +#include "Memory.h" #include "OutputSections.h" #include "Symbols.h" #include "SyntheticSections.h" #include "Thunks.h" #include "Writer.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" diff --git a/lld/ELF/Thunks.cpp b/lld/ELF/Thunks.cpp index e7a1efe35da3..34b630ac2510 100644 --- a/lld/ELF/Thunks.cpp +++ b/lld/ELF/Thunks.cpp @@ -25,10 +25,10 @@ #include "Config.h" #include "Error.h" #include "InputSection.h" +#include "Memory.h" #include "OutputSections.h" #include "Symbols.h" #include "Target.h" -#include "lld/Support/Memory.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ELF.h" #include "llvm/Support/Endian.h" diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index d1c1ecd2cc70..e8d517d211d0 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -10,13 +10,13 @@ #include "Writer.h" #include "Config.h" #include "LinkerScript.h" +#include "Memory.h" #include "OutputSections.h" #include "Relocations.h" #include "Strings.h" #include "SymbolTable.h" #include "SyntheticSections.h" #include "Target.h" -#include "lld/Support/Memory.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/FileOutputBuffer.h" diff --git a/lld/include/lld/Support/Memory.h b/lld/include/lld/Support/Memory.h index 1ed5ec99c971..46db4a39f696 100644 --- a/lld/include/lld/Support/Memory.h +++ b/lld/include/lld/Support/Memory.h @@ -35,7 +35,7 @@ extern llvm::StringSaver Saver; // These two classes are hack to keep track of all // SpecificBumpPtrAllocator instances. struct SpecificAllocBase { - SpecificAllocBase(); + SpecificAllocBase() { Instances.push_back(this); } virtual ~SpecificAllocBase() = default; virtual void reset() = 0; static std::vector Instances; @@ -53,7 +53,11 @@ template inline T *make(U &&... Args) { return new (Alloc.Alloc.Allocate()) T(std::forward(Args)...); } -void freeArena(); +inline void freeArena() { + for (SpecificAllocBase *Alloc : SpecificAllocBase::Instances) + Alloc->reset(); + BAlloc.Reset(); +} } #endif diff --git a/lld/lib/CMakeLists.txt b/lld/lib/CMakeLists.txt index acd5322302f2..699f5e93f8af 100644 --- a/lld/lib/CMakeLists.txt +++ b/lld/lib/CMakeLists.txt @@ -2,4 +2,3 @@ add_subdirectory(Config) add_subdirectory(Core) add_subdirectory(Driver) add_subdirectory(ReaderWriter) -add_subdirectory(Support) diff --git a/lld/lib/Support/CMakeLists.txt b/lld/lib/Support/CMakeLists.txt deleted file mode 100644 index 18dccdbc50c3..000000000000 --- a/lld/lib/Support/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -add_lld_library(lldSupport - Memory.cpp - - ADDITIONAL_HEADER_DIRS - ${LLD_INCLUDE_DIR}/lld/Support - - LINK_LIBS - LLVMSupport -) diff --git a/lld/lib/Support/Memory.cpp b/lld/lib/Support/Memory.cpp deleted file mode 100644 index 9bdcdcc8fdb2..000000000000 --- a/lld/lib/Support/Memory.cpp +++ /dev/null @@ -1,27 +0,0 @@ -//===- Memory.cpp -----------------------------------------------*- C++ -*-===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lld/Support/Memory.h" - -using namespace llvm; - -namespace lld { -BumpPtrAllocator BAlloc; -StringSaver Saver{BAlloc}; - -SpecificAllocBase::SpecificAllocBase() { Instances.push_back(this); } - -std::vector SpecificAllocBase::Instances; - -void freeArena() { - for (SpecificAllocBase *Alloc : SpecificAllocBase::Instances) - Alloc->reset(); - BAlloc.Reset(); -} -}