mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-03 19:15:30 +00:00
[Object]
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:
parent
a8eb6bb408
commit
6f9489a86f
@ -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:
|
||||||
|
@ -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);
|
||||||
|
@ -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; }
|
||||||
};
|
};
|
||||||
|
@ -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)
|
||||||
|
@ -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; }
|
||||||
|
|
||||||
|
@ -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; }
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user