[lld] r263366 - Cosmetic change to reduce repetitions. NFC.

Adhemerval Zanella via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 14 06:35:43 PDT 2016


I am getting linking failures after this patch trying to build lld:

[...]
../../../../lib/liblldELF.a(Target.cpp.o): In function `lld::elf::(anonymous namespace)::AArch64TargetInfo::relaxTls(unsigned char*, unsigned char*, unsigned int, unsigned long, unsigned long, lld::elf::SymbolBody const&) const':
Target.cpp:(.text._ZNK3lld3elf12_GLOBAL__N_117AArch64TargetInfo8relaxTlsEPhS3_jmmRKNS0_10SymbolBodyE+0x6c): undefined reference to `lld::elf::SymbolBody::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t lld::elf::SymbolBody::getVA<llvm::object::ELFType<(llvm::support::endianness)1, true> >(lld::elf::SymbolBody::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t) const'
Target.cpp:(.text._ZNK3lld3elf12_GLOBAL__N_117AArch64TargetInfo8relaxTlsEPhS3_jmmRKNS0_10SymbolBodyE+0xb0): undefined reference to `lld::elf::SymbolBody::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t lld::elf::SymbolBody::getVA<llvm::object::ELFType<(llvm::support::endianness)1, true> >(lld::elf::SymbolBody::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t) const'
[...]

It is because Symbols.cpp.o now provides:

[...]
.text._ZNK3lld3elf10SymbolBody5getVAIN4llvm6object7ELFTypeILNS3_7support10endiannessE1ELb1EEEEENS4_7ELFFileIT_E7uintX_tESC_    0000000000000180 llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t lld::elf::SymbolBody::getVA<llvm::object::ELFType<(llvm::support::endianness)1, true> >(llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t) const
0000000000000000  w    F .text._ZNK3lld3elf10SymbolBody5getVAIN4llvm6object7ELFTypeILNS3_7support10endiannessE0ELb1EEEEENS4_7ELFFileIT_E7uintX_tESC_    00000000000001a0 llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)0, true> >::uintX_t lld::elf::SymbolBody::getVA<llvm::object::ELFType<(llvm::support::endianness)0, true> >(llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)0, true> >::uintX_t) const
[...]

And it translate to:

llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t lld::elf::SymbolBody::getVA<llvm::object::ELFType<(llvm::support::endianness)1, true> >(llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t) const

Where all the usage inside lld are expecting:

lld::elf::SymbolBody::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t lld::elf::SymbolBody::getVA<llvm::object::ELFType<(llvm::support::endianness)1, true> >(lld::elf::SymbolBody::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t) const

The different is the namespace binding, which with this patch changes the return
type from 'lld::elf::SymbolBody::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t'
to 'llvm::object::ELFFile<llvm::object::ELFType<(llvm::support::endianness)1, true> >::uintX_t'.

I think it would be better to just revert it.

On 13-03-2016 01:40, Rui Ueyama via llvm-commits wrote:
> Author: ruiu
> Date: Sat Mar 12 22:40:17 2016
> New Revision: 263366
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=263366&view=rev
> Log:
> Cosmetic change to reduce repetitions. NFC.
> 
> Modified:
>     lld/trunk/ELF/Symbols.h
> 
> Modified: lld/trunk/ELF/Symbols.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=263366&r1=263365&r2=263366&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.h (original)
> +++ lld/trunk/ELF/Symbols.h Sat Mar 12 22:40:17 2016
> @@ -46,6 +46,8 @@ struct Symbol {
>  
>  // The base class for real symbol classes.
>  class SymbolBody {
> +  template <class ELFT> using ELFFile = llvm::object::ELFFile<ELFT>;
> +
>  public:
>    enum Kind {
>      DefinedFirst,
> @@ -90,17 +92,13 @@ public:
>    bool isInGot() const { return GotIndex != -1U; }
>    bool isInPlt() const { return PltIndex != -1U; }
>  
> -  template <class ELFT>
> -  typename llvm::object::ELFFile<ELFT>::uintX_t
> -  getVA(typename llvm::object::ELFFile<ELFT>::uintX_t Addend = 0) const;
> -  template <class ELFT>
> -  typename llvm::object::ELFFile<ELFT>::uintX_t getGotVA() const;
> -  template <class ELFT>
> -  typename llvm::object::ELFFile<ELFT>::uintX_t getGotPltVA() const;
> -  template <class ELFT>
> -  typename llvm::object::ELFFile<ELFT>::uintX_t getPltVA() const;
> -  template <class ELFT>
> -  typename llvm::object::ELFFile<ELFT>::uintX_t getSize() const;
> +  template <class ELFT> typename ELFFile<ELFT>::uintX_t
> +  getVA(typename ELFFile<ELFT>::uintX_t Addend = 0) const;
> +
> +  template <class ELFT> typename ELFFile<ELFT>::uintX_t getGotVA() const;
> +  template <class ELFT> typename ELFFile<ELFT>::uintX_t getGotPltVA() const;
> +  template <class ELFT> typename ELFFile<ELFT>::uintX_t getPltVA() const;
> +  template <class ELFT> typename ELFFile<ELFT>::uintX_t getSize() const;
>  
>    // A SymbolBody has a backreference to a Symbol. Originally they are
>    // doubly-linked. A backreference will never change. But the pointer
> 
> 
> _______________________________________________
> 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