diff options
author | Lang Hames <lhames@gmail.com> | 2014-07-14 23:19:50 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-07-14 23:19:50 +0000 |
commit | c832ae3eae3b22efe01ff4447a8f897ecaa83da4 (patch) | |
tree | 6eca2ad7d1a19d0d56af0eddc547ee70aa4ab77f /llvm/lib/ExecutionEngine/RuntimeDyld | |
parent | cf7c905cfb142169e4cf3f3b514b84aeff6e0845 (diff) | |
download | bcm5719-llvm-c832ae3eae3b22efe01ff4447a8f897ecaa83da4.tar.gz bcm5719-llvm-c832ae3eae3b22efe01ff4447a8f897ecaa83da4.zip |
[RuntimeDyld] Handle endiannes differences between the host and target while
reading MachO files magic numbers in RuntimeDyld.
This is required now that we're testing cross-platform JITing (via
RuntimeDyldChecker), and should fix some issues that David Fang has seen on PPC
builds.
llvm-svn: 213012
Diffstat (limited to 'llvm/lib/ExecutionEngine/RuntimeDyld')
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp index d363fd915fb..e07c5dfeee5 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp @@ -120,8 +120,21 @@ public: } }; +static uint32_t readMachOMagic(const char *InputBuffer, unsigned BufferSize) { + if (BufferSize < 4) + return 0; + StringRef Magic(InputBuffer, 4); + if (Magic == "\xFE\xED\xFA\xCE" || Magic == "\xCE\xFA\xED\xFE") + return 0xFEEDFACE; + else if (Magic == "\xFE\xED\xFA\xCF" || Magic == "\xCF\xFA\xED\xFE") + return 0xFEEDFACF; + // else + return 0; +} + ObjectImage *RuntimeDyldMachO::createObjectImage(ObjectBuffer *Buffer) { - uint32_t magic = *((const uint32_t *)Buffer->getBufferStart()); + uint32_t magic = readMachOMagic(Buffer->getBufferStart(), + Buffer->getBufferSize()); bool is64 = (magic == MachO::MH_MAGIC_64); assert((magic == MachO::MH_MAGIC_64 || magic == MachO::MH_MAGIC) && "Unrecognized Macho Magic"); @@ -136,7 +149,8 @@ ObjectImage *RuntimeDyldMachO::createObjectImageFromFile( MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(ObjFile->getData(), "", false); - uint32_t magic = *((const uint32_t *)Buffer->getBufferStart()); + uint32_t magic = readMachOMagic(Buffer->getBufferStart(), + Buffer->getBufferSize()); bool is64 = (magic == MachO::MH_MAGIC_64); assert((magic == MachO::MH_MAGIC_64 || magic == MachO::MH_MAGIC) && "Unrecognized Macho Magic"); @@ -955,18 +969,9 @@ relocation_iterator RuntimeDyldMachO::processRelocationRef( bool RuntimeDyldMachO::isCompatibleFormat(const ObjectBuffer *InputBuffer) const { - if (InputBuffer->getBufferSize() < 4) - return false; - StringRef Magic(InputBuffer->getBufferStart(), 4); - if (Magic == "\xFE\xED\xFA\xCE") - return true; - if (Magic == "\xCE\xFA\xED\xFE") - return true; - if (Magic == "\xFE\xED\xFA\xCF") - return true; - if (Magic == "\xCF\xFA\xED\xFE") - return true; - return false; + uint32_t Magic = readMachOMagic(InputBuffer->getBufferStart(), + InputBuffer->getBufferSize()); + return (Magic == 0xFEEDFACE || Magic == 0xFEEDFACF); } bool RuntimeDyldMachO::isCompatibleFile(const object::ObjectFile *Obj) const { |