diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/2003-08-06-BuiltinSetjmpLongjmp.c | 15 | ||||
-rw-r--r-- | test/CodeGen/builtins.c | 3 | ||||
-rw-r--r-- | test/Sema/builtin-longjmp.c | 34 |
3 files changed, 37 insertions, 15 deletions
diff --git a/test/CodeGen/2003-08-06-BuiltinSetjmpLongjmp.c b/test/CodeGen/2003-08-06-BuiltinSetjmpLongjmp.c deleted file mode 100644 index 3aa5c00397..0000000000 --- a/test/CodeGen/2003-08-06-BuiltinSetjmpLongjmp.c +++ /dev/null @@ -1,15 +0,0 @@ -/* RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s - * - * __builtin_longjmp/setjmp should get transformed into intrinsics. - */ - -// CHECK-NOT: builtin_longjmp - -void jumpaway(int *ptr) { - __builtin_longjmp(ptr,1); -} - -int main(void) { - __builtin_setjmp(0); - jumpaway(0); -} diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c index 1ab29a659b..bf7874b088 100644 --- a/test/CodeGen/builtins.c +++ b/test/CodeGen/builtins.c @@ -220,6 +220,8 @@ void test_float_builtin_ops(float F, double D, long double LD) { // CHECK: call x86_fp80 @llvm.fabs.f80(x86_fp80 } +// __builtin_longjmp isn't supported on all platforms, so only test it on X86. +#ifdef __x86_64__ // CHECK-LABEL: define void @test_builtin_longjmp void test_builtin_longjmp(void **buffer) { // CHECK: [[BITCAST:%.*]] = bitcast @@ -227,6 +229,7 @@ void test_builtin_longjmp(void **buffer) { __builtin_longjmp(buffer, 1); // CHECK-NEXT: unreachable } +#endif // CHECK-LABEL: define i64 @test_builtin_readcyclecounter long long test_builtin_readcyclecounter() { diff --git a/test/Sema/builtin-longjmp.c b/test/Sema/builtin-longjmp.c new file mode 100644 index 0000000000..5ed393e591 --- /dev/null +++ b/test/Sema/builtin-longjmp.c @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple x86_64-windows -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple powerpc-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -emit-llvm < %s| FileCheck %s + +// RUN: %clang_cc1 -triple arm-unknown-unknown -emit-llvm-only -verify %s +// RUN: %clang_cc1 -triple aarch64-unknown-unknown -emit-llvm-only -verify %s +// RUN: %clang_cc1 -triple mips-unknown-unknown -emit-llvm-only -verify %s +// RUN: %clang_cc1 -triple mips64-unknown-unknown -emit-llvm-only -verify %s + +// Check that __builtin_longjmp and __builtin_setjmp are lowered into +// IR intrinsics on those architectures that can handle them. +// Check that an error is created otherwise. + +typedef void *jmp_buf; +jmp_buf buf; + +// CHECK: define{{.*}} void @do_jump() +// CHECK: call{{.*}} void @llvm.eh.sjlj.longjmp + +// CHECK: define{{.*}} void @do_setjmp() +// CHECK: call{{.*}} i32 @llvm.eh.sjlj.setjmp + +void do_jump(void) { + __builtin_longjmp(buf, 1); // expected-error {{__builtin_longjmp is not supported for the current target}} +} + +void f(void); + +void do_setjmp(void) { + if (!__builtin_setjmp(buf)) // expected-error {{__builtin_setjmp is not supported for the current target}} + f(); +} |