22using namespace object;
26 std::string StringMsg =
"truncated or malformed fat file (" + Msg.
str() +
")";
27 return make_error<GenericBinaryError>(std::move(StringMsg),
28 object_error::parse_failed);
34 memcpy(&Res,
Ptr,
sizeof(
T));
43 : Parent(Parent), Index(Index) {
53 Header = getUniversalBinaryStruct<MachO::fat_arch>(HeaderPos);
57 Header64 = getUniversalBinaryStruct<MachO::fat_arch_64>(HeaderPos);
66 "called when Parent is a nullptr");
72 ObjectData = ParentData.
substr(Header.offset, Header.size);
73 cputype = Header.cputype;
75 ObjectData = ParentData.
substr(Header64.offset, Header64.size);
76 cputype = Header64.cputype;
78 StringRef ObjectName = Parent->getFileName();
87 "called when Parent is a nullptr");
92 ObjectData = ParentData.
substr(Header.offset, Header.size);
94 ObjectData = ParentData.
substr(Header64.offset, Header64.size);
96 StringRef ObjectName = Parent->getFileName();
106 "called when Parent is a nullptr");
108 StringRef ParentData = Parent->getData();
111 ObjectData = ParentData.
substr(Header.offset, Header.size);
113 ObjectData = ParentData.
substr(Header64.offset, Header64.size);
114 StringRef ObjectName = Parent->getFileName();
119void MachOUniversalBinary::anchor() { }
124 std::unique_ptr<MachOUniversalBinary> Ret(
127 return std::move(Err);
128 return std::move(Ret);
136 Err = make_error<GenericBinaryError>(
"File too small to be a Mach-O "
144 getUniversalBinaryStruct<MachO::fat_header>(Buf.
begin());
146 NumberOfObjects =
H.nfat_arch;
147 if (NumberOfObjects == 0) {
160 if (Buf.
size() < MinSize) {
163 " structs would extend past the end of the file");
166 for (
uint32_t i = 0; i < NumberOfObjects; i++) {
169 bigSize +=
A.getSize();
170 if (bigSize > Buf.
size()) {
172 Twine(
A.getCPUType()) +
") cpusubtype (" +
174 ") extends past the end of the file");
180 ") too large for cputype (" +
Twine(
A.getCPUType()) +
186 if(
A.getOffset() % (1ull <<
A.getAlign()) != 0){
188 " for cputype (" +
Twine(
A.getCPUType()) +
") cpusubtype (" +
190 ") not aligned on it's alignment (2^" +
Twine(
A.getAlign()) +
")");
193 if (
A.getOffset() < MinSize) {
196 ") offset " +
Twine(
A.getOffset()) +
" overlaps universal headers");
200 for (
uint32_t i = 0; i < NumberOfObjects; i++) {
202 for (
uint32_t j = i + 1; j < NumberOfObjects; j++) {
204 if (
A.getCPUType() ==
B.getCPUType() &&
207 Err =
malformedError(
"contains two of the same architecture (cputype "
208 "(" +
Twine(
A.getCPUType()) +
") cpusubtype (" +
212 if ((
A.getOffset() >=
B.getOffset() &&
213 A.getOffset() <
B.getOffset() +
B.getSize()) ||
214 (
A.getOffset() +
A.getSize() >
B.getOffset() &&
215 A.getOffset() +
A.getSize() <
B.getOffset() +
B.getSize()) ||
216 (
A.getOffset() <=
B.getOffset() &&
217 A.getOffset() +
A.getSize() >=
B.getOffset() +
B.getSize())) {
220 ") at offset " +
Twine(
A.getOffset()) +
" with a size of " +
221 Twine(
A.getSize()) +
", overlaps cputype (" +
Twine(
B.getCPUType()) +
223 +
") at offset " +
Twine(
B.getOffset()) +
" with a size of "
235 return make_error<GenericBinaryError>(
"Unknown architecture "
239 for (
const auto &Obj :
objects())
240 if (Obj.getArchFlagName() == ArchName)
242 return make_error<GenericBinaryError>(
"fat file does not "
252 return O.takeError();
253 return O->getAsObjectFile();
261 return O.takeError();
262 return O->getAsIRObject(Ctx);
269 return O.takeError();
270 return O->getAsArchive();
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static Error malformedError(Twine Msg)
static T getUniversalBinaryStruct(const char *Ptr)
static Error malformedError(Twine Msg)
Helper for Errors used as out-parameters.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
This is an important class for using LLVM in a threaded context.
size_t getBufferSize() const
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
constexpr size_t size() const
size - Get the string size.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
std::string str() const
Return the twine contents as a std::string.
static Expected< std::unique_ptr< Archive > > create(MemoryBufferRef Source)
StringRef getData() const
@ ID_MachOUniversalBinary
static Expected< std::unique_ptr< IRObjectFile > > create(MemoryBufferRef Object, LLVMContext &Context)
Expected< std::unique_ptr< MachOObjectFile > > getAsObjectFile() const
ObjectForArch(const MachOUniversalBinary *Parent, uint32_t Index)
Expected< std::unique_ptr< IRObjectFile > > getAsIRObject(LLVMContext &Ctx) const
Expected< std::unique_ptr< Archive > > getAsArchive() const
Expected< ObjectForArch > getObjectForArch(StringRef ArchName) const
static Expected< std::unique_ptr< MachOUniversalBinary > > create(MemoryBufferRef Source)
Expected< std::unique_ptr< IRObjectFile > > getIRObjectForArch(StringRef ArchName, LLVMContext &Ctx) const
Expected< std::unique_ptr< MachOObjectFile > > getMachOObjectForArch(StringRef ArchName) const
Expected< std::unique_ptr< Archive > > getArchiveForArch(StringRef ArchName) const
MachOUniversalBinary(MemoryBufferRef Souce, Error &Err)
uint32_t getMagic() const
iterator_range< object_iterator > objects() const
uint32_t getNumberOfObjects() const
static constexpr uint32_t MaxSectionAlignment
static Expected< std::unique_ptr< MachOObjectFile > > createMachOObjectFile(MemoryBufferRef Object, uint32_t UniversalCputype=0, uint32_t UniversalIndex=0, size_t MachOFilesetEntryOffset=0)
Create a MachOObjectFile instance from a given buffer.
static const bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.