<div dir="ltr">Actually, I think this is where we want to use a global variable, instead of passing around Alloc everywhere.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 26, 2016 at 8:34 AM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Wed Oct 26 10:34:24 2016<br>
New Revision: 285205<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=285205&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=285205&view=rev</a><br>
Log:<br>
Reduce the number of allocators.<br>
<br>
We used to have one allocator per file, which reduces the advantage of<br>
using an allocator in the first place.<br>
<br>
This is a small speed up is most cases. The largest speedup was in<br>
1.014X in chromium no-gc. The largest slowdown was scylla at 1.003X.<br>
<br>
Modified:<br>
    lld/trunk/ELF/Driver.cpp<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/ELF/InputFiles.h<br>
    lld/trunk/ELF/LTO.cpp<br>
    lld/trunk/ELF/LTO.h<br>
    lld/trunk/ELF/SymbolTable.cpp<br>
    lld/trunk/ELF/Symbols.cpp<br>
    lld/trunk/ELF/Symbols.h<br>
<br>
Modified: lld/trunk/ELF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Driver.<wbr>cpp?rev=285205&r1=285204&r2=<wbr>285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Driver.cpp (original)<br>
+++ lld/trunk/ELF/Driver.cpp Wed Oct 26 10:34:24 2016<br>
@@ -137,7 +137,7 @@ void LinkerDriver::addFile(<wbr>StringRef Pat<br>
   case file_magic::archive:<br>
     if (InWholeArchive) {<br>
       for (MemoryBufferRef MB : getArchiveMembers(MBRef))<br>
-        Files.push_back(<wbr>createObjectFile(MB, Path));<br>
+        Files.push_back(<wbr>createObjectFile(Alloc, MB, Path));<br>
       return;<br>
     }<br>
     Files.push_back(new ArchiveFile(MBRef));<br>
@@ -147,13 +147,13 @@ void LinkerDriver::addFile(<wbr>StringRef Pat<br>
       error("attempted static link of dynamic object " + Path);<br>
       return;<br>
     }<br>
-    Files.push_back(<wbr>createSharedFile(MBRef));<br>
+    Files.push_back(<wbr>createSharedFile(Alloc, MBRef));<br>
     return;<br>
   default:<br>
     if (InLib)<br>
       Files.push_back(new LazyObjectFile(MBRef));<br>
     else<br>
-      Files.push_back(<wbr>createObjectFile(MBRef));<br>
+      Files.push_back(<wbr>createObjectFile(Alloc, MBRef));<br>
   }<br>
 }<br>
<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>InputFiles.cpp?rev=285205&r1=<wbr>285204&r2=285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Wed Oct 26 10:34:24 2016<br>
@@ -140,8 +140,8 @@ template <class ELFT> void ELFFileBase<E<br>
 }<br>
<br>
 template <class ELFT><br>
