summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen/exceptions-seh-finally.c
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/CodeGen/exceptions-seh-finally.c')
-rw-r--r--clang/test/CodeGen/exceptions-seh-finally.c71
1 files changed, 48 insertions, 23 deletions
diff --git a/clang/test/CodeGen/exceptions-seh-finally.c b/clang/test/CodeGen/exceptions-seh-finally.c
index 772e28306b5..03c04e6fe0e 100644
--- a/clang/test/CodeGen/exceptions-seh-finally.c
+++ b/clang/test/CodeGen/exceptions-seh-finally.c
@@ -23,11 +23,14 @@ void basic_finally(void) {
// CHECK-NEXT: ret void
//
// CHECK: [[lpad]]
-// CHECK-NEXT: landingpad
-// CHECK-NEXT: cleanup
+// CHECK-NEXT: %[[pad:[^ ]*]] = cleanuppad
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
-// CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 1, i8* %[[fp]])
-// CHECK: resume { i8*, i32 }
+// CHECK: invoke void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 1, i8* %[[fp]])
+// CHECK-NEXT: to label %{{.*}} unwind label %[[end:[^ ]*]]
+// CHECK: cleanupret %[[pad]] unwind to caller
+//
+// CHECK: [[end]]
+// CHECK: cleanupendpad %[[pad]] unwind to caller
// CHECK: define internal void @"\01?fin$0@0@basic_finally@@"({{.*}})
// CHECK: call void @cleanup()
@@ -90,11 +93,14 @@ void use_abnormal_termination(void) {
// CHECK: ret void
//
// CHECK: [[lpad]]
-// CHECK-NEXT: landingpad
-// CHECK-NEXT: cleanup
+// CHECK-NEXT: %[[pad:[^ ]*]] = cleanuppad
// CHECK: %[[fp:[^ ]*]] = call i8* @llvm.localaddress()
-// CHECK: call void @"\01?fin$0@0@use_abnormal_termination@@"({{i8( zeroext)?}} 1, i8* %[[fp]])
-// CHECK: resume { i8*, i32 }
+// CHECK: invoke void @"\01?fin$0@0@use_abnormal_termination@@"({{i8( zeroext)?}} 1, i8* %[[fp]])
+// CHECK-NEXT: to label %{{.*}} unwind label %[[end:[^ ]*]]
+// CHECK: cleanupret %[[pad]] unwind to caller
+//
+// CHECK: [[end]]
+// CHECK: cleanupendpad %[[pad]] unwind to caller
// CHECK: define internal void @"\01?fin$0@0@use_abnormal_termination@@"({{i8( zeroext)?}} %[[abnormal:abnormal_termination]], i8* %frame_pointer)
// CHECK: %[[abnormal_zext:[^ ]*]] = zext i8 %[[abnormal]] to i32
@@ -134,10 +140,13 @@ void noreturn_finally() {
// CHECK: ret void
//
// CHECK: [[lpad]]
-// CHECK: landingpad
-// CHECK-NEXT: cleanup
-// CHECK: call void @"\01?fin$0@0@noreturn_finally@@"({{.*}})
-// CHECK: resume { i8*, i32 }
+// CHECK-NEXT: %[[pad:[^ ]*]] = cleanuppad
+// CHECK: invoke void @"\01?fin$0@0@noreturn_finally@@"({{.*}})
+// CHECK-NEXT: to label %{{.*}} unwind label %[[end:[^ ]*]]
+// CHECK: cleanupret %[[pad]] unwind to caller
+//
+// CHECK: [[end]]
+// CHECK: cleanupendpad %[[pad]] unwind to caller
// CHECK: define internal void @"\01?fin$0@0@noreturn_finally@@"({{.*}})
// CHECK: call void @abort()
@@ -179,9 +188,13 @@ int nested___finally___finally() {
// CHECK-NEXT: ret i32 0
//
// CHECK: [[lpad]]
-// CHECK-NEXT: landingpad
-// CHECK-NEXT: cleanup
-// CHECK: call void @"\01?fin$0@0@nested___finally___finally@@"({{.*}})
+// CHECK-NEXT: %[[pad:[^ ]*]] = cleanuppad
+// CHECK: invoke void @"\01?fin$0@0@nested___finally___finally@@"({{.*}})
+// CHECK-NEXT: to label %{{.*}} unwind label %[[end:[^ ]*]]
+// CHECK: cleanupret %[[pad]] unwind to caller
+//
+// CHECK: [[end]]
+// CHECK: cleanupendpad %[[pad]] unwind to caller
// CHECK-LABEL: define internal void @"\01?fin$0@0@nested___finally___finally@@"({{.*}})
// CHECK: ret void
@@ -189,6 +202,8 @@ int nested___finally___finally() {
// CHECK-LABEL: define internal void @"\01?fin$1@0@nested___finally___finally@@"({{.*}})
// CHECK: unreachable
+// FIXME: Our behavior seems suspiciously different.
+
int nested___finally___finally_with_eh_edge() {
__try {
__try {
@@ -207,23 +222,33 @@ int nested___finally___finally_with_eh_edge() {
//
// [[invokecont]]
// CHECK: invoke void @"\01?fin$1@0@nested___finally___finally_with_eh_edge@@"({{.*}})
-// CHECK: to label %[[outercont:[^ ]*]] unwind label %[[lpad2:[^ ]*]]
+// CHECK-NEXT: to label %[[outercont:[^ ]*]] unwind label %[[lpad2:[^ ]*]]
//
// CHECK: [[outercont]]
// CHECK: call void @"\01?fin$0@0@nested___finally___finally_with_eh_edge@@"({{.*}})
// CHECK-NEXT: ret i32 912
//
// CHECK: [[lpad1]]
-// CHECK-NEXT: landingpad
-// CHECK-NEXT: cleanup
+// CHECK-NEXT: %[[innerpad:[^ ]*]] = cleanuppad
// CHECK: invoke void @"\01?fin$1@0@nested___finally___finally_with_eh_edge@@"({{.*}})
-// CHECK: to label %[[outercont:[^ ]*]] unwind label %[[lpad2]]
+// CHECK-NEXT: to label %[[innercleanupretbb:[^ ]*]] unwind label %[[innerend:[^ ]*]]
+//
+// CHECK: [[innercleanupretbb]]
+// CHECK-NEXT: cleanupret %[[innerpad]] unwind label %[[lpad2]]
+//
+// CHECK: [[innerend]]
+// CHECK-NEXT: cleanupendpad %[[innerpad]] unwind label %[[lpad2:[^ ]*]]
//
// CHECK: [[lpad2]]
-// CHECK-NEXT: landingpad
-// CHECK-NEXT: cleanup
-// CHECK: call void @"\01?fin$0@0@nested___finally___finally_with_eh_edge@@"({{.*}})
-// CHECK: resume
+// CHECK-NEXT: %[[outerpad:[^ ]*]] = cleanuppad
+// CHECK: invoke void @"\01?fin$0@0@nested___finally___finally_with_eh_edge@@"({{.*}})
+// CHECK-NEXT: to label %[[outercleanupretbb:[^ ]*]] unwind label %[[outerend:[^ ]*]]
+//
+// CHECK: [[outercleanupretbb]]
+// CHECK-NEXT: cleanupret %[[outerpad]] unwind to caller
+//
+// CHECK: [[outerend]]
+// CHECK-NEXT: cleanupendpad %[[outerpad]] unwind to caller
// CHECK-LABEL: define internal void @"\01?fin$0@0@nested___finally___finally_with_eh_edge@@"({{.*}})
// CHECK: ret void
OpenPOWER on IntegriCloud