163 lines · c
1//===---- llvm-jitlink.h - Session and format-specific decls ----*- C++ -*-===//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// llvm-jitlink Session class and tool utilities.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_TOOLS_LLVM_JITLINK_LLVM_JITLINK_H14#define LLVM_TOOLS_LLVM_JITLINK_LLVM_JITLINK_H15 16#include "llvm/ADT/StringSet.h"17#include "llvm/ExecutionEngine/Orc/COFF.h"18#include "llvm/ExecutionEngine/Orc/Core.h"19#include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h"20#include "llvm/ExecutionEngine/Orc/LazyObjectLinkingLayer.h"21#include "llvm/ExecutionEngine/Orc/LazyReexports.h"22#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"23#include "llvm/ExecutionEngine/Orc/RedirectionManager.h"24#include "llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h"25#include "llvm/ExecutionEngine/RuntimeDyldChecker.h"26#include "llvm/Support/Error.h"27#include "llvm/Support/Regex.h"28#include "llvm/Support/raw_ostream.h"29#include "llvm/TargetParser/SubtargetFeature.h"30#include "llvm/TargetParser/Triple.h"31 32namespace llvm {33 34struct Session {35 36 struct LazyLinkingSupport {37 LazyLinkingSupport(38 std::unique_ptr<orc::RedirectableSymbolManager> RSMgr,39 std::shared_ptr<orc::SimpleLazyReexportsSpeculator> Speculator,40 std::unique_ptr<orc::LazyReexportsManager> LRMgr,41 orc::ObjectLinkingLayer &ObjLinkingLayer)42 : RSMgr(std::move(RSMgr)), Speculator(std::move(Speculator)),43 LRMgr(std::move(LRMgr)),44 LazyObjLinkingLayer(ObjLinkingLayer, *this->LRMgr) {}45 46 std::unique_ptr<orc::RedirectableSymbolManager> RSMgr;47 std::shared_ptr<orc::SimpleLazyReexportsSpeculator> Speculator;48 std::unique_ptr<orc::LazyReexportsManager> LRMgr;49 orc::LazyObjectLinkingLayer LazyObjLinkingLayer;50 };51 52 orc::ExecutionSession ES;53 orc::JITDylib *MainJD = nullptr;54 orc::JITDylib *ProcessSymsJD = nullptr;55 orc::JITDylib *PlatformJD = nullptr;56 orc::ObjectLinkingLayer ObjLayer;57 std::unique_ptr<LazyLinkingSupport> LazyLinking;58 orc::JITDylibSearchOrder JDSearchOrder;59 SubtargetFeatures Features;60 std::vector<std::pair<std::string, orc::SymbolStringPtr>> LazyFnExecOrder;61 62 ~Session();63 64 static Expected<std::unique_ptr<Session>> Create(Triple TT,65 SubtargetFeatures Features);66 void dumpSessionInfo(raw_ostream &OS);67 void modifyPassConfig(jitlink::LinkGraph &G,68 jitlink::PassConfiguration &PassConfig);69 70 /// For -check: wait for all files that are referenced (transitively) from71 /// the entry point *file* to be linked. (ORC's usual dependence tracking is72 /// to fine-grained here: a lookup of the main symbol will return as soon as73 /// all reachable symbols have been linked, but testcases may want to74 /// inspect side-effects in unreachable symbols)..75 void waitForFilesLinkedFromEntryPointFile() {76 std::unique_lock<std::mutex> Lock(M);77 return ActiveLinksCV.wait(Lock, [this]() { return ActiveLinks == 0; });78 }79 80 using MemoryRegionInfo = RuntimeDyldChecker::MemoryRegionInfo;81 82 struct FileInfo {83 StringMap<MemoryRegionInfo> SectionInfos;84 StringMap<SmallVector<MemoryRegionInfo, 1>> StubInfos;85 StringMap<MemoryRegionInfo> GOTEntryInfos;86 87 using Symbol = jitlink::Symbol;88 using LinkGraph = jitlink::LinkGraph;89 using GetSymbolTargetFunction =90 unique_function<Expected<Symbol &>(LinkGraph &G, jitlink::Block &)>;91 Error registerGOTEntry(LinkGraph &G, Symbol &Sym,92 GetSymbolTargetFunction GetSymbolTarget);93 Error registerStubEntry(LinkGraph &G, Symbol &Sym,94 GetSymbolTargetFunction GetSymbolTarget);95 Error registerMultiStubEntry(LinkGraph &G, Symbol &Sym,96 GetSymbolTargetFunction GetSymbolTarget);97 };98 99 using DynLibJDMap = std::map<std::string, orc::JITDylib *, std::less<>>;100 using SymbolInfoMap = DenseMap<orc::SymbolStringPtr, MemoryRegionInfo>;101 using FileInfoMap = StringMap<FileInfo>;102 103 Expected<orc::JITDylib *> getOrLoadDynamicLibrary(StringRef LibPath);104 Error loadAndLinkDynamicLibrary(orc::JITDylib &JD, StringRef LibPath);105 106 orc::ObjectLayer &getLinkLayer(bool Lazy) {107 assert((!Lazy || LazyLinking) &&108 "Lazy linking requested but not available");109 return Lazy ? static_cast<orc::ObjectLayer &>(110 LazyLinking->LazyObjLinkingLayer)111 : static_cast<orc::ObjectLayer &>(ObjLayer);112 }113 114 Expected<FileInfo &> findFileInfo(StringRef FileName);115 Expected<MemoryRegionInfo &> findSectionInfo(StringRef FileName,116 StringRef SectionName);117 Expected<MemoryRegionInfo &> findStubInfo(StringRef FileName,118 StringRef TargetName,119 StringRef KindNameFilter);120 Expected<MemoryRegionInfo &> findGOTEntryInfo(StringRef FileName,121 StringRef TargetName);122 123 bool isSymbolRegistered(const orc::SymbolStringPtr &Name);124 Expected<MemoryRegionInfo &> findSymbolInfo(const orc::SymbolStringPtr &Name,125 Twine ErrorMsgStem);126 127 DynLibJDMap DynLibJDs;128 129 std::mutex M;130 std::condition_variable ActiveLinksCV;131 size_t ActiveLinks = 0;132 SymbolInfoMap SymbolInfos;133 FileInfoMap FileInfos;134 135 StringSet<> HarnessFiles;136 StringSet<> HarnessExternals;137 StringSet<> HarnessDefinitions;138 DenseMap<StringRef, StringRef> CanonicalWeakDefs;139 140 StringSet<> HiddenArchives;141 142 std::optional<Regex> ShowGraphsRegex;143 144private:145 Session(std::unique_ptr<orc::ExecutorProcessControl> EPC, Error &Err);146};147 148/// Record symbols, GOT entries, stubs, and sections for ELF file.149Error registerELFGraphInfo(Session &S, jitlink::LinkGraph &G);150 151/// Record symbols, GOT entries, stubs, and sections for MachO file.152Error registerMachOGraphInfo(Session &S, jitlink::LinkGraph &G);153 154/// Record symbols, GOT entries, stubs, and sections for COFF file.155Error registerCOFFGraphInfo(Session &S, jitlink::LinkGraph &G);156 157/// Adds a statistics gathering plugin if any stats options are used.158void enableStatistics(Session &S, bool UsingOrcRuntime);159 160} // end namespace llvm161 162#endif // LLVM_TOOLS_LLVM_JITLINK_LLVM_JITLINK_H163