de87605e7759ae6010bc309bc63456ce984a0521
[oota-llvm.git] / lib / Object / MachOObject.cpp
1 //===- 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"
11 #include "llvm/ADT/StringRef.h"
12 #include "llvm/Support/MemoryBuffer.h"
13
14 using namespace llvm;
15 using namespace object;
16
17 MachOObject::MachOObject(MemoryBuffer *Buffer_, bool IsLittleEndian_,
18                          bool Is64Bit_)
19   : Buffer(Buffer_), IsLittleEndian(IsLittleEndian_), Is64Bit(Is64Bit_) {
20 }
21
22 MachOObject *MachOObject::LoadFromBuffer(MemoryBuffer *Buffer,
23                                          std::string *ErrorStr) {
24   // 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
43   if (ErrorStr) *ErrorStr = "";
44   return Object.take();
45 }