diff options
Diffstat (limited to 'llvm/include/llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h')
-rw-r--r-- | llvm/include/llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h b/llvm/include/llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h new file mode 100644 index 000000000000..455f5a8287f8 --- /dev/null +++ b/llvm/include/llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h @@ -0,0 +1,85 @@ +//===---- DebugObjectManagerPlugin.h - JITLink debug objects ---*- 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 +// +//===----------------------------------------------------------------------===// +// +// ObjectLinkingLayer plugin for emitting debug objects. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_EXECUTIONENGINE_ORC_DEBUGOBJECTMANAGERPLUGIN_H +#define LLVM_EXECUTIONENGINE_ORC_DEBUGOBJECTMANAGERPLUGIN_H + +#include "llvm/ADT/Triple.h" +#include "llvm/ExecutionEngine/JITLink/JITLink.h" +#include "llvm/ExecutionEngine/Orc/Core.h" +#include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h" +#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/Memory.h" +#include "llvm/Support/MemoryBufferRef.h" + +#include <functional> +#include <map> +#include <memory> +#include <mutex> + +namespace llvm { +namespace orc { + +class DebugObject; + +/// Creates and manages DebugObjects for JITLink artifacts. +/// +/// DebugObjects are created when linking for a MaterializationResponsibility +/// starts. They are pending as long as materialization is in progress. +/// +/// There can only be one pending DebugObject per MaterializationResponsibility. +/// If materialization fails, pending DebugObjects are discarded. +/// +/// Once executable code for the MaterializationResponsibility is emitted, the +/// corresponding DebugObject is finalized to target memory and the provided +/// DebugObjectRegistrar is notified. Ownership of DebugObjects remains with the +/// plugin. +/// +class DebugObjectManagerPlugin : public ObjectLinkingLayer::Plugin { +public: + DebugObjectManagerPlugin(ExecutionSession &ES, + std::unique_ptr<DebugObjectRegistrar> Target); + ~DebugObjectManagerPlugin(); + + void notifyMaterializing(MaterializationResponsibility &MR, + jitlink::LinkGraph &G, jitlink::JITLinkContext &Ctx, + MemoryBufferRef InputObject) override; + + Error notifyEmitted(MaterializationResponsibility &MR) override; + Error notifyFailed(MaterializationResponsibility &MR) override; + Error notifyRemovingResources(ResourceKey K) override; + + void notifyTransferringResources(ResourceKey DstKey, + ResourceKey SrcKey) override; + + void modifyPassConfig(MaterializationResponsibility &MR, + jitlink::LinkGraph &LG, + jitlink::PassConfiguration &PassConfig) override; + +private: + ExecutionSession &ES; + + using OwnedDebugObject = std::unique_ptr<DebugObject>; + std::map<MaterializationResponsibility *, OwnedDebugObject> PendingObjs; + std::map<ResourceKey, std::vector<OwnedDebugObject>> RegisteredObjs; + + std::mutex PendingObjsLock; + std::mutex RegisteredObjsLock; + + std::unique_ptr<DebugObjectRegistrar> Target; +}; + +} // namespace orc +} // namespace llvm + +#endif // LLVM_EXECUTIONENGINE_ORC_DEBUGOBJECTMANAGERPLUGIN_H |