diff options
Diffstat (limited to 'clang/test/CodeGen/exceptions-seh.c')
-rw-r--r-- | clang/test/CodeGen/exceptions-seh.c | 135 |
1 files changed, 40 insertions, 95 deletions
diff --git a/clang/test/CodeGen/exceptions-seh.c b/clang/test/CodeGen/exceptions-seh.c index 3eba3a412fe..1b77ad61627 100644 --- a/clang/test/CodeGen/exceptions-seh.c +++ b/clang/test/CodeGen/exceptions-seh.c @@ -1,7 +1,4 @@ -// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm -o - \ -// RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=X64 -// RUN: %clang_cc1 %s -triple i686-pc-win32 -fms-extensions -emit-llvm -o - \ -// RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=X86 +// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s void try_body(int numerator, int denominator, int *myres) { *myres = numerator / denominator; @@ -22,46 +19,20 @@ int safe_div(int numerator, int denominator, int *res) { *res = myres; return success; } - -// X64-LABEL: define i32 @safe_div(i32 %numerator, i32 %denominator, i32* %res) {{.*}} personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) -// X64: invoke void @try_body(i32 %{{.*}}, i32 %{{.*}}, i32* %{{.*}}) #[[NOINLINE:[0-9]+]] -// X64: to label %{{.*}} unwind label %[[lpad:[^ ]*]] -// -// X64: [[lpad]] -// X64: landingpad { i8*, i32 } -// X64-NEXT: catch i8* null -// X64-NOT: br i1 -// X64: br label %[[except:[^ ]*]] -// X64: [[except]] -// X64: store i32 -42, i32* %[[success:[^ ]*]] -// -// X64: %[[res:[^ ]*]] = load i32, i32* %[[success]] -// X64: ret i32 %[[res]] - -// X86-LABEL: define i32 @safe_div(i32 %numerator, i32 %denominator, i32* %res) {{.*}} personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) -// X86: invoke void @try_body(i32 %{{.*}}, i32 %{{.*}}, i32* %{{.*}}) #[[NOINLINE:[0-9]+]] -// X86: to label %{{.*}} unwind label %[[lpad:[^ ]*]] -// -// X86: [[lpad]] -// X86: landingpad { i8*, i32 } -// X86-NEXT: catch i8* bitcast (i32 ()* @"\01?filt$0@0@safe_div@@" to i8*) -// X86-NOT: br i1 -// X86: br label %[[except:[^ ]*]] -// X86: [[except]] -// X86: store i32 -42, i32* %[[success:[^ ]*]] -// -// X86: %[[res:[^ ]*]] = load i32, i32* %[[success]] -// X86: ret i32 %[[res]] - -// X86-LABEL: define internal i32 @"\01?filt$0@0@safe_div@@"() -// X86: %[[ebp:[^ ]*]] = call i8* @llvm.frameaddress(i32 1) -// X86: %[[fp:[^ ]*]] = call i8* @llvm.x86.seh.recoverfp(i8* bitcast (i32 (i32, i32, i32*)* @safe_div to i8*), i8* %[[ebp]]) -// X86: call i8* @llvm.framerecover(i8* bitcast (i32 (i32, i32, i32*)* @safe_div to i8*), i8* %[[fp]], i32 0) -// X86: load i8*, i8** -// X86: load i32*, i32** -// X86: load i32, i32* -// X86: store i32 %{{.*}}, i32* -// X86: ret i32 1 +// CHECK-LABEL: define i32 @safe_div(i32 %numerator, i32 %denominator, i32* %res) {{.*}} personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) +// CHECK: invoke void @try_body(i32 %{{.*}}, i32 %{{.*}}, i32* %{{.*}}) #[[NOINLINE:[0-9]+]] +// CHECK: to label %{{.*}} unwind label %[[lpad:[^ ]*]] +// +// CHECK: [[lpad]] +// CHECK: landingpad { i8*, i32 } +// CHECK-NEXT: catch i8* null +// CHECK-NOT: br i1 +// CHECK: br label %[[except:[^ ]*]] +// CHECK: [[except]] +// CHECK-NEXT: store i32 -42, i32* %[[success:[^ ]*]] +// +// CHECK: %[[res:[^ ]*]] = load i32, i32* %[[success]] +// CHECK: ret i32 %[[res]] void j(void); @@ -75,29 +46,20 @@ int filter_expr_capture(void) { return r; } -// CHECK-LABEL: define i32 @filter_expr_capture() -// X64-SAME: personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) -// X86-SAME: personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) -// X64: call void (...) @llvm.frameescape(i32* %[[r:[^ ,]*]]) -// X86: call void (...) @llvm.frameescape(i32* %[[r:[^ ,]*]], i32* %[[code:[^ ,]*]]) +// CHECK-LABEL: define i32 @filter_expr_capture() {{.*}} personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) +// CHECK: call void (...) @llvm.frameescape(i32* %[[r:[^ ,]*]]) // CHECK: store i32 42, i32* %[[r]] // CHECK: invoke void @j() #[[NOINLINE]] // // CHECK: landingpad -// CHECK-NEXT: catch i8* bitcast (i32 ({{.*}})* @"\01?filt$0@0@filter_expr_capture@@" to i8*) +// CHECK-NEXT: catch i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@filter_expr_capture@@" to i8*) // CHECK: store i32 13, i32* %[[r]] // // CHECK: %[[rv:[^ ]*]] = load i32, i32* %[[r]] // CHECK: ret i32 %[[rv]] -// X64-LABEL: define internal i32 @"\01?filt$0@0@filter_expr_capture@@"(i8* %exception_pointers, i8* %frame_pointer) -// X64: call i8* @llvm.framerecover(i8* bitcast (i32 ()* @filter_expr_capture to i8*), i8* %frame_pointer, i32 0) -// -// X86-LABEL: define internal i32 @"\01?filt$0@0@filter_expr_capture@@"() -// X86: %[[ebp:[^ ]*]] = call i8* @llvm.frameaddress(i32 1) -// X86: %[[fp:[^ ]*]] = call i8* @llvm.x86.seh.recoverfp(i8* bitcast (i32 ()* @filter_expr_capture to i8*), i8* %[[ebp]]) -// X86: call i8* @llvm.framerecover(i8* bitcast (i32 ()* @filter_expr_capture to i8*), i8* %[[fp]], i32 0) -// +// CHECK-LABEL: define internal i32 @"\01?filt$0@0@filter_expr_capture@@"(i8* %exception_pointers, i8* %frame_pointer) +// CHECK: call i8* @llvm.framerecover(i8* bitcast (i32 ()* @filter_expr_capture to i8*), i8* %frame_pointer, i32 0) // CHECK: store i32 -1, i32* %{{.*}} // CHECK: ret i32 -1 @@ -115,9 +77,7 @@ int nested_try(void) { } return r; } -// CHECK-LABEL: define i32 @nested_try() -// X64-SAME: personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) -// X86-SAME: personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) +// CHECK-LABEL: define i32 @nested_try() {{.*}} personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) // CHECK: store i32 42, i32* %[[r:[^ ,]*]] // CHECK: invoke void @j() #[[NOINLINE]] // CHECK: to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]] @@ -128,18 +88,18 @@ int nested_try(void) { // // CHECK: [[lpad]] // CHECK: landingpad { i8*, i32 } -// CHECK: catch i8* bitcast (i32 ({{.*}})* @"\01?filt$1@0@nested_try@@" to i8*) -// CHECK: catch i8* bitcast (i32 ({{.*}})* @"\01?filt$0@0@nested_try@@" to i8*) +// CHECK: catch i8* bitcast (i32 (i8*, i8*)* @"\01?filt$1@0@nested_try@@" to i8*) +// CHECK: catch i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@nested_try@@" to i8*) // CHECK: store i8* %{{.*}}, i8** %[[ehptr_slot:[^ ]*]] // CHECK: store i32 %{{.*}}, i32* %[[sel_slot:[^ ]*]] // // CHECK: load i32, i32* %[[sel_slot]] -// CHECK: call i32 @llvm.eh.typeid.for(i8* bitcast (i32 ({{.*}})* @"\01?filt$1@0@nested_try@@" to i8*)) +// CHECK: call i32 @llvm.eh.typeid.for(i8* bitcast (i32 (i8*, i8*)* @"\01?filt$1@0@nested_try@@" to i8*)) // CHECK: icmp eq i32 // CHECK: br i1 // // CHECK: load i32, i32* %[[sel_slot]] -// CHECK: call i32 @llvm.eh.typeid.for(i8* bitcast (i32 ({{.*}})* @"\01?filt$0@0@nested_try@@" to i8*)) +// CHECK: call i32 @llvm.eh.typeid.for(i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@nested_try@@" to i8*)) // CHECK: icmp eq i32 // CHECK: br i1 // @@ -155,55 +115,40 @@ int nested_try(void) { // // CHECK: [[inner_try_cont]] // CHECK: br label %[[outer_try_cont]] -// -// CHECK-LABEL: define internal i32 @"\01?filt$0@0@nested_try@@"({{.*}}) -// X86: call i8* @llvm.x86.seh.recoverfp({{.*}}) -// CHECK: load i32*, i32** -// CHECK: load i32, i32* -// CHECK: icmp eq i32 %{{.*}}, 456 -// -// CHECK-LABEL: define internal i32 @"\01?filt$1@0@nested_try@@"({{.*}}) -// X86: call i8* @llvm.x86.seh.recoverfp({{.*}}) -// CHECK: load i32*, i32** -// CHECK: load i32, i32* -// CHECK: icmp eq i32 %{{.*}}, 123 -int basic_finally(int g) { +static unsigned g = 0; +void basic_finally(void) { + ++g; __try { j(); } __finally { - ++g; + --g; } - return g; } -// CHECK-LABEL: define i32 @basic_finally(i32 %g) -// X64-SAME: personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) -// X86-SAME: personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) -// CHECK: %[[g_addr:[^ ]*]] = alloca i32, align 4 -// CHECK: call void (...) @llvm.frameescape(i32* %[[g_addr]]) -// CHECK: store i32 %g, i32* %[[g_addr]] +// CHECK-LABEL: define void @basic_finally() {{.*}} personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) +// CHECK: load i32, i32* @g +// CHECK: add i32 %{{.*}}, 1 +// CHECK: store i32 %{{.*}}, i32* @g // // CHECK: invoke void @j() // CHECK: to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]] // // CHECK: [[cont]] // CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0) -// CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 0, i8* %[[fp]]) -// CHECK: load i32, i32* %[[g_addr]], align 4 -// CHECK: ret i32 +// CHECK: call void @"\01?fin$0@0@basic_finally@@"(i8 0, i8* %[[fp]]) +// CHECK: ret void // // CHECK: [[lpad]] // CHECK: landingpad { i8*, i32 } // CHECK-NEXT: cleanup // CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0) -// CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 1, i8* %[[fp]]) +// CHECK: call void @"\01?fin$0@0@basic_finally@@"(i8 1, i8* %[[fp]]) // CHECK: resume -// CHECK: define internal void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} %abnormal_termination, i8* %frame_pointer) -// CHECK: call i8* @llvm.framerecover(i8* bitcast (i32 (i32)* @basic_finally to i8*), i8* %frame_pointer, i32 0) -// CHECK: load i32, i32* %{{.*}}, align 4 -// CHECK: add nsw i32 %{{.*}}, 1 -// CHECK: store i32 %{{.*}}, i32* %{{.*}}, align 4 +// CHECK: define internal void @"\01?fin$0@0@basic_finally@@"(i8 %abnormal_termination, i8* %frame_pointer) +// CHECK: load i32, i32* @g, align 4 +// CHECK: add i32 %{{.*}}, -1 +// CHECK: store i32 %{{.*}}, i32* @g, align 4 // CHECK: ret void int returns_int(void); |