Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/JITLink/XCOFF_ppc64.cpp
213799 views
//===------- XCOFF_ppc64.cpp -JIT linker implementation for XCOFF/ppc641//-------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// XCOFF/ppc64 jit-link implementation.10//11//===----------------------------------------------------------------------===//1213#include "llvm/ExecutionEngine/JITLink/XCOFF_ppc64.h"14#include "JITLinkGeneric.h"15#include "XCOFFLinkGraphBuilder.h"16#include "llvm/ADT/bit.h"17#include "llvm/ExecutionEngine/JITLink/JITLink.h"18#include "llvm/ExecutionEngine/JITLink/ppc64.h"19#include "llvm/Object/ObjectFile.h"20#include "llvm/Object/XCOFFObjectFile.h"21#include "llvm/Support/Error.h"22#include "llvm/Support/ErrorHandling.h"23#include <system_error>2425using namespace llvm;2627#define DEBUG_TYPE "jitlink"2829namespace llvm {30namespace jitlink {3132Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromXCOFFObject_ppc64(33MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) {34LLVM_DEBUG({35dbgs() << "Building jitlink graph for new input "36<< ObjectBuffer.getBufferIdentifier() << "...\n";37});3839auto Obj = object::ObjectFile::createObjectFile(ObjectBuffer);40if (!Obj)41return Obj.takeError();42assert((**Obj).isXCOFF() && "Expects and XCOFF Object");4344auto Features = (*Obj)->getFeatures();45if (!Features)46return Features.takeError();47LLVM_DEBUG({48dbgs() << " Features: ";49(*Features).print(dbgs());50});5152return XCOFFLinkGraphBuilder(cast<object::XCOFFObjectFile>(**Obj),53std::move(SSP), Triple("powerpc64-ibm-aix"),54std::move(*Features), ppc64::getEdgeKindName)55.buildGraph();56}5758class XCOFFJITLinker_ppc64 : public JITLinker<XCOFFJITLinker_ppc64> {59using JITLinkerBase = JITLinker<XCOFFJITLinker_ppc64>;60friend JITLinkerBase;6162public:63XCOFFJITLinker_ppc64(std::unique_ptr<JITLinkContext> Ctx,64std::unique_ptr<LinkGraph> G,65PassConfiguration PassConfig)66: JITLinkerBase(std::move(Ctx), std::move(G), std::move(PassConfig)) {67// FIXME: Post allocation pass define TOC base, this is temporary to support68// building until we can build the required toc entries69defineTOCSymbol(getGraph());70}7172Error applyFixup(LinkGraph &G, Block &B, const Edge &E) const {73LLVM_DEBUG(dbgs() << " Applying fixup for " << G.getName()74<< ", address = " << B.getAddress()75<< ", target = " << E.getTarget().getName() << ", kind = "76<< ppc64::getEdgeKindName(E.getKind()) << "\n");77switch (E.getKind()) {78case ppc64::Pointer64:79if (auto Err = ppc64::applyFixup<endianness::big>(G, B, E, TOCSymbol))80return Err;81break;82default:83return make_error<StringError>("Unsupported relocation type",84std::error_code());85}86return Error::success();87}8889private:90void defineTOCSymbol(LinkGraph &G) {91for (Symbol *S : G.defined_symbols()) {92if (S->hasName() && *S->getName() == StringRef("TOC")) {93TOCSymbol = S;94return;95}96}97llvm_unreachable("LinkGraph does not contan an TOC Symbol");98}99100private:101Symbol *TOCSymbol = nullptr;102};103104void link_XCOFF_ppc64(std::unique_ptr<LinkGraph> G,105std::unique_ptr<JITLinkContext> Ctx) {106// Ctx->notifyFailed(make_error<StringError>(107// "link_XCOFF_ppc64 is not implemented", std::error_code()));108109PassConfiguration Config;110111// Pass insertions112113if (auto Err = Ctx->modifyPassConfig(*G, Config))114return Ctx->notifyFailed(std::move(Err));115116XCOFFJITLinker_ppc64::link(std::move(Ctx), std::move(G), std::move(Config));117}118119} // namespace jitlink120} // namespace llvm121122123