[llvm] r205508 - Implement get getSymbolFileOffset with getSymbolAddress.

Dmitri Shtilman dshtilman at icloud.com
Wed Apr 2 21:11:23 PDT 2014


Hello Rafael,

I believe this commit has broken the following buildbot:
http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/14378

Could you please fix this?

Thanks,
Dmitri

On Apr 2, 2014, at 8:13 PM, Rafael Espindola <rafael.espindola at gmail.com> wrote:

> Author: rafael
> Date: Wed Apr  2 22:13:33 2014
> New Revision: 205508
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=205508&view=rev
> Log:
> Implement get getSymbolFileOffset with getSymbolAddress.
> 
> This has the following advantages:
> * Less code.
> * The old ELF implementation was wrong for non-relocatable objects.
> * The old ELF implementation (and I think MachO) was wrong for thumb.
> 
> No current testcase since this is only used from MCJIT and it only uses
> relocatable objects and I don't think it supports thumb yet.
> 
> Modified:
>    llvm/trunk/include/llvm/Object/COFF.h
>    llvm/trunk/include/llvm/Object/ELFObjectFile.h
>    llvm/trunk/include/llvm/Object/MachO.h
>    llvm/trunk/include/llvm/Object/ObjectFile.h
>    llvm/trunk/lib/Object/COFFObjectFile.cpp
>    llvm/trunk/lib/Object/MachOObjectFile.cpp
> 
> Modified: llvm/trunk/include/llvm/Object/COFF.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=205508&r1=205507&r2=205508&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/COFF.h (original)
> +++ llvm/trunk/include/llvm/Object/COFF.h Wed Apr  2 22:13:33 2014
> @@ -363,8 +363,6 @@ protected:
>   void moveSymbolNext(DataRefImpl &Symb) const override;
>   error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const override;
>   error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const override;
> -  error_code getSymbolFileOffset(DataRefImpl Symb,
> -                                 uint64_t &Res) const override;
>   error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override;
>   uint32_t getSymbolFlags(DataRefImpl Symb) const override;
>   error_code getSymbolType(DataRefImpl Symb,
> 
> Modified: llvm/trunk/include/llvm/Object/ELFObjectFile.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFObjectFile.h?rev=205508&r1=205507&r2=205508&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ELFObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/ELFObjectFile.h Wed Apr  2 22:13:33 2014
> @@ -58,8 +58,6 @@ protected:
> 
>   void moveSymbolNext(DataRefImpl &Symb) const override;
>   error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const override;
> -  error_code getSymbolFileOffset(DataRefImpl Symb,
> -                                 uint64_t &Res) const override;
>   error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const override;
>   error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const override;
>   error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override;
> @@ -239,39 +237,6 @@ error_code ELFObjectFile<ELFT>::getSymbo
> }
> 
> template <class ELFT>
> -error_code ELFObjectFile<ELFT>::getSymbolFileOffset(DataRefImpl Symb,
> -                                                    uint64_t &Result) const {
> -  const Elf_Sym *ESym = getSymbol(Symb);
> -  const Elf_Shdr *ESec;
> -  switch (EF.getSymbolTableIndex(ESym)) {
> -  case ELF::SHN_COMMON:
> -  // Unintialized symbols have no offset in the object file
> -  case ELF::SHN_UNDEF:
> -    Result = UnknownAddressOrSize;
> -    return object_error::success;
> -  case ELF::SHN_ABS:
> -    Result = ESym->st_value;
> -    return object_error::success;
> -  default:
> -    ESec = EF.getSection(ESym);
> -  }
> -
> -  switch (ESym->getType()) {
> -  case ELF::STT_SECTION:
> -    Result = ESec ? ESec->sh_offset : UnknownAddressOrSize;
> -    return object_error::success;
> -  case ELF::STT_FUNC:
> -  case ELF::STT_OBJECT:
> -  case ELF::STT_NOTYPE:
> -    Result = ESym->st_value + (ESec ? ESec->sh_offset : 0);
> -    return object_error::success;
> -  default:
> -    Result = UnknownAddressOrSize;
> -    return object_error::success;
> -  }
> -}
> -
> -template <class ELFT>
> error_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb,
>                                                  uint64_t &Result) const {
>   const Elf_Sym *ESym = getSymbol(Symb);
> 
> Modified: llvm/trunk/include/llvm/Object/MachO.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachO.h?rev=205508&r1=205507&r2=205508&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/MachO.h (original)
> +++ llvm/trunk/include/llvm/Object/MachO.h Wed Apr  2 22:13:33 2014
> @@ -62,8 +62,6 @@ public:
>   void moveSymbolNext(DataRefImpl &Symb) const override;
>   error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const override;
>   error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const override;
> -  error_code getSymbolFileOffset(DataRefImpl Symb,
> -                                 uint64_t &Res) const override;
>   error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const override;
>   error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override;
>   error_code getSymbolType(DataRefImpl Symb,
> 
> Modified: llvm/trunk/include/llvm/Object/ObjectFile.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=205508&r1=205507&r2=205508&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/ObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/ObjectFile.h Wed Apr  2 22:13:33 2014
> @@ -228,7 +228,6 @@ protected:
>   virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
>   error_code printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override;
>   virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const = 0;
> -  virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res)const=0;
>   virtual error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const;
>   virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
>   virtual error_code getSymbolType(DataRefImpl Symb,
> @@ -352,7 +351,30 @@ inline error_code SymbolRef::getAddress(
> }
> 
> inline error_code SymbolRef::getFileOffset(uint64_t &Result) const {
> -  return getObject()->getSymbolFileOffset(getRawDataRefImpl(), Result);
> +  uint64_t Address;
> +  if (error_code EC = getAddress(Address))
> +    return EC;
> +
> +  const ObjectFile *Obj = getObject();
> +  section_iterator SecI(Obj->section_begin());
> +  if (error_code EC = getSection(SecI))
> +    return EC;
> +
> +  uint64_t SectionAddress;
> +  if (error_code EC = SecI->getAddress(SectionAddress))
> +    return EC;
> +
> +  uint64_t OffsetInSection = Address - SectionAddress;
> +
> +  StringRef SecContents;
> +  if (error_code EC = SecI->getContents(SecContents))
> +    return EC;
> +
> +  // FIXME: this is a hack.
> +  uint64_t SectionOffset = (uint64_t)SecContents.data() - (uint64_t)Obj->base();
> +
> +  Result = SectionOffset + OffsetInSection;
> +  return object_error::success;
> }
> 
> inline error_code SymbolRef::getAlignment(uint32_t &Result) const {
> 
> Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=205508&r1=205507&r2=205508&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/COFFObjectFile.cpp Wed Apr  2 22:13:33 2014
> @@ -135,22 +135,6 @@ error_code COFFObjectFile::getSymbolName
>   return getSymbolName(Symb, Result);
> }
> 
> -error_code COFFObjectFile::getSymbolFileOffset(DataRefImpl Ref,
> -                                            uint64_t &Result) const {
> -  const coff_symbol *Symb = toSymb(Ref);
> -  const coff_section *Section = NULL;
> -  if (error_code EC = getSection(Symb->SectionNumber, Section))
> -    return EC;
> -
> -  if (Symb->SectionNumber == COFF::IMAGE_SYM_UNDEFINED)
> -    Result = UnknownAddressOrSize;
> -  else if (Section)
> -    Result = Section->PointerToRawData + Symb->Value;
> -  else
> -    Result = Symb->Value;
> -  return object_error::success;
> -}
> -
> error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,
>                                             uint64_t &Result) const {
>   const coff_symbol *Symb = toSymb(Ref);
> 
> Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=205508&r1=205507&r2=205508&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/MachOObjectFile.cpp Wed Apr  2 22:13:33 2014
> @@ -479,29 +479,6 @@ error_code MachOObjectFile::getSymbolAdd
>   return object_error::success;
> }
> 
> -error_code
> -MachOObjectFile::getSymbolFileOffset(DataRefImpl Symb,
> -                                     uint64_t &Res) const {
> -  nlist_base Entry = getSymbolTableEntryBase(this, Symb);
> -  getSymbolAddress(Symb, Res);
> -  if (Entry.n_sect) {
> -    uint64_t Delta;
> -    DataRefImpl SecRel;
> -    SecRel.d.a = Entry.n_sect-1;
> -    if (is64Bit()) {
> -      MachO::section_64 Sec = getSection64(SecRel);
> -      Delta = Sec.offset - Sec.addr;
> -    } else {
> -      MachO::section Sec = getSection(SecRel);
> -      Delta = Sec.offset - Sec.addr;
> -    }
> -
> -    Res += Delta;
> -  }
> -
> -  return object_error::success;
> -}
> -
> error_code MachOObjectFile::getSymbolAlignment(DataRefImpl DRI,
>                                                uint32_t &Result) const {
>   uint32_t flags = getSymbolFlags(DRI);
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list