-elf::ObjectFile<ELFT>::<wbr>ObjectFile(MemoryBufferRef M)<br>
-    : ELFFileBase<ELFT>(Base::<wbr>ObjectKind, M) {}<br>
+elf::ObjectFile<ELFT>::<wbr>ObjectFile(BumpPtrAllocator &Alloc, MemoryBufferRef M)<br>
+    : ELFFileBase<ELFT>(Base::<wbr>ObjectKind, M), Alloc(Alloc) {}<br>
<br>
 template <class ELFT><br>
 ArrayRef<SymbolBody *> elf::ObjectFile<ELFT>::<wbr>getNonLocalSymbols() {<br>
@@ -547,7 +547,7 @@ ArchiveFile::getMember(const Archive::Sy<br>
 }<br>
<br>
 template <class ELFT><br>
-SharedFile<ELFT>::SharedFile(<wbr>MemoryBufferRef M)<br>
+SharedFile<ELFT>::SharedFile(<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef M)<br>
     : ELFFileBase<ELFT>(Base::<wbr>SharedKind, M), AsNeeded(Config->AsNeeded) {}<br>
<br>
 template <class ELFT><br>
@@ -793,7 +793,7 @@ void BitcodeFile::parse(DenseSet<<wbr>CachedH<br>
 }<br>
<br>
 template <template <class> class T><br>
-static InputFile *createELFFile(MemoryBufferRef MB) {<br>
+static InputFile *createELFFile(<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef MB) {<br>
   unsigned char Size;<br>
   unsigned char Endian;<br>
   std::tie(Size, Endian) = getElfArchType(MB.getBuffer())<wbr>;<br>
@@ -802,13 +802,13 @@ static InputFile *createELFFile(MemoryBu<br>
<br>
   InputFile *Obj;<br>
   if (Size == ELFCLASS32 && Endian == ELFDATA2LSB)<br>
-    Obj = new T<ELF32LE>(MB);<br>
+    Obj = new T<ELF32LE>(Alloc, MB);<br>
   else if (Size == ELFCLASS32 && Endian == ELFDATA2MSB)<br>
-    Obj = new T<ELF32BE>(MB);<br>
+    Obj = new T<ELF32BE>(Alloc, MB);<br>
   else if (Size == ELFCLASS64 && Endian == ELFDATA2LSB)<br>
-    Obj = new T<ELF64LE>(MB);<br>
+    Obj = new T<ELF64LE>(Alloc, MB);<br>
   else if (Size == ELFCLASS64 && Endian == ELFDATA2MSB)<br>
-    Obj = new T<ELF64BE>(MB);<br>
+    Obj = new T<ELF64BE>(Alloc, MB);<br>
   else<br>
     fatal("invalid file class: " + MB.getBufferIdentifier());<br>
<br>
@@ -825,7 +825,7 @@ template <class ELFT> InputFile *BinaryF<br>
   Buffer = wrapBinaryWithElfHeader<ELFT>(<wbr>Blob, Filename);<br>
<br>
   return createELFFile<ObjectFile>(<br>
-      MemoryBufferRef(toStringRef(<wbr>Buffer), Filename));<br>
+      Alloc, MemoryBufferRef(toStringRef(<wbr>Buffer), Filename));<br>
 }<br>
<br>
 static bool isBitcode(MemoryBufferRef MB) {<br>
@@ -833,17 +833,18 @@ static bool isBitcode(MemoryBufferRef MB<br>
   return identify_magic(MB.getBuffer()) == file_magic::bitcode;<br>
 }<br>
<br>
-InputFile *elf::createObjectFile(<wbr>MemoryBufferRef MB, StringRef ArchiveName,<br>
+InputFile *elf::createObjectFile(<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef MB,<br>
+                                 StringRef ArchiveName,<br>
                                  uint64_t OffsetInArchive) {<br>
-  InputFile *F =<br>
-      isBitcode(MB) ? new BitcodeFile(MB) : createELFFile<ObjectFile>(MB);<br>
+  InputFile *F = isBitcode(MB) ? new BitcodeFile(MB)<br>
+                               : createELFFile<ObjectFile>(<wbr>Alloc, MB);<br>
   F->ArchiveName = ArchiveName;<br>
   F->OffsetInArchive = OffsetInArchive;<br>
   return F;<br>
 }<br>
<br>
-InputFile *elf::createSharedFile(<wbr>MemoryBufferRef MB) {<br>
-  return createELFFile<SharedFile>(MB);<br>
+InputFile *elf::createSharedFile(<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef MB) {<br>
+  return createELFFile<SharedFile>(<wbr>Alloc, MB);<br>
 }<br>
<br>
 MemoryBufferRef LazyObjectFile::getBuffer() {<br>
<br>
Modified: lld/trunk/ELF/InputFiles.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>InputFiles.h?rev=285205&r1=<wbr>285204&r2=285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/InputFiles.h (original)<br>
+++ lld/trunk/ELF/InputFiles.h Wed Oct 26 10:34:24 2016<br>
@@ -167,7 +167,7 @@ public:<br>
   ArrayRef<SymbolBody *> getLocalSymbols();<br>
   ArrayRef<SymbolBody *> getNonLocalSymbols();<br>
<br>
-  explicit ObjectFile(MemoryBufferRef M);<br>
+  explicit ObjectFile(llvm::<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef M);<br>
   void parse(llvm::DenseSet<llvm::<wbr>CachedHashStringRef> &ComdatGroups);<br>
<br>
   ArrayRef<InputSectionBase<<wbr>ELFT> *> getSections() const { return Sections; }<br>
@@ -202,7 +202,7 @@ public:<br>
<br>
   // SymbolBodies and Thunks for sections in this file are allocated<br>
   // using this buffer.<br>
-  llvm::BumpPtrAllocator Alloc;<br>
+  llvm::BumpPtrAllocator &Alloc;<br>
<br>
   // Name of source file obtained from STT_FILE symbol value,<br>
   // or empty string if there is no such symbol in object file<br>
@@ -324,7 +324,7 @@ public:<br>
     return F->kind() == Base::SharedKind;<br>
   }<br>
<br>
-  explicit SharedFile(MemoryBufferRef M);<br>
+  explicit SharedFile(llvm::<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef M);<br>
<br>
   void parseSoName();<br>
   void parseRest();<br>
@@ -356,11 +356,13 @@ public:<br>
<br>
 private:<br>
   std::vector<uint8_t> Buffer;<br>
+  llvm::BumpPtrAllocator Alloc;<br>
 };<br>
<br>
-InputFile *createObjectFile(<wbr>MemoryBufferRef MB, StringRef ArchiveName = "",<br>
+InputFile *createObjectFile(llvm::<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef MB,<br>
+                            StringRef ArchiveName = "",<br>
                             uint64_t OffsetInArchive = 0);<br>
-InputFile *createSharedFile(<wbr>MemoryBufferRef MB);<br>
+InputFile *createSharedFile(llvm::<wbr>BumpPtrAllocator &Alloc, MemoryBufferRef MB);<br>
<br>
 } // namespace elf<br>
 } // namespace lld<br>
<br>
Modified: lld/trunk/ELF/LTO.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/LTO.cpp?<wbr>rev=285205&r1=285204&r2=<wbr>285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/LTO.cpp (original)<br>
+++ lld/trunk/ELF/LTO.cpp Wed Oct 26 10:34:24 2016<br>
@@ -137,7 +137,8 @@ std::vector<InputFile *> BitcodeCompiler<br>
       else<br>
         saveBuffer(Buff[I], Config->OutputFile + Twine(I) + ".lto.o");<br>
     }<br>
-    InputFile *Obj = createObjectFile(<wbr>MemoryBufferRef(Buff[I], "lto.tmp"));<br>
+    InputFile *Obj =<br>
+        createObjectFile(Alloc, MemoryBufferRef(Buff[I], "lto.tmp"));<br>
     Ret.push_back(Obj);<br>
   }<br>
   return Ret;<br>
<br>
Modified: lld/trunk/ELF/LTO.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.h?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/LTO.h?<wbr>rev=285205&r1=285204&r2=<wbr>285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/LTO.h (original)<br>
+++ lld/trunk/ELF/LTO.h Wed Oct 26 10:34:24 2016<br>
@@ -49,6 +49,7 @@ public:<br>
 private:<br>
   std::unique_ptr<llvm::lto::<wbr>LTO> LtoObj;<br>
   std::vector<SmallString<0>> Buff;<br>
+  llvm::BumpPtrAllocator Alloc;<br>
 };<br>
 }<br>
 }<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>SymbolTable.cpp?rev=285205&r1=<wbr>285204&r2=285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/SymbolTable.cpp (original)<br>
