//= loongarch.h - Generic JITLink loongarch edge kinds, utilities -*- 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 utilities for graphs representing loongarch objects. // //===----------------------------------------------------------------------===// #ifndef LLVM_EXECUTIONENGINE_JITLINK_LOONGARCH_H #define LLVM_EXECUTIONENGINE_JITLINK_LOONGARCH_H #include "TableManager.h" #include "llvm/ExecutionEngine/JITLink/JITLink.h" #include "llvm/ExecutionEngine/Orc/Shared/MemoryFlags.h" namespace llvm { namespace jitlink { namespace loongarch { /// Represents loongarch fixups. enum EdgeKind_loongarch : Edge::Kind { … }; /// Returns a string name for the given loongarch edge. For debugging purposes /// only. const char *getEdgeKindName(Edge::Kind K); // Returns extract bits Val[Hi:Lo]. inline uint32_t extractBits(uint32_t Val, unsigned Hi, unsigned Lo) { … } /// Apply fixup expression for edge to block content. inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E) { … } /// loongarch null pointer content. extern const char NullPointerContent[8]; inline ArrayRef<char> getGOTEntryBlockContent(LinkGraph &G) { … } /// loongarch stub content. /// /// Contains the instruction sequence for an indirect jump via an in-memory /// pointer: /// pcalau12i $t8, %page20(ptr) /// ld.[w/d] $t8, %pageoff12(ptr) /// jr $t8 constexpr size_t StubEntrySize = …; extern const uint8_t LA64StubContent[StubEntrySize]; extern const uint8_t LA32StubContent[StubEntrySize]; inline ArrayRef<char> getStubBlockContent(LinkGraph &G) { … } /// Creates a new pointer block in the given section and returns an /// Anonymous symbol pointing to it. /// /// If InitialTarget is given then an Pointer64 relocation will be added to the /// block pointing at InitialTarget. /// /// The pointer block will have the following default values: /// alignment: PointerSize /// alignment-offset: 0 inline Symbol &createAnonymousPointer(LinkGraph &G, Section &PointerSection, Symbol *InitialTarget = nullptr, uint64_t InitialAddend = 0) { … } /// Create a jump stub that jumps via the pointer at the given symbol and /// an anonymous symbol pointing to it. Return the anonymous symbol. inline Symbol &createAnonymousPointerJumpStub(LinkGraph &G, Section &StubSection, Symbol &PointerSymbol) { … } /// Global Offset Table Builder. class GOTTableManager : public TableManager<GOTTableManager> { … }; /// Procedure Linkage Table Builder. class PLTTableManager : public TableManager<PLTTableManager> { … }; } // namespace loongarch } // namespace jitlink } // namespace llvm #endif