Binary.h revision 276479
1//===- Binary.h - A generic binary file -------------------------*- C++ -*-===//
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// This file declares the Binary class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_OBJECT_BINARY_H
15#define LLVM_OBJECT_BINARY_H
16
17#include "llvm/Object/Error.h"
18#include "llvm/Support/ErrorOr.h"
19#include "llvm/Support/FileSystem.h"
20
21namespace llvm {
22
23class LLVMContext;
24class MemoryBuffer;
25class StringRef;
26
27namespace object {
28
29class Binary {
30private:
31  Binary() LLVM_DELETED_FUNCTION;
32  Binary(const Binary &other) LLVM_DELETED_FUNCTION;
33
34  unsigned int TypeID;
35
36protected:
37  std::unique_ptr<MemoryBuffer> Data;
38
39  Binary(unsigned int Type, std::unique_ptr<MemoryBuffer> Source);
40
41  enum {
42    ID_Archive,
43    ID_MachOUniversalBinary,
44    ID_IR, // LLVM IR
45
46    // Object and children.
47    ID_StartObjects,
48    ID_COFF,
49
50    ID_ELF32L, // ELF 32-bit, little endian
51    ID_ELF32B, // ELF 32-bit, big endian
52    ID_ELF64L, // ELF 64-bit, little endian
53    ID_ELF64B, // ELF 64-bit, big endian
54
55    ID_MachO32L, // MachO 32-bit, little endian
56    ID_MachO32B, // MachO 32-bit, big endian
57    ID_MachO64L, // MachO 64-bit, little endian
58    ID_MachO64B, // MachO 64-bit, big endian
59
60    ID_EndObjects
61  };
62
63  static inline unsigned int getELFType(bool isLE, bool is64Bits) {
64    if (isLE)
65      return is64Bits ? ID_ELF64L : ID_ELF32L;
66    else
67      return is64Bits ? ID_ELF64B : ID_ELF32B;
68  }
69
70  static unsigned int getMachOType(bool isLE, bool is64Bits) {
71    if (isLE)
72      return is64Bits ? ID_MachO64L : ID_MachO32L;
73    else
74      return is64Bits ? ID_MachO64B : ID_MachO32B;
75  }
76
77public:
78  virtual ~Binary();
79
80  StringRef getData() const;
81  MemoryBuffer *releaseBuffer() { return Data.release(); }
82  StringRef getFileName() const;
83
84  // Cast methods.
85  unsigned int getType() const { return TypeID; }
86
87  // Convenience methods
88  bool isObject() const {
89    return TypeID > ID_StartObjects && TypeID < ID_EndObjects;
90  }
91
92  bool isSymbolic() const {
93    return isIR() || isObject();
94  }
95
96  bool isArchive() const {
97    return TypeID == ID_Archive;
98  }
99
100  bool isMachOUniversalBinary() const {
101    return TypeID == ID_MachOUniversalBinary;
102  }
103
104  bool isELF() const {
105    return TypeID >= ID_ELF32L && TypeID <= ID_ELF64B;
106  }
107
108  bool isMachO() const {
109    return TypeID >= ID_MachO32L && TypeID <= ID_MachO64B;
110  }
111
112  bool isCOFF() const {
113    return TypeID == ID_COFF;
114  }
115
116  bool isIR() const {
117    return TypeID == ID_IR;
118  }
119
120  bool isLittleEndian() const {
121    return !(TypeID == ID_ELF32B || TypeID == ID_ELF64B ||
122             TypeID == ID_MachO32B || TypeID == ID_MachO64B);
123  }
124};
125
126/// @brief Create a Binary from Source, autodetecting the file type.
127///
128/// @param Source The data to create the Binary from.
129ErrorOr<Binary *> createBinary(std::unique_ptr<MemoryBuffer> Source,
130                               LLVMContext *Context = nullptr);
131
132ErrorOr<Binary *> createBinary(StringRef Path);
133}
134}
135
136#endif
137