diff options
Diffstat (limited to 'test/CodeGen/exceptions-seh-leave.c')
-rw-r--r-- | test/CodeGen/exceptions-seh-leave.c | 78 |
1 files changed, 35 insertions, 43 deletions
diff --git a/test/CodeGen/exceptions-seh-leave.c b/test/CodeGen/exceptions-seh-leave.c index e56da17..a0b1956 100644 --- a/test/CodeGen/exceptions-seh-leave.c +++ b/test/CodeGen/exceptions-seh-leave.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -fnew-ms-eh -emit-llvm -o - | opt -instnamer -S | FileCheck %s void g(void); @@ -157,13 +157,15 @@ int nested___except___finally() { // CHECK-NEXT: br label %[[trycont:[^ ]*]] // CHECK: [[g1_lpad]] -// CHECK-NEXT: landingpad -// CHECK-NEXT: catch i8* null -// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() +// CHECK-NEXT: cleanuppad +// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() // CHECK-NEXT: invoke void @"\01?fin$0@0@nested___except___finally@@"(i8 1, i8* %[[fp]]) // CHECK-NEXT: to label %[[g1_resume:.*]] unwind label %[[g2_lpad]] +// CHECK: cleanupret {{.*}} unwind label %[[g2_lpad]] // CHECK: [[g2_lpad]] +// CHECK: catchpad {{.*}} [i8* null] +// CHECK: catchret // CHECK: br label %[[trycont]] // CHECK: [[trycont]] @@ -197,30 +199,29 @@ int nested___except___except() { // CHECK-LABEL: invoke void @g() // CHECK-NEXT: to label %[[g1_cont:.*]] unwind label %[[g1_lpad:.*]] -// CHECK: [[g1_cont]] -// CHECK: store i32 16, i32* %myres -// CHECK-NEXT: br label %[[trycont:[^ ]*]] - // CHECK: [[g1_lpad]] -// CHECK: br label %[[except:[^ ]*]] - +// CHECK: catchpad {{.*}} [i8* null] +// CHECK: catchret {{.*}} to label %[[except:[^ ]*]] // CHECK: [[except]] // CHECK: invoke void @g() // CHECK-NEXT: to label %[[g2_cont:.*]] unwind label %[[g2_lpad:.*]] -// CHECK: [[g2_cont]] -// CHECK-NEXT: br label %[[tryleave:[^ ]*]] -// CHECK-NOT: store i32 23 - // CHECK: [[g2_lpad]] -// CHECK: br label %[[outerexcept:[^ ]*]] - -// CHECK: [[outerexcept]] +// CHECK: catchpad {{.*}} [i8* null] +// CHECK: catchret // CHECK: br label %[[trycont4:[^ ]*]] // CHECK: [[trycont4]] // CHECK-NEXT: ret i32 1 +// CHECK: [[g2_cont]] +// CHECK-NEXT: br label %[[tryleave:[^ ]*]] +// CHECK-NOT: store i32 23 + +// CHECK: [[g1_cont]] +// CHECK: store i32 16, i32* %myres +// CHECK-NEXT: br label %[[trycont:[^ ]*]] + // CHECK: [[trycont]] // CHECK-NEXT: store i32 51, i32* %myres // CHECK-NEXT: br label %[[tryleave]] @@ -251,13 +252,9 @@ int nested___finally___except() { // CHECK-LABEL: invoke void @g() // CHECK-NEXT: to label %[[g1_cont:.*]] unwind label %[[g1_lpad:.*]] -// CHECK: [[g1_cont]] -// CHECK-NEXT: br label %[[trycont:[^ ]*]] - // CHECK: [[g1_lpad]] -// CHECK: br label %[[except:[^ ]*]] - -// CHECK: [[except]] +// CHECK: catchpad +// CHECK: catchret // CHECK: invoke void @g() // CHECK-NEXT: to label %[[g2_cont:.*]] unwind label %[[g2_lpad:.*]] @@ -265,10 +262,8 @@ int nested___finally___except() { // CHECK: br label %[[tryleave:[^ ]*]] // CHECK-NOT: 23 -// CHECK: [[g2_lpad]] -// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() -// CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___except@@"(i8 1, i8* %[[fp]]) -// CHECK-NEXT: br label %[[ehresume:[^ ]*]] +// CHECK: [[g1_cont]] +// CHECK-NEXT: br label %[[trycont:[^ ]*]] // CHECK: [[trycont]] // CHECK: store i32 51, i32* % @@ -279,8 +274,11 @@ int nested___finally___except() { // CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___except@@"(i8 0, i8* %[[fp]]) // CHECK-NEXT: ret i32 1 -// CHECK: [[ehresume]] -// CHECK: resume +// CHECK: [[g2_lpad]] +// CHECK: cleanuppad +// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() +// CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___except@@"(i8 1, i8* %[[fp]]) +// CHECK: cleanupret {{.*}} unwind to caller // CHECK-LABEL: define internal void @"\01?fin$0@0@nested___finally___except@@"(i8 %abnormal_termination, i8* %frame_pointer) // CHECK: ret void @@ -306,7 +304,7 @@ int nested___finally___finally() { // The order of basic blocks in the below doesn't matter. // CHECK-LABEL: define i32 @nested___finally___finally() -// CHECK-LABEL: invoke void @g() +// CHECK: invoke void @g() // CHECK-NEXT: to label %[[g1_cont:.*]] unwind label %[[g1_lpad:.*]] // CHECK: [[g1_cont]] @@ -322,24 +320,18 @@ int nested___finally___finally() { // CHECK-NEXT: ret i32 1 // CHECK: [[g1_lpad]] -// CHECK-NEXT: landingpad -// CHECK-NEXT: cleanup -// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() +// CHECK-NEXT: %[[padtoken:[^ ]*]] = cleanuppad within none [] +// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() // CHECK-NEXT: invoke void @"\01?fin$1@0@nested___finally___finally@@"(i8 1, i8* %[[fp]]) // CHECK-NEXT: to label %[[finally_cont2:.*]] unwind label %[[g2_lpad]] - -// CHECK: [[g2_lpad]] -// CHECK-NEXT: landingpad -// CHECK-NEXT: cleanup -// CHECK: br label %[[ehcleanup:.*]] - // CHECK: [[finally_cont2]] -// CHECK: br label %[[ehcleanup]] +// CHECK: cleanupret from %[[padtoken]] unwind label %[[g2_lpad]] -// CHECK: [[ehcleanup]] -// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() +// CHECK: [[g2_lpad]] +// CHECK-NEXT: %[[padtoken:[^ ]*]] = cleanuppad within none [] +// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() // CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___finally@@"(i8 1, i8* %[[fp]]) -// CHECK: resume +// CHECK: cleanupret from %[[padtoken]] unwind to caller // CHECK-LABEL: define internal void @"\01?fin$0@0@nested___finally___finally@@"(i8 %abnormal_termination, i8* %frame_pointer) // CHECK: ret void |