From: Benjamin Kramer Date: Sat, 21 May 2022 11:25:24 +0000 (+0200) Subject: [mlir] Move diagnostic handlers instead of copying X-Git-Tag: upstream/15.0.7~7064 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=295d032762ad284068c72cc1904680a4db5e80d3;p=platform%2Fupstream%2Fllvm.git [mlir] Move diagnostic handlers instead of copying This also allows using unique_ptr instead of shared_ptr for the CAPI user data. NFCI. --- diff --git a/mlir/include/mlir/IR/Diagnostics.h b/mlir/include/mlir/IR/Diagnostics.h index dd75aee..82bd793 100644 --- a/mlir/include/mlir/IR/Diagnostics.h +++ b/mlir/include/mlir/IR/Diagnostics.h @@ -417,7 +417,7 @@ public: /// The handler type for MLIR diagnostics. This function takes a diagnostic as /// input, and returns success if the handler has fully processed this /// diagnostic. Returns failure otherwise. - using HandlerTy = std::function; + using HandlerTy = llvm::unique_function; /// A handle to a specific registered handler object. using HandlerID = uint64_t; @@ -427,7 +427,7 @@ public: /// handlers will process diagnostics first. This function returns a unique /// identifier for the registered handler, which can be used to unregister /// this handler at a later time. - HandlerID registerHandler(const HandlerTy &handler); + HandlerID registerHandler(HandlerTy handler); /// Set the diagnostic handler with a function that returns void. This is a /// convenient wrapper for handlers that always completely process the given diff --git a/mlir/lib/CAPI/IR/Diagnostics.cpp b/mlir/lib/CAPI/IR/Diagnostics.cpp index 40639c7..4a13ae5 100644 --- a/mlir/lib/CAPI/IR/Diagnostics.cpp +++ b/mlir/lib/CAPI/IR/Diagnostics.cpp @@ -59,11 +59,12 @@ MlirDiagnosticHandlerID mlirContextAttachDiagnosticHandler( assert(handler && "unexpected null diagnostic handler"); if (deleteUserData == nullptr) deleteUserData = deleteUserDataNoop; - std::shared_ptr sharedUserData(userData, deleteUserData); DiagnosticEngine::HandlerID id = unwrap(context)->getDiagEngine().registerHandler( - [handler, sharedUserData](Diagnostic &diagnostic) { - return unwrap(handler(wrap(diagnostic), sharedUserData.get())); + [handler, + ownedUserData = std::unique_ptr( + userData, deleteUserData)](Diagnostic &diagnostic) { + return unwrap(handler(wrap(diagnostic), ownedUserData.get())); }); return static_cast(id); } diff --git a/mlir/lib/IR/Diagnostics.cpp b/mlir/lib/IR/Diagnostics.cpp index 975f694..98e4d40 100644 --- a/mlir/lib/IR/Diagnostics.cpp +++ b/mlir/lib/IR/Diagnostics.cpp @@ -272,10 +272,10 @@ DiagnosticEngine::~DiagnosticEngine() = default; /// Register a new handler for diagnostics to the engine. This function returns /// a unique identifier for the registered handler, which can be used to /// unregister this handler at a later time. -auto DiagnosticEngine::registerHandler(const HandlerTy &handler) -> HandlerID { +auto DiagnosticEngine::registerHandler(HandlerTy handler) -> HandlerID { llvm::sys::SmartScopedLock lock(impl->mutex); auto uniqueID = impl->uniqueHandlerId++; - impl->handlers.insert({uniqueID, handler}); + impl->handlers.insert({uniqueID, std::move(handler)}); return uniqueID; }