[llvm-commits] [llvm] r142315 - in /llvm/trunk: include/llvm/Object/COFF.h lib/Object/COFFObjectFile.cpp

Joe Abbey jabbey at arxan.com
Mon Oct 17 20:56:40 PDT 2011


Michael,

index will never be < 0, since it is uint32_t.

Perhaps remove the check index >= 0?

Granted, storage class and section number values can be "negative", but I don't think indexes will be.  Unless as you've coded an index is produced >= NumberOfSymbols.

error_code COFFObjectFile::getSymbol(uint32_t index,
                                     const coff_symbol *&Result) const {
  if (index < Header->NumberOfSymbols)
    Result = SymbolTable + index;
  else
    return object_error::parse_failed;
  return object_error::success;
}


Cheers,

Joe Abbey
Software Architect
Arxan Technologies, Inc.
1305 Cumberland Ave, Ste 215
West Lafayette, IN 47906
jabbey at arxan.com
www.arxan.com

On Oct 17, 2011, at 7:53 PM, Michael J. Spencer wrote:

> Author: mspencer
> Date: Mon Oct 17 18:53:56 2011
> New Revision: 142315
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=142315&view=rev
> Log:
> Object/COFF: Expose more data in the public API.
> 
> Modified:
>    llvm/trunk/include/llvm/Object/COFF.h
>    llvm/trunk/lib/Object/COFFObjectFile.cpp
> 
> Modified: llvm/trunk/include/llvm/Object/COFF.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=142315&r1=142314&r2=142315&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/COFF.h (original)
> +++ llvm/trunk/include/llvm/Object/COFF.h Mon Oct 17 18:53:56 2011
> @@ -73,6 +73,16 @@
>   support::ulittle16_t Type;
> };
> 
> +struct coff_aux_section_definition {
> +  support::ulittle32_t Length;
> +  support::ulittle16_t NumberOfRelocations;
> +  support::ulittle16_t NumberOfLinenumbers;
> +  support::ulittle32_t CheckSum;
> +  support::ulittle16_t Number;
> +  support::ulittle8_t Selection;
> +  char Unused[3];
> +};
> +
> class COFFObjectFile : public ObjectFile {
> private:
>   const coff_file_header *Header;
> @@ -81,11 +91,7 @@
>   const char             *StringTable;
>         uint32_t          StringTableSize;
> 
> -        error_code        getSection(int32_t index,
> -                                     const coff_section *&Res) const;
>         error_code        getString(uint32_t offset, StringRef &Res) const;
> -        error_code        getSymbol(uint32_t index,
> -                                    const coff_symbol *&Res) const;
> 
>   const coff_symbol      *toSymb(DataRefImpl Symb) const;
>   const coff_section     *toSec(DataRefImpl Sec) const;
> @@ -142,6 +148,17 @@
>   virtual StringRef getFileFormatName() const;
>   virtual unsigned getArch() const;
> 
> +  error_code getHeader(const coff_file_header *&Res) const;
> +  error_code getSection(int32_t index, const coff_section *&Res) const;
> +  error_code getSymbol(uint32_t index, const coff_symbol *&Res) const;
> +  template <typename T>
> +  error_code getAuxSymbol(uint32_t index, const T *&Res) const {
> +    const coff_symbol *s;
> +    error_code ec = getSymbol(index, s);
> +    Res = reinterpret_cast<const T*>(s);
> +    return ec;
> +  }
> +  error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const;
> 
>   static inline bool classof(const Binary *v) {
>     return v->getType() == isCOFF;
> 
> Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=142315&r1=142314&r2=142315&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/COFFObjectFile.cpp Mon Oct 17 18:53:56 2011
> @@ -98,21 +98,7 @@
>  error_code COFFObjectFile::getSymbolName(DataRefImpl Symb,
>                                           StringRef &Result) const {
>   const coff_symbol *symb = toSymb(Symb);
> -  // Check for string table entry. First 4 bytes are 0.
> -  if (symb->Name.Offset.Zeroes == 0) {
> -    uint32_t Offset = symb->Name.Offset.Offset;
> -    if (error_code ec = getString(Offset, Result))
> -      return ec;
> -    return object_error::success;
> -  }
> -
> -  if (symb->Name.ShortName[7] == 0)
> -    // Null terminated, let ::strlen figure out the length.
> -    Result = StringRef(symb->Name.ShortName);
> -  else
> -    // Not null terminated, use all 8 bytes.
> -    Result = StringRef(symb->Name.ShortName, 8);
> -  return object_error::success;
> +  return getSymbolName(symb, Result);
> }
> 
> error_code COFFObjectFile::getSymbolOffset(DataRefImpl Symb,
> @@ -525,6 +511,11 @@
>   }
> }
> 
> +error_code COFFObjectFile::getHeader(const coff_file_header *&Res) const {
> +  Res = Header;
> +  return object_error::success;
> +}
> +
> error_code COFFObjectFile::getSection(int32_t index,
>                                       const coff_section *&Result) const {
>   // Check for special index values.
> @@ -553,13 +544,32 @@
> 
> error_code COFFObjectFile::getSymbol(uint32_t index,
>                                      const coff_symbol *&Result) const {
> -  if (index > 0 && index < Header->NumberOfSymbols)
> +  if (index >= 0 && index < Header->NumberOfSymbols)
>     Result = SymbolTable + index;
>   else
>     return object_error::parse_failed;
>   return object_error::success;
> }
> 
> +error_code COFFObjectFile::getSymbolName(const coff_symbol *symbol,
> +                                         StringRef &Res) const {
> +  // Check for string table entry. First 4 bytes are 0.
> +  if (symbol->Name.Offset.Zeroes == 0) {
> +    uint32_t Offset = symbol->Name.Offset.Offset;
> +    if (error_code ec = getString(Offset, Res))
> +      return ec;
> +    return object_error::success;
> +  }
> +
> +  if (symbol->Name.ShortName[7] == 0)
> +    // Null terminated, let ::strlen figure out the length.
> +    Res = StringRef(symbol->Name.ShortName);
> +  else
> +    // Not null terminated, use all 8 bytes.
> +    Res = StringRef(symbol->Name.ShortName, 8);
> +  return object_error::success;
> +}
> +
> const coff_relocation *COFFObjectFile::toRel(DataRefImpl Rel) const {
>   return reinterpret_cast<const coff_relocation*>(Rel.p);
> }
> 
> 
> _______________________________________________
> 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