Make Binary::TypeID more granular, to distinguish between ELF 32/64 little/big




git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152435 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Meyer 2012-03-09 20:41:57 +00:00
parent a8eb6bb408
commit 6f9489a86f
9 changed files with 48 additions and 17 deletions

View File

@ -131,7 +131,7 @@ public:
// Cast methods. // Cast methods.
static inline bool classof(Archive const *v) { return true; } static inline bool classof(Archive const *v) { return true; }
static inline bool classof(Binary const *v) { static inline bool classof(Binary const *v) {
return v->getType() == Binary::isArchive; return v->isArchive();
} }
private: private:

View File

@ -37,16 +37,25 @@ protected:
Binary(unsigned int Type, MemoryBuffer *Source); Binary(unsigned int Type, MemoryBuffer *Source);
enum { enum {
isArchive, ID_Archive,
// Object and children. // Object and children.
isObject, ID_StartObjects,
isCOFF, ID_COFF,
isELF, ID_ELF32L, // ELF 32-bit, little endian
isMachO, ID_ELF32B, // ELF 32-bit, big endian
lastObject ID_ELF64L, // ELF 64-bit, little endian
ID_ELF64B, // ELF 64-bit, big endian
ID_MachO,
ID_EndObjects
}; };
static inline unsigned int getELFType(bool isLittleEndian, bool is64Bits) {
if (isLittleEndian)
return is64Bits ? ID_ELF64L : ID_ELF32L;
else
return is64Bits ? ID_ELF64B : ID_ELF32B;
}
public: public:
virtual ~Binary(); virtual ~Binary();
@ -56,6 +65,27 @@ public:
// Cast methods. // Cast methods.
unsigned int getType() const { return TypeID; } unsigned int getType() const { return TypeID; }
static inline bool classof(const Binary *v) { return true; } static inline bool classof(const Binary *v) { return true; }
// Convenience methods
bool isObject() const {
return TypeID > ID_StartObjects && TypeID < ID_EndObjects;
}
bool isArchive() const {
return TypeID == ID_Archive;
}
bool isELF() const {
return TypeID >= ID_ELF32L && TypeID <= ID_ELF64B;
}
bool isMachO() const {
return TypeID == ID_MachO;
}
bool isCOFF() const {
return TypeID == ID_COFF;
}
}; };
error_code createBinary(MemoryBuffer *Source, OwningPtr<Binary> &Result); error_code createBinary(MemoryBuffer *Source, OwningPtr<Binary> &Result);

View File

@ -179,7 +179,7 @@ public:
error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const; error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const;
static inline bool classof(const Binary *v) { static inline bool classof(const Binary *v) {
return v->getType() == isCOFF; return v->isCOFF();
} }
static inline bool classof(const COFFObjectFile *v) { return true; } static inline bool classof(const COFFObjectFile *v) { return true; }
}; };

View File

@ -484,7 +484,8 @@ public:
// Methods for type inquiry through isa, cast, and dyn_cast // Methods for type inquiry through isa, cast, and dyn_cast
bool isDyldType() const { return isDyldELFObject; } bool isDyldType() const { return isDyldELFObject; }
static inline bool classof(const Binary *v) { static inline bool classof(const Binary *v) {
return v->getType() == Binary::isELF; return v->getType() == getELFType(target_endianness == support::little,
is64Bits);
} }
static inline bool classof(const ELFObjectFile *v) { return true; } static inline bool classof(const ELFObjectFile *v) { return true; }
}; };
@ -1257,7 +1258,8 @@ void ELFObjectFile<target_endianness, is64Bits>
template<support::endianness target_endianness, bool is64Bits> template<support::endianness target_endianness, bool is64Bits>
ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object
, error_code &ec) , error_code &ec)
: ObjectFile(Binary::isELF, Object, ec) : ObjectFile(getELFType(target_endianness == support::little, is64Bits),
Object, ec)
, isDyldELFObject(false) , isDyldELFObject(false)
, SectionHeaderTable(0) , SectionHeaderTable(0)
, dot_shstrtab_sec(0) , dot_shstrtab_sec(0)

View File

@ -47,7 +47,7 @@ public:
MachOObject *getObject() { return MachOObj; } MachOObject *getObject() { return MachOObj; }
static inline bool classof(const Binary *v) { static inline bool classof(const Binary *v) {
return v->getType() == isMachO; return v->isMachO();
} }
static inline bool classof(const MachOObjectFile *v) { return true; } static inline bool classof(const MachOObjectFile *v) { return true; }

View File

@ -372,8 +372,7 @@ public:
static ObjectFile *createObjectFile(MemoryBuffer *Object); static ObjectFile *createObjectFile(MemoryBuffer *Object);
static inline bool classof(const Binary *v) { static inline bool classof(const Binary *v) {
return v->getType() >= isObject && return v->isObject();
v->getType() < lastObject;
} }
static inline bool classof(const ObjectFile *v) { return true; } static inline bool classof(const ObjectFile *v) { return true; }

View File

@ -174,7 +174,7 @@ error_code Archive::Child::getAsBinary(OwningPtr<Binary> &Result) const {
} }
Archive::Archive(MemoryBuffer *source, error_code &ec) Archive::Archive(MemoryBuffer *source, error_code &ec)
: Binary(Binary::isArchive, source) { : Binary(Binary::ID_Archive, source) {
// Check for sufficient magic. // Check for sufficient magic.
if (!source || source->getBufferSize() if (!source || source->getBufferSize()
< (8 + sizeof(ArchiveMemberHeader) + 2) // Smallest archive. < (8 + sizeof(ArchiveMemberHeader) + 2) // Smallest archive.

View File

@ -421,7 +421,7 @@ relocation_iterator COFFObjectFile::getSectionRelEnd(DataRefImpl Sec) const {
} }
COFFObjectFile::COFFObjectFile(MemoryBuffer *Object, error_code &ec) COFFObjectFile::COFFObjectFile(MemoryBuffer *Object, error_code &ec)
: ObjectFile(Binary::isCOFF, Object, ec) : ObjectFile(Binary::ID_COFF, Object, ec)
, Header(0) , Header(0)
, SectionTable(0) , SectionTable(0)
, SymbolTable(0) , SymbolTable(0)

View File

@ -30,7 +30,7 @@ namespace object {
MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO, MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO,
error_code &ec) error_code &ec)
: ObjectFile(Binary::isMachO, Object, ec), : ObjectFile(Binary::ID_MachO, Object, ec),
MachOObj(MOO), MachOObj(MOO),
RegisteredStringTable(std::numeric_limits<uint32_t>::max()) { RegisteredStringTable(std::numeric_limits<uint32_t>::max()) {
DataRefImpl DRI; DataRefImpl DRI;