blob: de87605e7759ae6010bc309bc63456ce984a0521 [file] [log] [blame]
Daniel Dunbarfbd25b72010-11-27 05:38:50 +00001//===- MachOObject.cpp - Mach-O Object File Wrapper -----------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Object/MachOObject.h"
Daniel Dunbar95369162010-11-27 06:39:22 +000011#include "llvm/ADT/StringRef.h"
Daniel Dunbarfbd25b72010-11-27 05:38:50 +000012#include "llvm/Support/MemoryBuffer.h"
13
14using namespace llvm;
15using namespace object;
16
Daniel Dunbar95369162010-11-27 06:39:22 +000017MachOObject::MachOObject(MemoryBuffer *Buffer_, bool IsLittleEndian_,
18 bool Is64Bit_)
19 : Buffer(Buffer_), IsLittleEndian(IsLittleEndian_), Is64Bit(Is64Bit_) {
Daniel Dunbarfbd25b72010-11-27 05:38:50 +000020}
21
22MachOObject *MachOObject::LoadFromBuffer(MemoryBuffer *Buffer,
23 std::string *ErrorStr) {
Daniel Dunbar95369162010-11-27 06:39:22 +000024 // First, check the magic value and initialize the basic object info.
25 bool IsLittleEndian = false, Is64Bit = false;
26 StringRef Magic = Buffer->getBuffer().slice(0, 4);
27 if (Magic == "\xFE\xED\xFA\xCE") {
28 } else if (Magic == "\xCE\xFA\xED\xFE") {
29 IsLittleEndian = true;
30 } else if (Magic == "\xFE\xED\xFA\xCF") {
31 Is64Bit = true;
32 } else if (Magic == "\xCF\xFA\xED\xFE") {
33 IsLittleEndian = true;
34 Is64Bit = true;
35 } else {
36 *ErrorStr = "not a Mach object file";
37 return 0;
38 }
39
40 OwningPtr<MachOObject> Object(new MachOObject(Buffer, IsLittleEndian,
41 Is64Bit));
42
Daniel Dunbarfbd25b72010-11-27 05:38:50 +000043 if (ErrorStr) *ErrorStr = "";
Daniel Dunbar95369162010-11-27 06:39:22 +000044 return Object.take();
Daniel Dunbarfbd25b72010-11-27 05:38:50 +000045}