[lld] r268310 - Teach Undefined symbols from which file they are created from.

Sean Silva via llvm-commits llvm-commits at lists.llvm.org
Mon May 2 18:17:35 PDT 2016


On Mon, May 2, 2016 at 2:56 PM, Sean Silva <chisophugis at gmail.com> wrote:

>
>
> On Mon, May 2, 2016 at 2:30 PM, Rui Ueyama via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: ruiu
>> Date: Mon May  2 16:30:42 2016
>> New Revision: 268310
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=268310&view=rev
>> Log:
>> Teach Undefined symbols from which file they are created from.
>>
>> This patch increases the size of Undefined by the size of a pointer,
>> but it wouldn't actually increase the size of memory that LLD uses
>> because we are not allocating the exact size but the size of the
>> largest SymbolBody.
>>
>> Modified:
>>     lld/trunk/ELF/SymbolTable.cpp
>>     lld/trunk/ELF/Symbols.cpp
>>     lld/trunk/ELF/Symbols.h
>>     lld/trunk/test/ELF/lto/combined-lto-object-name.ll
>>
>> Modified: lld/trunk/ELF/SymbolTable.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=268310&r1=268309&r2=268310&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/SymbolTable.cpp (original)
>> +++ lld/trunk/ELF/SymbolTable.cpp Mon May  2 16:30:42 2016
>> @@ -166,7 +166,6 @@ template <class ELFT> void SymbolTable<E
>>
>>  // Returns a file from which symbol B was created.
>>  // If B does not belong to any file, returns a nullptr.
>> -// This function is slow, but it's okay as it is used only for error
>> messages.
>>  template <class ELFT> InputFile *SymbolTable<ELFT>::findFile(SymbolBody
>> *B) {
>>    // If this symbol has a definition, follow pointers in the symbol to
>> its
>>    // defining file.
>> @@ -177,21 +176,8 @@ template <class ELFT> InputFile *SymbolT
>>      return SS->File;
>>    if (auto *BC = dyn_cast<DefinedBitcode>(B))
>>      return BC->File;
>> -  // If not, we might be able to find it by searching symbol tables of
>> files.
>> -  // This code is generally only used for undefined symbols. Note that
>> we can't
>> -  // rely exclusively on a file search because we may find what was
>> originally
>> -  // an undefined symbol that was later replaced with a defined symbol,
>> and we
>> -  // want to return the file that defined the symbol.
>> -  for (const std::unique_ptr<ObjectFile<ELFT>> &F : ObjectFiles) {
>> -    ArrayRef<SymbolBody *> Syms = F->getSymbols();
>> -    if (std::find(Syms.begin(), Syms.end(), B) != Syms.end())
>> -      return F.get();
>> -  }
>> -  for (const std::unique_ptr<BitcodeFile> &F : BitcodeFiles) {
>> -    ArrayRef<Symbol *> Syms = F->getSymbols();
>> -    if (std::find(Syms.begin(), Syms.end(), B->symbol()) != Syms.end())
>> -      return F.get();
>> -  }
>> +  if (auto *U = dyn_cast<Undefined>(B))
>> +    return U->File;
>>    return nullptr;
>>  }
>>
>> @@ -253,8 +239,8 @@ template <typename ELFT>
>>  std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Existing,
>>                                             InputFile *NewFile) {
>>    StringRef Sym = Existing->getName();
>> -  return demangle(Sym) + " in " + getFilename(findFile(Existing)) + "
>> and " +
>> -         getFilename(NewFile);
>> +  return demangle(Sym) + " in " +
>> getFilename(Existing->getSourceFile<ELFT>()) +
>> +         " and " + getFilename(NewFile);
>>  }
>>
>>  template <class ELFT> Symbol *SymbolTable<ELFT>::addUndefined(StringRef
>> Name) {
>> @@ -274,6 +260,7 @@ Symbol *SymbolTable<ELFT>::addUndefined(
>>    if (WasInserted) {
>>      S->Binding = Binding;
>>      replaceBody<Undefined>(S, Name, StOther, Type);
>> +    cast<Undefined>(S->body())->File = File;
>>      return S;
>>    }
>>    if (Binding != STB_WEAK &&
>>
>> Modified: lld/trunk/ELF/Symbols.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=268310&r1=268309&r2=268310&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/Symbols.cpp (original)
>> +++ lld/trunk/ELF/Symbols.cpp Mon May  2 16:30:42 2016
>> @@ -129,6 +129,18 @@ bool SymbolBody::isPreemptible() const {
>>    return symbol()->Visibility == STV_DEFAULT;
>>  }
>>
>> +template <class ELFT> InputFile *SymbolBody::getSourceFile() {
>> +  if (auto *S = dyn_cast<DefinedRegular<ELFT>>(this))
>> +    return S->Section ? S->Section->getFile() : nullptr;
>> +  if (auto *S = dyn_cast<SharedSymbol<ELFT>>(this))
>> +    return S->File;
>> +  if (auto *S = dyn_cast<DefinedBitcode>(this))
>> +    return S->File;
>> +  if (auto *S = dyn_cast<Undefined>(this))
>> +    return S->File;
>> +  return nullptr;
>> +}
>> +
>>  template <class ELFT>
>>  typename ELFT::uint SymbolBody::getVA(typename ELFT::uint Addend) const {
>>    typename ELFT::uint OutVA = getSymVA<ELFT>(*this, Addend);
>> @@ -258,6 +270,11 @@ bool Symbol::includeInDynsym() const {
>>           (body()->isUndefined() && Config->Shared);
>>  }
>>
>> +template InputFile *SymbolBody::template getSourceFile<ELF32LE>();
>> +template InputFile *SymbolBody::template getSourceFile<ELF32BE>();
>> +template InputFile *SymbolBody::template getSourceFile<ELF64LE>();
>> +template InputFile *SymbolBody::template getSourceFile<ELF64BE>();
>> +
>>  template uint32_t SymbolBody::template getVA<ELF32LE>(uint32_t) const;
>>  template uint32_t SymbolBody::template getVA<ELF32BE>(uint32_t) const;
>>  template uint64_t SymbolBody::template getVA<ELF64LE>(uint64_t) const;
>>
>> Modified: lld/trunk/ELF/Symbols.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=268310&r1=268309&r2=268310&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/Symbols.h (original)
>> +++ lld/trunk/ELF/Symbols.h Mon May  2 16:30:42 2016
>> @@ -108,6 +108,10 @@ public:
>>    template <class ELFT> typename ELFT::uint getThunkVA() const;
>>    template <class ELFT> typename ELFT::uint getSize() const;
>>
>> +  // Returns the file from which the symbol was created.
>> +  // For logging purpose only.
>> +  template <class ELFT> InputFile *getSourceFile();
>> +
>>  protected:
>>    SymbolBody(Kind K, StringRef Name, uint8_t StOther, uint8_t Type);
>>
>> @@ -259,6 +263,10 @@ public:
>>    static bool classof(const SymbolBody *S) {
>>      return S->kind() == UndefinedKind;
>>    }
>> +
>> +  // The file this undefined symbol was created from.
>> +  // For logging purpose only.
>> +  InputFile *File = nullptr;
>>  };
>>
>>  template <class ELFT> class SharedSymbol : public Defined {
>>
>> Modified: lld/trunk/test/ELF/lto/combined-lto-object-name.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/combined-lto-object-name.ll?rev=268310&r1=268309&r2=268310&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/test/ELF/lto/combined-lto-object-name.ll (original)
>> +++ lld/trunk/test/ELF/lto/combined-lto-object-name.ll Mon May  2
>> 16:30:42 2016
>> @@ -11,4 +11,4 @@ define void @_start() {
>>    ret void
>>  }
>>
>> -; CHECK: undefined symbol: foo in LLD-INTERNAL-combined-lto-object
>> +; CHECK: undefined symbol: foo in {{.*}}combined-lto-object-name.ll.tmp.o
>>
>
> Can you please still check that the message clearly identifies this as an
> internal object? The check that you have replaced this with no longer does
> so.
>
>
As Rui pointed out on IRC, we actually now point at the original object
instead of the internal object, which is much more desirable (no need to
reference the internal object).

-- Sean Silva


> -- Sean Silva
>
>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160502/33cc32c9/attachment.html>


More information about the llvm-commits mailing list