diff options
Diffstat (limited to 'clang/test/CodeGen/exceptions-seh-finally.c')
| -rw-r--r-- | clang/test/CodeGen/exceptions-seh-finally.c | 71 |
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 |

