1 //===---- DebugObjectManagerPlugin.h - JITLink debug objects ---*- 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // ObjectLinkingLayer plugin for emitting debug objects. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_EXECUTIONENGINE_ORC_DEBUGOBJECTMANAGERPLUGIN_H 14 #define LLVM_EXECUTIONENGINE_ORC_DEBUGOBJECTMANAGERPLUGIN_H 15 16 #include "llvm/ADT/Triple.h" 17 #include "llvm/ExecutionEngine/JITLink/JITLink.h" 18 #include "llvm/ExecutionEngine/Orc/Core.h" 19 #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h" 20 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" 21 #include "llvm/Support/Error.h" 22 #include "llvm/Support/Memory.h" 23 #include "llvm/Support/MemoryBufferRef.h" 24 25 #include <functional> 26 #include <map> 27 #include <memory> 28 #include <mutex> 29 30 namespace llvm { 31 namespace orc { 32 33 class DebugObject; 34 35 /// Creates and manages DebugObjects for JITLink artifacts. 36 /// 37 /// DebugObjects are created when linking for a MaterializationResponsibility 38 /// starts. They are pending as long as materialization is in progress. 39 /// 40 /// There can only be one pending DebugObject per MaterializationResponsibility. 41 /// If materialization fails, pending DebugObjects are discarded. 42 /// 43 /// Once executable code for the MaterializationResponsibility is emitted, the 44 /// corresponding DebugObject is finalized to target memory and the provided 45 /// DebugObjectRegistrar is notified. Ownership of DebugObjects remains with the 46 /// plugin. 47 /// 48 class DebugObjectManagerPlugin : public ObjectLinkingLayer::Plugin { 49 public: 50 DebugObjectManagerPlugin(ExecutionSession &ES, 51 std::unique_ptr<DebugObjectRegistrar> Target); 52 ~DebugObjectManagerPlugin(); 53 54 void notifyMaterializing(MaterializationResponsibility &MR, 55 jitlink::LinkGraph &G, jitlink::JITLinkContext &Ctx, 56 MemoryBufferRef InputObject) override; 57 58 Error notifyEmitted(MaterializationResponsibility &MR) override; 59 Error notifyFailed(MaterializationResponsibility &MR) override; 60 Error notifyRemovingResources(ResourceKey K) override; 61 62 void notifyTransferringResources(ResourceKey DstKey, 63 ResourceKey SrcKey) override; 64 65 void modifyPassConfig(MaterializationResponsibility &MR, 66 jitlink::LinkGraph &LG, 67 jitlink::PassConfiguration &PassConfig) override; 68 69 private: 70 ExecutionSession &ES; 71 72 using OwnedDebugObject = std::unique_ptr<DebugObject>; 73 std::map<MaterializationResponsibility *, OwnedDebugObject> PendingObjs; 74 std::map<ResourceKey, std::vector<OwnedDebugObject>> RegisteredObjs; 75 76 std::mutex PendingObjsLock; 77 std::mutex RegisteredObjsLock; 78 79 std::unique_ptr<DebugObjectRegistrar> Target; 80 }; 81 82 } // namespace orc 83 } // namespace llvm 84 85 #endif // LLVM_EXECUTIONENGINE_ORC_DEBUGOBJECTMANAGERPLUGIN_H 86