diff options
-rw-r--r-- | include/llvm/Object/Archive.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/Binary.h | 44 | ||||
-rw-r--r-- | include/llvm/Object/COFF.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/ELF.h | 6 | ||||
-rw-r--r-- | include/llvm/Object/MachO.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/ObjectFile.h | 3 | ||||
-rw-r--r-- | lib/Object/Archive.cpp | 2 | ||||
-rw-r--r-- | lib/Object/COFFObjectFile.cpp | 2 | ||||
-rw-r--r-- | lib/Object/MachOObjectFile.cpp | 2 |
9 files changed, 48 insertions, 17 deletions
diff --git a/include/llvm/Object/Archive.h b/include/llvm/Object/Archive.h index e6df856..358b27a 100644 --- a/include/llvm/Object/Archive.h +++ b/include/llvm/Object/Archive.h @@ -131,7 +131,7 @@ public: // Cast methods. static inline bool classof(Archive const *v) { return true; } static inline bool classof(Binary const *v) { - return v->getType() == Binary::isArchive; + return v->isArchive(); } private: diff --git a/include/llvm/Object/Binary.h b/include/llvm/Object/Binary.h index cd092fd..81cdd32 100644 --- a/include/llvm/Object/Binary.h +++ b/include/llvm/Object/Binary.h @@ -37,16 +37,25 @@ protected: Binary(unsigned int Type, MemoryBuffer *Source); enum { - isArchive, - + ID_Archive, // Object and children. - isObject, - isCOFF, - isELF, - isMachO, - lastObject + ID_StartObjects, + ID_COFF, + ID_ELF32L, // ELF 32-bit, little endian + ID_ELF32B, // ELF 32-bit, big endian + 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: virtual ~Binary(); @@ -56,6 +65,27 @@ public: // Cast methods. unsigned int getType() const { return TypeID; } 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); diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 4f90187..fc33ab1 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -179,7 +179,7 @@ public: error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const; static inline bool classof(const Binary *v) { - return v->getType() == isCOFF; + return v->isCOFF(); } static inline bool classof(const COFFObjectFile *v) { return true; } }; diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index e746b0a..e27a23e 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -484,7 +484,8 @@ public: // Methods for type inquiry through isa, cast, and dyn_cast bool isDyldType() const { return isDyldELFObject; } 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; } }; @@ -1257,7 +1258,8 @@ void ELFObjectFile<target_endianness, is64Bits> template<support::endianness target_endianness, bool is64Bits> ELFObjectFile<target_endianness, is64Bits>::ELFObjectFile(MemoryBuffer *Object , error_code &ec) - : ObjectFile(Binary::isELF, Object, ec) + : ObjectFile(getELFType(target_endianness == support::little, is64Bits), + Object, ec) , isDyldELFObject(false) , SectionHeaderTable(0) , dot_shstrtab_sec(0) diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 1aae85a..1e409b2 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -47,7 +47,7 @@ public: MachOObject *getObject() { return MachOObj; } static inline bool classof(const Binary *v) { - return v->getType() == isMachO; + return v->isMachO(); } static inline bool classof(const MachOObjectFile *v) { return true; } diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index 1e9d895..09eb7fc 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -372,8 +372,7 @@ public: static ObjectFile *createObjectFile(MemoryBuffer *Object); static inline bool classof(const Binary *v) { - return v->getType() >= isObject && - v->getType() < lastObject; + return v->isObject(); } static inline bool classof(const ObjectFile *v) { return true; } diff --git a/lib/Object/Archive.cpp b/lib/Object/Archive.cpp index b67377c..c5f15ba 100644 --- a/lib/Object/Archive.cpp +++ b/lib/Object/Archive.cpp @@ -174,7 +174,7 @@ error_code Archive::Child::getAsBinary(OwningPtr<Binary> &Result) const { } Archive::Archive(MemoryBuffer *source, error_code &ec) - : Binary(Binary::isArchive, source) { + : Binary(Binary::ID_Archive, source) { // Check for sufficient magic. if (!source || source->getBufferSize() < (8 + sizeof(ArchiveMemberHeader) + 2) // Smallest archive. diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index a3fdd5b..fe22242 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -421,7 +421,7 @@ relocation_iterator COFFObjectFile::getSectionRelEnd(DataRefImpl Sec) const { } COFFObjectFile::COFFObjectFile(MemoryBuffer *Object, error_code &ec) - : ObjectFile(Binary::isCOFF, Object, ec) + : ObjectFile(Binary::ID_COFF, Object, ec) , Header(0) , SectionTable(0) , SymbolTable(0) diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 655c40a..819409e 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -30,7 +30,7 @@ namespace object { MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO, error_code &ec) - : ObjectFile(Binary::isMachO, Object, ec), + : ObjectFile(Binary::ID_MachO, Object, ec), MachOObj(MOO), RegisteredStringTable(std::numeric_limits<uint32_t>::max()) { DataRefImpl DRI; |