Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/JITLink/MachO.cpp
35271 views
//===-------------- MachO.cpp - JIT linker function for MachO -------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// MachO jit-link function.9//10//===----------------------------------------------------------------------===//1112#include "llvm/ExecutionEngine/JITLink/MachO.h"1314#include "llvm/BinaryFormat/MachO.h"15#include "llvm/ExecutionEngine/JITLink/MachO_arm64.h"16#include "llvm/ExecutionEngine/JITLink/MachO_x86_64.h"17#include "llvm/Support/Format.h"18#include "llvm/Support/MemoryBuffer.h"19#include "llvm/Support/SwapByteOrder.h"2021using namespace llvm;2223#define DEBUG_TYPE "jitlink"2425namespace llvm {26namespace jitlink {2728Expected<std::unique_ptr<LinkGraph>>29createLinkGraphFromMachOObject(MemoryBufferRef ObjectBuffer) {30StringRef Data = ObjectBuffer.getBuffer();31if (Data.size() < 4)32return make_error<JITLinkError>("Truncated MachO buffer \"" +33ObjectBuffer.getBufferIdentifier() + "\"");3435uint32_t Magic;36memcpy(&Magic, Data.data(), sizeof(uint32_t));37LLVM_DEBUG({38dbgs() << "jitLink_MachO: magic = " << format("0x%08" PRIx32, Magic)39<< ", identifier = \"" << ObjectBuffer.getBufferIdentifier()40<< "\"\n";41});4243if (Magic == MachO::MH_MAGIC || Magic == MachO::MH_CIGAM)44return make_error<JITLinkError>("MachO 32-bit platforms not supported");45else if (Magic == MachO::MH_MAGIC_64 || Magic == MachO::MH_CIGAM_64) {4647if (Data.size() < sizeof(MachO::mach_header_64))48return make_error<JITLinkError>("Truncated MachO buffer \"" +49ObjectBuffer.getBufferIdentifier() +50"\"");5152// Read the CPU type from the header.53uint32_t CPUType;54memcpy(&CPUType, Data.data() + 4, sizeof(uint32_t));55if (Magic == MachO::MH_CIGAM_64)56CPUType = llvm::byteswap<uint32_t>(CPUType);5758LLVM_DEBUG({59dbgs() << "jitLink_MachO: cputype = " << format("0x%08" PRIx32, CPUType)60<< "\n";61});6263switch (CPUType) {64case MachO::CPU_TYPE_ARM64:65return createLinkGraphFromMachOObject_arm64(ObjectBuffer);66case MachO::CPU_TYPE_X86_64:67return createLinkGraphFromMachOObject_x86_64(ObjectBuffer);68}69return make_error<JITLinkError>("MachO-64 CPU type not valid");70} else71return make_error<JITLinkError>("Unrecognized MachO magic value");72}7374void link_MachO(std::unique_ptr<LinkGraph> G,75std::unique_ptr<JITLinkContext> Ctx) {7677switch (G->getTargetTriple().getArch()) {78case Triple::aarch64:79return link_MachO_arm64(std::move(G), std::move(Ctx));80case Triple::x86_64:81return link_MachO_x86_64(std::move(G), std::move(Ctx));82default:83Ctx->notifyFailed(make_error<JITLinkError>("MachO-64 CPU type not valid"));84return;85}86}8788} // end namespace jitlink89} // end namespace llvm909192