xref: /aosp_15_r20/external/clang/test/CodeGen/ms-setjmp.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple i686-windows-msvc   -emit-llvm %s -o - | FileCheck --check-prefix=I386 %s
2*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=X64 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -triple i686-windows-msvc   -emit-llvm %s -o - | FileCheck --check-prefix=I386 %s
4*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=X64 %s
5*67e74705SXin Li typedef char jmp_buf[1];
6*67e74705SXin Li 
7*67e74705SXin Li #ifdef DECLARE_SETJMP
8*67e74705SXin Li int _setjmp(jmp_buf env);
9*67e74705SXin Li int _setjmpex(jmp_buf env);
10*67e74705SXin Li #endif
11*67e74705SXin Li 
12*67e74705SXin Li jmp_buf jb;
13*67e74705SXin Li 
test_setjmp()14*67e74705SXin Li int test_setjmp() {
15*67e74705SXin Li   return _setjmp(jb);
16*67e74705SXin Li   // I386-LABEL: define i32 @test_setjmp
17*67e74705SXin Li   // I386:       %[[call:.*]] = call i32 (i8*, i32, ...) @_setjmp3(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @jb, i32 0, i32 0), i32 0)
18*67e74705SXin Li   // I386-NEXT:  ret i32 %[[call]]
19*67e74705SXin Li 
20*67e74705SXin Li   // X64-LABEL: define i32 @test_setjmp
21*67e74705SXin Li   // X64:       %[[addr:.*]] = call i8* @llvm.frameaddress(i32 0)
22*67e74705SXin Li   // X64:       %[[call:.*]] = call i32 @_setjmp(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @jb, i32 0, i32 0), i8* %[[addr]])
23*67e74705SXin Li   // X64-NEXT:  ret i32 %[[call]]
24*67e74705SXin Li }
25*67e74705SXin Li 
test_setjmpex()26*67e74705SXin Li int test_setjmpex() {
27*67e74705SXin Li   return _setjmpex(jb);
28*67e74705SXin Li   // X64-LABEL: define i32 @test_setjmpex
29*67e74705SXin Li   // X64:       %[[addr:.*]] = call i8* @llvm.frameaddress(i32 0)
30*67e74705SXin Li   // X64:       %[[call:.*]] = call i32 @_setjmpex(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @jb, i32 0, i32 0), i8* %[[addr]])
31*67e74705SXin Li   // X64-NEXT:  ret i32 %[[call]]
32*67e74705SXin Li }
33