+++ lld/trunk/ELF/SymbolTable.cpp Wed Oct 26 10:34:24 2016<br>
@@ -293,7 +293,7 @@ Symbol *SymbolTable<ELFT>::<wbr>addUndefined(<br>
     // its type. See also comment in addLazyArchive.<br>
     if (S->isWeak())<br>
       L->Type = Type;<br>
-    else if (InputFile *F = L->fetch())<br>
+    else if (InputFile *F = L->fetch(Alloc))<br>
       addFile(F);<br>
   }<br>
   return S;<br>
@@ -510,7 +510,7 @@ void SymbolTable<ELFT>::<wbr>addLazyArchive(A<br>
   }<br>
   std::pair<MemoryBufferRef, uint64_t> MBInfo = F->getMember(&Sym);<br>
   if (!MBInfo.first.getBuffer().<wbr>empty())<br>
-    addFile(createObjectFile(<wbr>MBInfo.first, F->getName(), MBInfo.second));<br>
+    addFile(createObjectFile(<wbr>Alloc, MBInfo.first, F->getName(), MBInfo.second));<br>
 }<br>
<br>
 template <class ELFT><br>
@@ -531,7 +531,7 @@ void SymbolTable<ELFT>::<wbr>addLazyObject(St<br>
   } else {<br>
     MemoryBufferRef MBRef = Obj.getBuffer();<br>
     if (!MBRef.getBuffer().empty())<br>
-      addFile(createObjectFile(<wbr>MBRef));<br>
+      addFile(createObjectFile(<wbr>Alloc, MBRef));<br>
   }<br>
 }<br>
