diff options
| author | Reid Kleckner <rnk@google.com> | 2015-10-08 01:13:52 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2015-10-08 01:13:52 +0000 |
| commit | 129552b3757fa15f5e2f8ead1b1e24684f183574 (patch) | |
| tree | cb282daf5ede313fa6aa705d7ff6a555dda7f42a /clang/test/CodeGen/exceptions-seh-leave.c | |
| parent | 3b804877fd7e3270b1c53f1de9adce5fb0cbd380 (diff) | |
| download | bcm5719-llvm-129552b3757fa15f5e2f8ead1b1e24684f183574.tar.gz bcm5719-llvm-129552b3757fa15f5e2f8ead1b1e24684f183574.zip | |
[WinEH] Remove NewMSEH and enable its behavior by default
Testing has shown that it is at least as reliable as the old landingpad
pattern matching code.
llvm-svn: 249647
Diffstat (limited to 'clang/test/CodeGen/exceptions-seh-leave.c')
| -rw-r--r-- | clang/test/CodeGen/exceptions-seh-leave.c | 90 |
1 files changed, 44 insertions, 46 deletions
diff --git a/clang/test/CodeGen/exceptions-seh-leave.c b/clang/test/CodeGen/exceptions-seh-leave.c index e56da17d0a8..2895edbdfef 100644 --- a/clang/test/CodeGen/exceptions-seh-leave.c +++ b/clang/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,18 +157,23 @@ 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-NEXT: to label %[[g1_resume:.*]] unwind label %[[cleanupend:[^ ]*]] +// CHECK: cleanupret {{.*}} unwind label %[[g2_lpad]] // CHECK: [[g2_lpad]] +// CHECK: catchpad [i8* null] +// CHECK: catchret // CHECK: br label %[[trycont]] // CHECK: [[trycont]] // CHECK-NEXT: ret i32 1 +// CHECK: [[cleanupend]] +// CHECK-NEXT: cleanupendpad {{.*}} unwind label %[[g2_lpad]] + // CHECK-LABEL: define internal void @"\01?fin$0@0@nested___except___finally@@"(i8 %abnormal_termination, i8* %frame_pointer) // CHECK: call void @g() // CHECK: unreachable @@ -197,30 +202,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 +255,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 +265,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 +277,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: invoke 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 +307,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 +323,21 @@ 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 [] +// 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-NEXT: to label %[[finally_cont2:.*]] unwind label %[[endcleanup:[^ ]*]] // CHECK: [[finally_cont2]] -// CHECK: br label %[[ehcleanup]] +// CHECK: cleanupret %[[padtoken]] unwind label %[[g2_lpad]] -// CHECK: [[ehcleanup]] -// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() -// CHECK-NEXT: call void @"\01?fin$0@0@nested___finally___finally@@"(i8 1, i8* %[[fp]]) -// CHECK: resume +// CHECK: [[endcleanup]] +// CHECK-NEXT: cleanupendpad %[[padtoken]] unwind label %[[g2_lpad]] + +// CHECK: [[g2_lpad]] +// CHECK-NEXT: %[[padtoken:[^ ]*]] = cleanuppad [] +// CHECK-NEXT: %[[fp:[^ ]*]] = call i8* @llvm.localaddress() +// CHECK-NEXT: invoke void @"\01?fin$0@0@nested___finally___finally@@"(i8 1, i8* %[[fp]]) +// CHECK: cleanupret %[[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 |

