[lld] r274896 - Fix memory leak.
Rafael EspĂndola via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 8 12:24:43 PDT 2016
Yes, we do, sorry just now I noticed it:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/14493/steps/check-lld%20asan/logs/stdio
Thanks,
Rafael
On 8 July 2016 at 15:11, Rafael EspĂndola <rafael.espindola at gmail.com> wrote:
> Thanks. I thought we had a lsan bot checking lld, no?
>
> Cheers,
> Rafael
>
>
> On 8 July 2016 at 13:58, Rui Ueyama via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> Author: ruiu
>> Date: Fri Jul 8 12:58:54 2016
>> New Revision: 274896
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=274896&view=rev
>> Log:
>> Fix memory leak.
>>
>> Symbol's dtors are not called because they are allocated using
>> BumpPtrAllocators. So, members of std::unique_ptr type are not
>> freed when symbols are deallocated.
>>
>> This patch is to allocate Thunks using BumpPtrAllocators.
>>
>> Modified:
>> lld/trunk/ELF/InputFiles.cpp
>> lld/trunk/ELF/InputFiles.h
>> lld/trunk/ELF/Symbols.h
>> lld/trunk/ELF/Thunks.cpp
>>
>> Modified: lld/trunk/ELF/InputFiles.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=274896&r1=274895&r2=274896&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/InputFiles.cpp (original)
>> +++ lld/trunk/ELF/InputFiles.cpp Fri Jul 8 12:58:54 2016
>> @@ -353,8 +353,9 @@ SymbolBody *elf::ObjectFile<ELFT>::creat
>> InputSectionBase<ELFT> *Sec = getSection(*Sym);
>> if (Binding == STB_LOCAL) {
>> if (Sym->st_shndx == SHN_UNDEF)
>> - return new (Alloc) Undefined(Sym->st_name, Sym->st_other, Sym->getType());
>> - return new (Alloc) DefinedRegular<ELFT>(*Sym, Sec);
>> + return new (this->Alloc)
>> + Undefined(Sym->st_name, Sym->st_other, Sym->getType());
>> + return new (this->Alloc) DefinedRegular<ELFT>(*Sym, Sec);
>> }
>>
>> StringRef Name = check(Sym->getName(this->StringTable));
>>
>> Modified: lld/trunk/ELF/InputFiles.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=274896&r1=274895&r2=274896&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/InputFiles.h (original)
>> +++ lld/trunk/ELF/InputFiles.h Fri Jul 8 12:58:54 2016
>> @@ -154,6 +154,10 @@ public:
>> // st_name of the symbol.
>> std::vector<std::pair<const DefinedRegular<ELFT> *, unsigned>> KeptLocalSyms;
>>
>> + // SymbolBodies and Thunks for sections in this file are allocated
>> + // using this buffer.
>> + llvm::BumpPtrAllocator Alloc;
>> +
>> private:
>> void initializeSections(llvm::DenseSet<StringRef> &ComdatGroups);
>> void initializeSymbols();
>> @@ -173,7 +177,6 @@ private:
>> // MIPS .MIPS.options section defined by this file.
>> std::unique_ptr<MipsOptionsInputSection<ELFT>> MipsOptions;
>>
>> - llvm::BumpPtrAllocator Alloc;
>> llvm::SpecificBumpPtrAllocator<InputSection<ELFT>> IAlloc;
>> llvm::SpecificBumpPtrAllocator<MergeInputSection<ELFT>> MAlloc;
>> llvm::SpecificBumpPtrAllocator<EhInputSection<ELFT>> EHAlloc;
>>
>> Modified: lld/trunk/ELF/Symbols.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=274896&r1=274895&r2=274896&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/Symbols.h (original)
>> +++ lld/trunk/ELF/Symbols.h Fri Jul 8 12:58:54 2016
>> @@ -230,7 +230,7 @@ public:
>>
>> // If non-null the symbol has a Thunk that may be used as an alternative
>> // destination for callers of this Symbol.
>> - std::unique_ptr<Thunk<ELFT>> ThunkData;
>> + Thunk<ELFT> *ThunkData;
>>
>> private:
>> static InputSectionBase<ELFT> *NullInputSection;
>> @@ -306,7 +306,7 @@ public:
>>
>> // If non-null the symbol has a Thunk that may be used as an alternative
>> // destination for callers of this Symbol.
>> - std::unique_ptr<Thunk<ELFT>> ThunkData;
>> + Thunk<ELFT> *ThunkData;
>> bool needsCopy() const { return this->NeedsCopyOrPltAddr && !this->isFunc(); }
>> };
>>
>>
>> Modified: lld/trunk/ELF/Thunks.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Thunks.cpp?rev=274896&r1=274895&r2=274896&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/Thunks.cpp (original)
>> +++ lld/trunk/ELF/Thunks.cpp Fri Jul 8 12:58:54 2016
>> @@ -22,6 +22,7 @@
>> #include "OutputSections.h"
>> #include "Symbols.h"
>> #include "Target.h"
>> +#include "llvm/Support/Allocator.h"
>>
>> #include "llvm/Object/ELF.h"
>> #include "llvm/Support/ELF.h"
>> @@ -175,7 +176,9 @@ static void addThunkARM(uint32_t RelocTy
>> return;
>>
>> bool NeedsPI = Config->Pic || Config->Pie || Config->Shared;
>> - Thunk<ELFT> *thunk;
>> + Thunk<ELFT> *T;
>> + BumpPtrAllocator &Alloc = IS.getFile()->Alloc;
>> +
>> // ARM relocations need ARM to Thumb interworking Thunks, Thumb relocations
>> // need Thumb to ARM relocations. Use position independent Thunks if we
>> // require position independent code.
>> @@ -184,43 +187,46 @@ static void addThunkARM(uint32_t RelocTy
>> case R_ARM_PLT32:
>> case R_ARM_JUMP24:
>> if (NeedsPI)
>> - thunk = new ARMToThumbV7PILongThunk<ELFT>(S, IS);
>> + T = new (Alloc) ARMToThumbV7PILongThunk<ELFT>(S, IS);
>> else
>> - thunk = new ARMToThumbV7ABSLongThunk<ELFT>(S, IS);
>> + T = new (Alloc) ARMToThumbV7ABSLongThunk<ELFT>(S, IS);
>> break;
>> case R_ARM_THM_JUMP19:
>> case R_ARM_THM_JUMP24:
>> if (NeedsPI)
>> - thunk = new ThumbToARMV7PILongThunk<ELFT>(S, IS);
>> + T = new (Alloc) ThumbToARMV7PILongThunk<ELFT>(S, IS);
>> else
>> - thunk = new ThumbToARMV7ABSLongThunk<ELFT>(S, IS);
>> + T = new (Alloc) ThumbToARMV7ABSLongThunk<ELFT>(S, IS);
>> break;
>> default:
>> fatal("Unrecognised Relocation type\n");
>> }
>> +
>> // ARM Thunks are added to the same InputSection as the relocation. This
>> // isn't strictly necessary but it makes it more likely that a limited range
>> // branch can reach the Thunk, and it makes Thunks to the PLT section easier
>> - IS.addThunk(thunk);
>> + IS.addThunk(T);
>> if (DefinedRegular<ELFT> *DR = dyn_cast<DefinedRegular<ELFT>>(&S))
>> - DR->ThunkData.reset(thunk);
>> + DR->ThunkData = T;
>> else if (SharedSymbol<ELFT> *SH = dyn_cast<SharedSymbol<ELFT>>(&S))
>> - SH->ThunkData.reset(thunk);
>> + SH->ThunkData = T;
>> else
>> fatal("symbol not DefinedRegular or Shared\n");
>> }
>>
>> template <class ELFT>
>> -static void addThunkMips(uint32_t RelocType, SymbolBody &S) {
>> +static void addThunkMips(uint32_t RelocType, SymbolBody &S,
>> + InputSection<ELFT> &IS) {
>> if (S.hasThunk<ELFT>())
>> // only one Thunk supported per symbol
>> return;
>> - // Mips Thunks are added to the InputSection defining S
>> +
>> + // Mips Thunks are added to the InputSection defining S.
>> auto *R = cast<DefinedRegular<ELFT>>(&S);
>> auto *Sec = cast<InputSection<ELFT>>(R->Section);
>> - auto *T = new MipsThunk<ELFT>(S, *Sec);
>> + auto *T = new (IS.getFile()->Alloc) MipsThunk<ELFT>(S, *Sec);
>> Sec->addThunk(T);
>> - R->ThunkData.reset(T);
>> + R->ThunkData = T;
>> }
>>
>> template <class ELFT>
>> @@ -228,7 +234,7 @@ void addThunk(uint32_t RelocType, Symbol
>> if (Config->EMachine == EM_ARM)
>> addThunkARM<ELFT>(RelocType, S, IS);
>> else if (Config->EMachine == EM_MIPS)
>> - addThunkMips<ELFT>(RelocType, S);
>> + addThunkMips<ELFT>(RelocType, S, IS);
>> else
>> llvm_unreachable("add Thunk only supported for ARM and Mips");
>> }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list