[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