diff --git a/llvm/lib/ExecutionEngine/Orc/DebugObjectManagerPlugin.cpp b/llvm/lib/ExecutionEngine/Orc/DebugObjectManagerPlugin.cpp index 8ed0a5a7240eb..6909928f3cfab 100644 --- a/llvm/lib/ExecutionEngine/Orc/DebugObjectManagerPlugin.cpp +++ b/llvm/lib/ExecutionEngine/Orc/DebugObjectManagerPlugin.cpp @@ -123,6 +123,7 @@ enum class Requirement { class DebugObject { public: DebugObject(JITLinkContext &Ctx) : Ctx(Ctx) {} + virtual ~DebugObject() = default; void set(Requirement Req) { Reqs.insert(Req); } bool has(Requirement Req) const { return Reqs.count(Req) > 0; } @@ -130,9 +131,14 @@ class DebugObject { using FinalizeContinuation = std::function)>; void finalizeAsync(FinalizeContinuation OnFinalize); + Error deallocate() { + if (Alloc) + return Alloc->deallocate(); + return Error::success(); + } + virtual void reportSectionTargetMemoryRange(StringRef Name, SectionRange TargetMem) {} - virtual ~DebugObject() {} protected: using Allocation = JITLinkMemoryManager::Allocation; @@ -392,7 +398,18 @@ DebugObjectManagerPlugin::DebugObjectManagerPlugin( ExecutionSession &ES, std::unique_ptr Target) : ES(ES), Target(std::move(Target)) {} -DebugObjectManagerPlugin::~DebugObjectManagerPlugin() {} +DebugObjectManagerPlugin::~DebugObjectManagerPlugin() { + for (auto &KV : PendingObjs) { + std::unique_ptr &DebugObj = KV.second; + if (Error Err = DebugObj->deallocate()) + ES.reportError(std::move(Err)); + } + for (auto &KV : RegisteredObjs) { + for (std::unique_ptr &DebugObj : KV.second) + if (Error Err = DebugObj->deallocate()) + ES.reportError(std::move(Err)); + } +} void DebugObjectManagerPlugin::notifyMaterializing( MaterializationResponsibility &MR, LinkGraph &G, JITLinkContext &Ctx,