[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