//=== i386.h - Generic JITLink i386 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 i386 objects. // //===----------------------------------------------------------------------===// #ifndef LLVM_EXECUTIONENGINE_JITLINK_I386_H #define LLVM_EXECUTIONENGINE_JITLINK_I386_H #include "llvm/ExecutionEngine/JITLink/JITLink.h" #include "llvm/ExecutionEngine/JITLink/TableManager.h" namespace llvm::jitlink::i386 { /// Represets i386 fixups enum EdgeKind_i386 : Edge::Kind { … }; /// Returns a string name for the given i386 edge. For debugging purposes /// only const char *getEdgeKindName(Edge::Kind K); /// Apply fixup expression for edge to block content. inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E, const Symbol *GOTSymbol) { … } /// i386 pointer size. constexpr uint32_t PointerSize = …; /// i386 null pointer content. extern const char NullPointerContent[PointerSize]; /// i386 pointer jump stub content. /// /// Contains the instruction sequence for an indirect jump via an in-memory /// pointer: /// jmpq *ptr extern const char PointerJumpStubContent[6]; /// Creates a new pointer block in the given section and returns an anonymous /// symbol pointing to it. /// /// If InitialTarget is given then an Pointer32 relocation will be added to the /// block pointing at InitialTarget. /// /// The pointer block will have the following default values: /// alignment: 32-bit /// alignment-offset: 0 /// address: highest allowable (~7U) inline Symbol &createAnonymousPointer(LinkGraph &G, Section &PointerSection, Symbol *InitialTarget = nullptr, uint64_t InitialAddend = 0) { … } /// Create a jump stub block that jumps via the pointer at the given symbol. /// /// The stub block will have the following default values: /// alignment: 8-bit /// alignment-offset: 0 /// address: highest allowable: (~5U) inline Block &createPointerJumpStubBlock(LinkGraph &G, Section &StubSection, Symbol &PointerSymbol) { … } /// Create a jump stub that jumps via the pointer at the given symbol and /// an anonymous symbol pointing to it. Return the anonymous symbol. /// /// The stub block will be created by createPointerJumpStubBlock. 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> { … }; /// Optimize the GOT and Stub relocations if the edge target address is in range /// 1. PCRel32GOTLoadRelaxable. For this edge kind, if the target is in range, /// then replace GOT load with lea. (THIS IS UNIMPLEMENTED RIGHT NOW!) /// 2. BranchPCRel32ToPtrJumpStubRelaxable. For this edge kind, if the target is /// in range, replace a indirect jump by plt stub with a direct jump to the /// target Error optimizeGOTAndStubAccesses(LinkGraph &G); } // namespace llvm::jitlink::i386 #endif // LLVM_EXECUTIONENGINE_JITLINK_I386_H