blob: c6481170637c2941ab67815d755eadafdf440f9d [file] [log] [blame]
//===----- XCOFFLinkGraphBuilder.h - XCOFF LinkGraph builder ----*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Generic XCOFF LinkGraph building code.
//
//===----------------------------------------------------------------------===//
#ifndef LIB_EXECUTIONENGINE_JITLINK_XCOFFLINKGRAPHBUILDER_H
#define LIB_EXECUTIONENGINE_JITLINK_XCOFFLINKGRAPHBUILDER_H
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
#include "llvm/ExecutionEngine/Orc/SymbolStringPool.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Object/XCOFFObjectFile.h"
#include "llvm/TargetParser/SubtargetFeature.h"
#include <memory>
namespace llvm {
namespace jitlink {
class XCOFFLinkGraphBuilder {
public:
virtual ~XCOFFLinkGraphBuilder() = default;
Expected<std::unique_ptr<LinkGraph>> buildGraph();
public:
XCOFFLinkGraphBuilder(const object::XCOFFObjectFile &Obj,
std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT,
SubtargetFeatures Features,
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName);
LinkGraph &getGraph() const { return *G; }
const object::XCOFFObjectFile &getObject() const { return Obj; }
private:
Error processSections();
Error processCsectsAndSymbols();
Error processRelocations();
private:
const object::XCOFFObjectFile &Obj;
std::unique_ptr<LinkGraph> G;
Section *UndefSection;
struct SectionEntry {
jitlink::Section *Section;
object::SectionRef SectionData;
};
DenseMap<uint16_t, SectionEntry> SectionTable;
DenseMap<uint32_t, Block *> CsectTable;
DenseMap<uint32_t, Symbol *> SymbolIndexTable;
};
} // namespace jitlink
} // namespace llvm
#endif // LIB_EXECUTIONENGINE_JITLINK_XCOFFLINKGRAPHBUILDER_H