003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/lib/ExecutionEngine/JITLink
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
lib
/
ExecutionEngine
/
JITLink
/
📁
..
📄
BasicGOTAndStubsBuilder.h
(3.5 KB)
📄
EHFrameSupport.cpp
(26.88 KB)
📄
EHFrameSupportImpl.h
(3.58 KB)
📄
ELF.cpp
(1.5 KB)
📄
ELF_x86_64.cpp
(15.48 KB)
📄
JITLink.cpp
(9.13 KB)
📄
JITLinkGeneric.cpp
(15.52 KB)
📄
JITLinkGeneric.h
(6.03 KB)
📄
JITLinkMemoryManager.cpp
(4.74 KB)
📄
MachO.cpp
(2.85 KB)
📄
MachOLinkGraphBuilder.cpp
(20 KB)
📄
MachOLinkGraphBuilder.h
(7.66 KB)
📄
MachO_arm64.cpp
(26.08 KB)
📄
MachO_x86_64.cpp
(25.74 KB)
Editing: BasicGOTAndStubsBuilder.h
//===--- BasicGOTAndStubsBuilder.h - Generic GOT/Stub creation --*- 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 // //===----------------------------------------------------------------------===// // // A base for simple GOT and stub creation. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_EXECUTIONENGINE_JITLINK_BASICGOTANDSTUBSBUILDER_H #define LLVM_LIB_EXECUTIONENGINE_JITLINK_BASICGOTANDSTUBSBUILDER_H #include "llvm/ExecutionEngine/JITLink/JITLink.h" #define DEBUG_TYPE "jitlink" namespace llvm { namespace jitlink { template <typename BuilderImpl> class BasicGOTAndStubsBuilder { public: BasicGOTAndStubsBuilder(LinkGraph &G) : G(G) {} void run() { // We're going to be adding new blocks, but we don't want to iterate over // the newly added ones, so just copy the existing blocks out. std::vector<Block *> Blocks(G.blocks().begin(), G.blocks().end()); LLVM_DEBUG(dbgs() << "Creating GOT entries and stubs:\n"); for (auto *B : Blocks) for (auto &E : B->edges()) if (impl().isGOTEdge(E)) { LLVM_DEBUG({ dbgs() << " Updating GOT edge "; printEdge(dbgs(), *B, E, "<target GOT>"); dbgs() << "\n"; }); impl().fixGOTEdge(E, getGOTEntrySymbol(E.getTarget())); } else if (impl().isExternalBranchEdge(E)) { LLVM_DEBUG({ dbgs() << " Updating external branch edge "; printEdge(dbgs(), *B, E, "<target PC-rel>"); dbgs() << "\n"; }); impl().fixExternalBranchEdge(E, getStubSymbol(E.getTarget())); } } protected: Symbol &getGOTEntrySymbol(Symbol &Target) { assert(Target.hasName() && "GOT edge cannot point to anonymous target"); auto GOTEntryI = GOTEntries.find(Target.getName()); // Build the entry if it doesn't exist. if (GOTEntryI == GOTEntries.end()) { auto &GOTEntry = impl().createGOTEntry(Target); LLVM_DEBUG({ dbgs() << " Created GOT entry for " << Target.getName() << ": " << GOTEntry << "\n"; }); GOTEntryI = GOTEntries.insert(std::make_pair(Target.getName(), &GOTEntry)).first; } assert(GOTEntryI != GOTEntries.end() && "Could not get GOT entry symbol"); LLVM_DEBUG( { dbgs() << " Using GOT entry " << *GOTEntryI->second << "\n"; }); return *GOTEntryI->second; } Symbol &getStubSymbol(Symbol &Target) { assert(Target.hasName() && "External branch edge can not point to an anonymous target"); auto StubI = Stubs.find(Target.getName()); if (StubI == Stubs.end()) { auto &StubSymbol = impl().createStub(Target); LLVM_DEBUG({ dbgs() << " Created stub for " << Target.getName() << ": " << StubSymbol << "\n"; }); StubI = Stubs.insert(std::make_pair(Target.getName(), &StubSymbol)).first; } assert(StubI != Stubs.end() && "Count not get stub symbol"); LLVM_DEBUG({ dbgs() << " Using stub " << *StubI->second << "\n"; }); return *StubI->second; } LinkGraph &G; private: BuilderImpl &impl() { return static_cast<BuilderImpl &>(*this); } DenseMap<StringRef, Symbol *> GOTEntries; DenseMap<StringRef, Symbol *> Stubs; }; } // end namespace jitlink } // end namespace llvm #endif // LLVM_LIB_EXECUTIONENGINE_JITLINK_BASICGOTANDSTUBSBUILDER_H
Upload File
Create Folder