Skip to content

Commit b691563

Browse files
committed
Add dedicated CIR op for setjmp
1 parent 16e2250 commit b691563

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4698,6 +4698,26 @@ def CIR_EhTypeIdOp : CIR_Op<"eh.typeid",
46984698
}];
46994699
}
47004700

4701+
def CIR_EhSetjmp : CIR_Op<"eh.setjmp"> {
4702+
let summary = "CIR setjmp operation";
4703+
let description = [{
4704+
"Saves various information about the calling
4705+
environment (typically, the stack pointer, the instruction
4706+
pointer, possibly the values of other registers and the signal
4707+
mask) in the buffer env for later use by longjmp(). In this case,
4708+
setjmp() returns 0. When retuned from a longjmp(), setjmp returns the
4709+
value passed into longjmp()."
4710+
}];
4711+
4712+
let arguments = (ins CIR_PointerType:$buf, UnitAttr:$builtin);
4713+
let results = (outs CIR_SInt32:$res);
4714+
let assemblyFormat = [{
4715+
$buf `:` type($buf)
4716+
(`,` `builtin` $builtin^)?
4717+
`->` type(results) attr-dict
4718+
}];
4719+
}
4720+
47014721
//===----------------------------------------------------------------------===//
47024722
// CopyOp
47034723
//===----------------------------------------------------------------------===//

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4288,6 +4288,27 @@ mlir::LogicalResult CIRToLLVMEhTypeIdOpLowering::matchAndRewrite(
42884288
return mlir::success();
42894289
}
42904290

4291+
mlir::LogicalResult CIRToLLVMEhSjljSetjmpOpLowering::matchAndRewrite(
4292+
cir::EhSetjmp op, OpAdaptor adaptor,
4293+
mlir::ConversionPatternRewriter &rewriter) const {
4294+
mlir::Type returnType = typeConverter->convertType(op.getType());
4295+
if (op.getBuiltinAttr()) {
4296+
mlir::LLVM::CallIntrinsicOp newOp =
4297+
createCallLLVMIntrinsicOp(rewriter, op.getLoc(), "llvm.eh.sjlj.setjmp",
4298+
returnType, adaptor.getBuf());
4299+
rewriter.replaceOp(op, newOp);
4300+
} else {
4301+
StringRef fnName = "_setjmp";
4302+
auto llvmPtrTy = mlir::LLVM::LLVMPointerType::get(rewriter.getContext());
4303+
auto fnType = mlir::LLVM::LLVMFunctionType::get(returnType, llvmPtrTy,
4304+
/*isVarArg=*/false);
4305+
getOrCreateLLVMFuncOp(rewriter, op, fnName, fnType);
4306+
rewriter.replaceOpWithNewOp<mlir::LLVM::CallOp>(op, returnType, fnName,
4307+
adaptor.getBuf());
4308+
}
4309+
return mlir::success();
4310+
}
4311+
42914312
mlir::LogicalResult CIRToLLVMCatchParamOpLowering::matchAndRewrite(
42924313
cir::CatchParamOp op, OpAdaptor adaptor,
42934314
mlir::ConversionPatternRewriter &rewriter) const {
@@ -4531,6 +4552,7 @@ void populateCIRToLLVMConversionPatterns(
45314552
CIRToLLVMDerivedClassAddrOpLowering,
45324553
CIRToLLVMEhInflightOpLowering,
45334554
CIRToLLVMEhTypeIdOpLowering,
4555+
CIRToLLVMEhSjljSetjmpOpLowering,
45344556
CIRToLLVMExpectOpLowering,
45354557
CIRToLLVMExtractMemberOpLowering,
45364558
CIRToLLVMFrameAddrOpLowering,

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,16 @@ class CIRToLLVMEhTypeIdOpLowering
12201220
mlir::ConversionPatternRewriter &) const override;
12211221
};
12221222

1223+
class CIRToLLVMEhSjljSetjmpOpLowering
1224+
: public mlir::OpConversionPattern<cir::EhSetjmp> {
1225+
public:
1226+
using mlir::OpConversionPattern<cir::EhSetjmp>::OpConversionPattern;
1227+
1228+
mlir::LogicalResult
1229+
matchAndRewrite(cir::EhSetjmp op, OpAdaptor,
1230+
mlir::ConversionPatternRewriter &) const override;
1231+
};
1232+
12231233
class CIRToLLVMCatchParamOpLowering
12241234
: public mlir::OpConversionPattern<cir::CatchParamOp> {
12251235
public:
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: cir-opt %s -cir-to-llvm -o %t.ll
2+
// RUN: FileCheck %s --input-file=%t.ll -check-prefix=MLIR
3+
!s32i = !cir.int<s, 32>
4+
!p32 = !cir.ptr<!s32i>
5+
6+
module {
7+
// MLIR: module {
8+
cir.func @test_setjmp(%arg0 : !p32) -> !s32i {
9+
10+
// MLIR: llvm.func @test_setjmp([[ARG0:%.*]]: !llvm.ptr) -> i32
11+
// MLIR-NEXT: [[RET:%.*]] = llvm.call_intrinsic "llvm.eh.sjlj.setjmp"([[ARG0]]) : (!llvm.ptr) -> i32
12+
// MLIR-NEXT: llvm.return [[RET:%.*]] : i32
13+
// MLIR-NEXT: }
14+
%0 = cir.eh.setjmp %arg0 : !p32, builtin -> !s32i
15+
cir.return %0 : !s32i
16+
}
17+
cir.func @test_setjmp_2(%arg0 : !p32) -> !s32i {
18+
19+
// MLIR: llvm.func @test_setjmp_2([[ARG0:%.*]]: !llvm.ptr) -> i32
20+
// MLIR-NEXT: [[RET:%.*]] = llvm.call @_setjmp([[ARG0]]) : (!llvm.ptr) -> i32
21+
// MLIR-NEXT: llvm.return [[RET:%.*]] : i32
22+
// MLIR-NEXT: }
23+
%0 = cir.eh.setjmp %arg0 : !p32 -> !s32i
24+
cir.return %0 : !s32i
25+
}
26+
// MLIR: }
27+
}
28+

0 commit comments

Comments
 (0)