Skip to content

Commit 2af3f4c

Browse files
committed
Add dedicated CIR op for setjmp
1 parent f601904 commit 2af3f4c

File tree

5 files changed

+58
-0
lines changed

5 files changed

+58
-0
lines changed

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

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

4701+
def CIR_EhSjljSetjmp : CIR_Op<"eh.sjlj.setjmp"> {
4702+
let summary = "CIR setjmp operation";
4703+
let description = [{
4704+
"Dedicated setjmp operation for longjmp, a nonlocal jump"
4705+
}];
4706+
4707+
let arguments = (ins CIR_PointerType:$buf);
4708+
let results = (outs CIR_SInt32:$res);
4709+
let assemblyFormat = [{
4710+
$buf `:` type($buf) `->` type(results) attr-dict
4711+
}];
4712+
}
4713+
47014714
//===----------------------------------------------------------------------===//
47024715
// CopyOp
47034716
//===----------------------------------------------------------------------===//

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

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

4291+
mlir::LogicalResult CIRToLLVMEhSjljSetjmpOpLowering::matchAndRewrite(
4292+
cir::EhSjljSetjmp op, OpAdaptor adaptor,
4293+
mlir::ConversionPatternRewriter &rewriter) const {
4294+
rewriter.replaceOpWithNewOp<mlir::LLVM::Eh_SJLJ_Setjmp>(
4295+
op, typeConverter->convertType(op.getType()), adaptor.getBuf());
4296+
return mlir::success();
4297+
}
4298+
42914299
mlir::LogicalResult CIRToLLVMCatchParamOpLowering::matchAndRewrite(
42924300
cir::CatchParamOp op, OpAdaptor adaptor,
42934301
mlir::ConversionPatternRewriter &rewriter) const {
@@ -4531,6 +4539,7 @@ void populateCIRToLLVMConversionPatterns(
45314539
CIRToLLVMDerivedClassAddrOpLowering,
45324540
CIRToLLVMEhInflightOpLowering,
45334541
CIRToLLVMEhTypeIdOpLowering,
4542+
CIRToLLVMEhSjljSetjmpOpLowering,
45344543
CIRToLLVMExpectOpLowering,
45354544
CIRToLLVMExtractMemberOpLowering,
45364545
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::EhSjljSetjmp> {
1225+
public:
1226+
using mlir::OpConversionPattern<cir::EhSjljSetjmp>::OpConversionPattern;
1227+
1228+
mlir::LogicalResult
1229+
matchAndRewrite(cir::EhSjljSetjmp op, OpAdaptor,
1230+
mlir::ConversionPatternRewriter &) const override;
1231+
};
1232+
12231233
class CIRToLLVMCatchParamOpLowering
12241234
: public mlir::OpConversionPattern<cir::CatchParamOp> {
12251235
public:
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// RUN: cir-opt %s -cir-to-llvm -o - | FileCheck %s -check-prefix=MLIR
2+
3+
!s32i = !cir.int<s, 32>
4+
!p32 = !cir.ptr<!s32i>
5+
6+
module {
7+
// MLIR: module {
8+
cir.func @setjmp(%arg0 : !p32) -> !s32i {
9+
10+
// MLIR: llvm.func @setjmp(%arg0: !llvm.ptr) -> i32
11+
// MLIR-NEXT: %0 = llvm.intr.eh.sjlj.setjmp %arg0 : (!llvm.ptr) -> i32
12+
// MLIR-NEXT: llvm.return %0 : i32
13+
// MLIR-NEXT: }
14+
15+
%0 = cir.eh.sjlj.setjmp %arg0 : !p32 -> !s32i
16+
cir.return %0 : !s32i
17+
}
18+
// MLIR: }
19+
}
20+

mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,12 @@ def LLVM_EhTypeidForOp : LLVM_OneResultIntrOp<"eh.typeid.for", [], [0]> {
779779
let assemblyFormat = "$type_info attr-dict `:` functional-type(operands, results)";
780780
}
781781

782+
def LLVM_Eh_SJLJ_Setjmp : LLVM_OneResultIntrOp<"eh.sjlj.setjmp", [], [0]> {
783+
let arguments = (ins LLVM_AnyPointer:$buf);
784+
let results = (outs I32:$res);
785+
let assemblyFormat = "$buf attr-dict `:` functional-type(operands, results)";
786+
}
787+
782788
//
783789
// Stack save/restore intrinsics.
784790
//

0 commit comments

Comments
 (0)