123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- //===---- llvm-jitlink.h - Session and format-specific decls ----*- 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
- //
- //===----------------------------------------------------------------------===//
- //
- // llvm-jitlink Session class and tool utilities.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_TOOLS_LLVM_JITLINK_LLVM_JITLINK_H
- #define LLVM_TOOLS_LLVM_JITLINK_LLVM_JITLINK_H
- #include "llvm/ADT/Optional.h"
- #include "llvm/ADT/StringSet.h"
- #include "llvm/ADT/Triple.h"
- #include "llvm/ExecutionEngine/Orc/Core.h"
- #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
- #include "llvm/ExecutionEngine/Orc/OrcRPCTargetProcessControl.h"
- #include "llvm/ExecutionEngine/Orc/Shared/FDRawByteChannel.h"
- #include "llvm/ExecutionEngine/Orc/Shared/RPCUtils.h"
- #include "llvm/ExecutionEngine/Orc/TargetProcessControl.h"
- #include "llvm/ExecutionEngine/RuntimeDyldChecker.h"
- #include "llvm/Support/Error.h"
- #include "llvm/Support/Regex.h"
- #include "llvm/Support/raw_ostream.h"
- #include <vector>
- namespace llvm {
- struct Session;
- /// ObjectLinkingLayer with additional support for symbol promotion.
- class LLVMJITLinkObjectLinkingLayer : public orc::ObjectLinkingLayer {
- public:
- using orc::ObjectLinkingLayer::add;
- LLVMJITLinkObjectLinkingLayer(Session &S,
- jitlink::JITLinkMemoryManager &MemMgr);
- Error add(orc::ResourceTrackerSP RT,
- std::unique_ptr<MemoryBuffer> O) override;
- private:
- Session &S;
- };
- using LLVMJITLinkChannel = orc::shared::FDRawByteChannel;
- using LLVMJITLinkRPCEndpoint =
- orc::shared::MultiThreadedRPCEndpoint<LLVMJITLinkChannel>;
- using LLVMJITLinkRemoteMemoryManager =
- orc::OrcRPCTPCJITLinkMemoryManager<LLVMJITLinkRPCEndpoint>;
- using LLVMJITLinkRemoteMemoryAccess =
- orc::OrcRPCTPCMemoryAccess<LLVMJITLinkRPCEndpoint>;
- class LLVMJITLinkRemoteTargetProcessControl
- : public orc::OrcRPCTargetProcessControlBase<LLVMJITLinkRPCEndpoint> {
- public:
- using BaseT = orc::OrcRPCTargetProcessControlBase<LLVMJITLinkRPCEndpoint>;
- static Expected<std::unique_ptr<TargetProcessControl>> LaunchExecutor();
- static Expected<std::unique_ptr<TargetProcessControl>> ConnectToExecutor();
- Error disconnect() override;
- private:
- using LLVMJITLinkRemoteMemoryAccess =
- orc::OrcRPCTPCMemoryAccess<LLVMJITLinkRemoteTargetProcessControl>;
- using LLVMJITLinkRemoteMemoryManager =
- orc::OrcRPCTPCJITLinkMemoryManager<LLVMJITLinkRemoteTargetProcessControl>;
- LLVMJITLinkRemoteTargetProcessControl(
- std::shared_ptr<orc::SymbolStringPool> SSP,
- std::unique_ptr<LLVMJITLinkChannel> Channel,
- std::unique_ptr<LLVMJITLinkRPCEndpoint> Endpoint,
- ErrorReporter ReportError, Error &Err)
- : BaseT(std::move(SSP), *Endpoint, std::move(ReportError)),
- Channel(std::move(Channel)), Endpoint(std::move(Endpoint)) {
- ErrorAsOutParameter _(&Err);
- ListenerThread = std::thread([&]() {
- while (!Finished) {
- if (auto Err = this->Endpoint->handleOne()) {
- reportError(std::move(Err));
- return;
- }
- }
- });
- if (auto Err2 = initializeORCRPCTPCBase()) {
- Err = joinErrors(std::move(Err2), disconnect());
- return;
- }
- OwnedMemAccess = std::make_unique<LLVMJITLinkRemoteMemoryAccess>(*this);
- MemAccess = OwnedMemAccess.get();
- OwnedMemMgr = std::make_unique<LLVMJITLinkRemoteMemoryManager>(*this);
- MemMgr = OwnedMemMgr.get();
- }
- std::unique_ptr<LLVMJITLinkChannel> Channel;
- std::unique_ptr<LLVMJITLinkRPCEndpoint> Endpoint;
- std::unique_ptr<TargetProcessControl::MemoryAccess> OwnedMemAccess;
- std::unique_ptr<jitlink::JITLinkMemoryManager> OwnedMemMgr;
- std::atomic<bool> Finished{false};
- std::thread ListenerThread;
- };
- struct Session {
- std::unique_ptr<orc::TargetProcessControl> TPC;
- orc::ExecutionSession ES;
- orc::JITDylib *MainJD;
- LLVMJITLinkObjectLinkingLayer ObjLayer;
- std::vector<orc::JITDylib *> JDSearchOrder;
- ~Session();
- static Expected<std::unique_ptr<Session>> Create(Triple TT);
- void dumpSessionInfo(raw_ostream &OS);
- void modifyPassConfig(const Triple &FTT,
- jitlink::PassConfiguration &PassConfig);
- using MemoryRegionInfo = RuntimeDyldChecker::MemoryRegionInfo;
- struct FileInfo {
- StringMap<MemoryRegionInfo> SectionInfos;
- StringMap<MemoryRegionInfo> StubInfos;
- StringMap<MemoryRegionInfo> GOTEntryInfos;
- };
- using SymbolInfoMap = StringMap<MemoryRegionInfo>;
- using FileInfoMap = StringMap<FileInfo>;
- Expected<FileInfo &> findFileInfo(StringRef FileName);
- Expected<MemoryRegionInfo &> findSectionInfo(StringRef FileName,
- StringRef SectionName);
- Expected<MemoryRegionInfo &> findStubInfo(StringRef FileName,
- StringRef TargetName);
- Expected<MemoryRegionInfo &> findGOTEntryInfo(StringRef FileName,
- StringRef TargetName);
- bool isSymbolRegistered(StringRef Name);
- Expected<MemoryRegionInfo &> findSymbolInfo(StringRef SymbolName,
- Twine ErrorMsgStem);
- SymbolInfoMap SymbolInfos;
- FileInfoMap FileInfos;
- uint64_t SizeBeforePruning = 0;
- uint64_t SizeAfterFixups = 0;
- StringSet<> HarnessFiles;
- StringSet<> HarnessExternals;
- StringSet<> HarnessDefinitions;
- DenseMap<StringRef, StringRef> CanonicalWeakDefs;
- private:
- Session(std::unique_ptr<orc::TargetProcessControl> TPC, Error &Err);
- };
- /// Record symbols, GOT entries, stubs, and sections for ELF file.
- Error registerELFGraphInfo(Session &S, jitlink::LinkGraph &G);
- /// Record symbols, GOT entries, stubs, and sections for MachO file.
- Error registerMachOGraphInfo(Session &S, jitlink::LinkGraph &G);
- } // end namespace llvm
- #endif // LLVM_TOOLS_LLVM_JITLINK_LLVM_JITLINK_H
|