Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/Object/MachOUniversal.cpp
//===- MachOUniversal.cpp - Mach-O universal binary -------------*- C++ -*-===// | //===- MachOUniversal.cpp - Mach-O universal binary -------------*- C++ -*-===// | ||||
// | // | ||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||||
// See https://llvm.org/LICENSE.txt for license information. | // See https://llvm.org/LICENSE.txt for license information. | ||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||
// | // | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
// | // | ||||
// This file defines the MachOUniversalBinary class. | // This file defines the MachOUniversalBinary class. | ||||
// | // | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
#include "llvm/Object/MachOUniversal.h" | #include "llvm/Object/MachOUniversal.h" | ||||
#include "llvm/Object/Archive.h" | #include "llvm/Object/Archive.h" | ||||
#include "llvm/Object/IRObjectFile.h" | |||||
#include "llvm/Object/MachO.h" | #include "llvm/Object/MachO.h" | ||||
#include "llvm/Object/ObjectFile.h" | #include "llvm/Object/ObjectFile.h" | ||||
#include "llvm/Support/Casting.h" | #include "llvm/Support/Casting.h" | ||||
#include "llvm/Support/Host.h" | #include "llvm/Support/Host.h" | ||||
#include "llvm/Support/MemoryBuffer.h" | #include "llvm/Support/MemoryBuffer.h" | ||||
using namespace llvm; | using namespace llvm; | ||||
using namespace object; | using namespace object; | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | if (Parent->getMagic() == MachO::FAT_MAGIC) { | ||||
ObjectData = ParentData.substr(Header64.offset, Header64.size); | ObjectData = ParentData.substr(Header64.offset, Header64.size); | ||||
cputype = Header64.cputype; | cputype = Header64.cputype; | ||||
} | } | ||||
StringRef ObjectName = Parent->getFileName(); | StringRef ObjectName = Parent->getFileName(); | ||||
MemoryBufferRef ObjBuffer(ObjectData, ObjectName); | MemoryBufferRef ObjBuffer(ObjectData, ObjectName); | ||||
return ObjectFile::createMachOObjectFile(ObjBuffer, cputype, Index); | return ObjectFile::createMachOObjectFile(ObjBuffer, cputype, Index); | ||||
} | } | ||||
Expected<std::unique_ptr<IRObjectFile>> | |||||
MachOUniversalBinary::ObjectForArch::getAsIRObject(LLVMContext &Ctx) const { | |||||
if (!Parent) | |||||
report_fatal_error("MachOUniversalBinary::ObjectForArch::getAsIRObject() " | |||||
"called when Parent is a nullptr"); | |||||
StringRef ParentData = Parent->getData(); | |||||
StringRef ObjectData; | |||||
if (Parent->getMagic() == MachO::FAT_MAGIC) { | |||||
ObjectData = ParentData.substr(Header.offset, Header.size); | |||||
} else { // Parent->getMagic() == MachO::FAT_MAGIC_64 | |||||
ObjectData = ParentData.substr(Header64.offset, Header64.size); | |||||
} | |||||
StringRef ObjectName = Parent->getFileName(); | |||||
MemoryBufferRef ObjBuffer(ObjectData, ObjectName); | |||||
return IRObjectFile::create(ObjBuffer, Ctx); | |||||
} | |||||
Expected<std::unique_ptr<Archive>> | Expected<std::unique_ptr<Archive>> | ||||
MachOUniversalBinary::ObjectForArch::getAsArchive() const { | MachOUniversalBinary::ObjectForArch::getAsArchive() const { | ||||
if (!Parent) | if (!Parent) | ||||
report_fatal_error("MachOUniversalBinary::ObjectForArch::getAsArchive() " | report_fatal_error("MachOUniversalBinary::ObjectForArch::getAsArchive() " | ||||
"called when Parent is a nullptr"); | "called when Parent is a nullptr"); | ||||
StringRef ParentData = Parent->getData(); | StringRef ParentData = Parent->getData(); | ||||
StringRef ObjectData; | StringRef ObjectData; | ||||
▲ Show 20 Lines • Show All 138 Lines • ▼ Show 20 Lines | |||||
Expected<std::unique_ptr<MachOObjectFile>> | Expected<std::unique_ptr<MachOObjectFile>> | ||||
MachOUniversalBinary::getMachOObjectForArch(StringRef ArchName) const { | MachOUniversalBinary::getMachOObjectForArch(StringRef ArchName) const { | ||||
Expected<ObjectForArch> O = getObjectForArch(ArchName); | Expected<ObjectForArch> O = getObjectForArch(ArchName); | ||||
if (!O) | if (!O) | ||||
return O.takeError(); | return O.takeError(); | ||||
return O->getAsObjectFile(); | return O->getAsObjectFile(); | ||||
} | } | ||||
Expected<std::unique_ptr<IRObjectFile>> | |||||
MachOUniversalBinary::getIRObjectForArch(StringRef ArchName, | |||||
LLVMContext &Ctx) const { | |||||
Expected<ObjectForArch> O = getObjectForArch(ArchName); | |||||
if (!O) | |||||
return O.takeError(); | |||||
return O->getAsIRObject(Ctx); | |||||
} | |||||
Expected<std::unique_ptr<Archive>> | Expected<std::unique_ptr<Archive>> | ||||
MachOUniversalBinary::getArchiveForArch(StringRef ArchName) const { | MachOUniversalBinary::getArchiveForArch(StringRef ArchName) const { | ||||
Expected<ObjectForArch> O = getObjectForArch(ArchName); | Expected<ObjectForArch> O = getObjectForArch(ArchName); | ||||
if (!O) | if (!O) | ||||
return O.takeError(); | return O.takeError(); | ||||
return O->getAsArchive(); | return O->getAsArchive(); | ||||
} | } |