<br>
@@ -539,7 +539,7 @@ void SymbolTable<ELFT>::<wbr>addLazyObject(St<br>
 template <class ELFT> void SymbolTable<ELFT>::<wbr>scanUndefinedFlags() {<br>
   for (StringRef S : Config->Undefined)<br>
     if (auto *L = dyn_cast_or_null<Lazy>(find(S)<wbr>))<br>
-      if (InputFile *File = L->fetch())<br>
+      if (InputFile *File = L->fetch(Alloc))<br>
         addFile(File);<br>
 }<br>
<br>
<br>
Modified: lld/trunk/ELF/Symbols.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Symbols.<wbr>cpp?rev=285205&r1=285204&r2=<wbr>285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Symbols.cpp (original)<br>
+++ lld/trunk/ELF/Symbols.cpp Wed Oct 26 10:34:24 2016<br>
@@ -227,10 +227,10 @@ DefinedCommon::DefinedCommon(<wbr>StringRef N<br>
   this->File = File;<br>
 }<br>
<br>
-InputFile *Lazy::fetch() {<br>
+InputFile *Lazy::fetch(BumpPtrAllocator &Alloc) {<br>
   if (auto *S = dyn_cast<LazyArchive>(this))<br>
-    return S->fetch();<br>
-  return cast<LazyObject>(this)->fetch(<wbr>);<br>
+    return S->fetch(Alloc);<br>
+  return cast<LazyObject>(this)->fetch(<wbr>Alloc);<br>
 }<br>
<br>
 LazyArchive::LazyArchive(<wbr>ArchiveFile &File,<br>
@@ -244,21 +244,22 @@ LazyObject::LazyObject(<wbr>StringRef Name, L<br>
   this->File = &File;<br>
 }<br>
<br>
-InputFile *LazyArchive::fetch() {<br>
+InputFile *LazyArchive::fetch(<wbr>BumpPtrAllocator &Alloc) {<br>
   std::pair<MemoryBufferRef, uint64_t> MBInfo = file()->getMember(&Sym);<br>
<br>
   // getMember returns an empty buffer if the member was already<br>
   // read from the library.<br>
   if (MBInfo.first.getBuffer().<wbr>empty())<br>
     return nullptr;<br>
-  return createObjectFile(MBInfo.first, file()->getName(), MBInfo.second);<br>
+  return createObjectFile(Alloc, MBInfo.first, file()->getName(),<br>
+                          MBInfo.second);<br>
 }<br>
<br>
-InputFile *LazyObject::fetch() {<br>
+InputFile *LazyObject::fetch(<wbr>BumpPtrAllocator &Alloc) {<br>
   MemoryBufferRef MBRef = file()->getBuffer();<br>
   if (MBRef.getBuffer().empty())<br>
     return nullptr;<br>
-  return createObjectFile(MBRef);<br>
+  return createObjectFile(Alloc, MBRef);<br>
 }<br>
<br>
 bool Symbol::includeInDynsym() const {<br>
<br>
Modified: lld/trunk/ELF/Symbols.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=285205&r1=285204&r2=285205&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Symbols.<wbr>h?rev=285205&r1=285204&r2=<wbr>285205&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Symbols.h (original)<br>
+++ lld/trunk/ELF/Symbols.h Wed Oct 26 10:34:24 2016<br>
@@ -328,7 +328,7 @@ public:<br>
<br>
   // Returns an object file for this symbol, or a nullptr if the file<br>
   // was already returned.<br>
-  InputFile *fetch();<br>
+  InputFile *fetch(llvm::BumpPtrAllocator &Alloc);<br>
<br>
 protected:<br>
   Lazy(SymbolBody::Kind K, StringRef Name, uint8_t Type)<br>
@@ -346,7 +346,7 @@ public:<br>
   }<br>
<br>
   ArchiveFile *file() { return (ArchiveFile *)this->File; }<br>
-  InputFile *fetch();<br>
+  InputFile *fetch(llvm::BumpPtrAllocator &Alloc);<br>
<br>
 private:<br>
   const llvm::object::Archive::Symbol Sym;<br>
@@ -363,7 +363,7 @@ public:<br>
   }<br>
<br>
   LazyObjectFile *file() { return (LazyObjectFile *)this->File; }<br>
-  InputFile *fetch();<br>
+  InputFile *fetch(llvm::BumpPtrAllocator &Alloc);<br>
 };<br>
<br>
 // Some linker-generated symbols need to be created as<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>