diff --git a/include/llvm/Object/MachOObject.h b/include/llvm/Object/MachOObject.h index 74339cbca30..71164ac8640 100644 --- a/include/llvm/Object/MachOObject.h +++ b/include/llvm/Object/MachOObject.h @@ -43,10 +43,16 @@ public: private: OwningPtr Buffer; - -public: - MachOObject(MemoryBuffer *Buffer); + /// Whether the object is little endian. + bool IsLittleEndian; + /// Whether the object is 64-bit. + bool Is64Bit; + +private: + MachOObject(MemoryBuffer *Buffer, bool IsLittleEndian, bool Is64Bit); + +public: /// \brief Load a Mach-O object from a MemoryBuffer object. /// /// \param Buffer - The buffer to load the object from. This routine takes diff --git a/lib/Object/MachOObject.cpp b/lib/Object/MachOObject.cpp index 59468633b10..de87605e775 100644 --- a/lib/Object/MachOObject.cpp +++ b/lib/Object/MachOObject.cpp @@ -8,16 +8,38 @@ //===----------------------------------------------------------------------===// #include "llvm/Object/MachOObject.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Support/MemoryBuffer.h" using namespace llvm; using namespace object; -MachOObject::MachOObject(MemoryBuffer *Buffer_) : Buffer(Buffer_) { +MachOObject::MachOObject(MemoryBuffer *Buffer_, bool IsLittleEndian_, + bool Is64Bit_) + : Buffer(Buffer_), IsLittleEndian(IsLittleEndian_), Is64Bit(Is64Bit_) { } MachOObject *MachOObject::LoadFromBuffer(MemoryBuffer *Buffer, std::string *ErrorStr) { + // First, check the magic value and initialize the basic object info. + bool IsLittleEndian = false, Is64Bit = false; + StringRef Magic = Buffer->getBuffer().slice(0, 4); + if (Magic == "\xFE\xED\xFA\xCE") { + } else if (Magic == "\xCE\xFA\xED\xFE") { + IsLittleEndian = true; + } else if (Magic == "\xFE\xED\xFA\xCF") { + Is64Bit = true; + } else if (Magic == "\xCF\xFA\xED\xFE") { + IsLittleEndian = true; + Is64Bit = true; + } else { + *ErrorStr = "not a Mach object file"; + return 0; + } + + OwningPtr Object(new MachOObject(Buffer, IsLittleEndian, + Is64Bit)); + if (ErrorStr) *ErrorStr = ""; - return new MachOObject(Buffer); + return Object.take(); }