================
@@ -0,0 +1,75 @@
+//===- CIRTransformUtils.cpp - Shared helpers for CIR transforms 
----------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "CIRTransformUtils.h"
+
+#include "clang/CIR/Dialect/IR/CIRTypes.h"
+
+mlir::Block *cir::replaceCallWithTryCall(cir::CallOp callOp,
+                                         mlir::Block *unwindDest,
+                                         mlir::Location loc,
+                                         mlir::RewriterBase &rewriter) {
+  mlir::Block *callBlock = callOp->getBlock();
+
+  assert(!callOp.getNothrow() && "call is not expected to throw");
+
+  // Split the block after the call - remaining ops become the normal
+  // destination.
+  mlir::Block *normalDest =
+      rewriter.splitBlock(callBlock, std::next(callOp->getIterator()));
+
+  // Build the try_call to replace the original call.
+  rewriter.setInsertionPoint(callOp);
+  cir::TryCallOp tryCallOp;
+  if (callOp.isIndirect()) {
+    mlir::Value indTarget = callOp.getIndirectCall();
+    auto ptrTy = mlir::cast<cir::PointerType>(indTarget.getType());
+    auto resTy = mlir::cast<cir::FuncType>(ptrTy.getPointee());
+    tryCallOp =
+        cir::TryCallOp::create(rewriter, loc, indTarget, resTy, normalDest,
+                               unwindDest, callOp.getArgOperands());
+  } else {
+    mlir::Type resType = callOp->getNumResults() > 0
+                             ? callOp->getResult(0).getType()
+                             : mlir::Type();
+    tryCallOp =
+        cir::TryCallOp::create(rewriter, loc, callOp.getCalleeAttr(), resType,
+                               normalDest, unwindDest, 
callOp.getArgOperands());
+  }
+
+  // Copy all attributes from the original call except those already set by
+  // TryCallOp::create or that are operation-specific and should not be copied.
+  llvm::StringRef excludedAttrs[] = {
+      cir::CIRDialect::getCalleeAttrName(), // Set by create()
+      cir::CIRDialect::getOperandSegmentSizesAttrName(),
+  };
+#ifndef NDEBUG
+  // We don't expect to ever see any of these attributes on a call that we
+  // converted to a try_call.
+  llvm::StringRef unexpectedAttrs[] = {
----------------
erichkeane wrote:

Do we expect this list to get large?  If not,perahps it should just be an 
init-list inside the assert?

https://github.com/llvm/llvm-project/pull/195904
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to