From 71c9b3ea96792331b24052c46884de2c6d3d6832 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 11 Mar 2016 17:36:16 +0000 Subject: [PATCH] [SEH] Remove nounwind/noinline from outlined finally funclets With the new EH representation this is no longer necessary. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@263269 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGException.cpp | 6 ------ test/CodeGen/exceptions-seh-finally.c | 21 +++++++++++++++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 0a12d1b3a5..4a7dc4205e 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -1708,12 +1708,6 @@ CodeGenFunction::GenerateSEHFinallyFunction(CodeGenFunction &ParentCGF, const Stmt *FinallyBlock = Finally.getBlock(); startOutlinedSEHHelper(ParentCGF, false, FinallyBlock); - // Mark finally block calls as nounwind and noinline to make LLVM's job a - // little easier. - // FIXME: Remove these restrictions in the future. - CurFn->addFnAttr(llvm::Attribute::NoUnwind); - CurFn->addFnAttr(llvm::Attribute::NoInline); - // Emit the original filter expression, convert to i32, and return. EmitStmt(FinallyBlock); diff --git a/test/CodeGen/exceptions-seh-finally.c b/test/CodeGen/exceptions-seh-finally.c index be1501f9e9..0f2123ba32 100644 --- a/test/CodeGen/exceptions-seh-finally.c +++ b/test/CodeGen/exceptions-seh-finally.c @@ -29,6 +29,7 @@ void basic_finally(void) { // CHECK-NEXT: cleanupret from %[[pad]] unwind to caller // CHECK: define internal void @"\01?fin$0@0@basic_finally@@"({{.*}}) +// CHECK-SAME: [[finally_attrs:#[0-9]+]] // CHECK: call void @cleanup() // Mostly check that we don't double emit 'r' which would crash. @@ -62,6 +63,7 @@ l: // CHECK: ret void // CHECK: define internal void @"\01?fin$0@0@label_in_finally@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: br label %[[l:[^ ]*]] // // CHECK: [[l]] @@ -95,6 +97,7 @@ void use_abnormal_termination(void) { // CHECK-NEXT: cleanupret from %[[pad]] unwind to caller // CHECK: define internal void @"\01?fin$0@0@use_abnormal_termination@@"({{i8( zeroext)?}} %[[abnormal:abnormal_termination]], i8* %frame_pointer) +// CHECK-SAME: [[finally_attrs]] // CHECK: %[[abnormal_zext:[^ ]*]] = zext i8 %[[abnormal]] to i32 // CHECK: store i32 %[[abnormal_zext]], i32* @crashed // CHECK-NEXT: ret void @@ -112,6 +115,7 @@ void noreturn_noop_finally() { // CHECK: ret void // CHECK: define internal void @"\01?fin$0@0@noreturn_noop_finally@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: call void @abort() // CHECK: unreachable @@ -137,6 +141,7 @@ void noreturn_finally() { // CHECK-NEXT: cleanupret from %[[pad]] unwind to caller // CHECK: define internal void @"\01?fin$0@0@noreturn_finally@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: call void @abort() // CHECK: unreachable @@ -151,6 +156,7 @@ int finally_with_return() { // CHECK-NEXT: ret i32 42 // CHECK: define internal void @"\01?fin$0@0@finally_with_return@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK-NOT: br i1 // CHECK-NOT: br label // CHECK: ret void @@ -181,9 +187,11 @@ int nested___finally___finally() { // CHECK-NEXT: cleanupret from %[[pad]] unwind to caller // CHECK-LABEL: define internal void @"\01?fin$0@0@nested___finally___finally@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: ret void // CHECK-LABEL: define internal void @"\01?fin$1@0@nested___finally___finally@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: unreachable // FIXME: Our behavior seems suspiciously different. @@ -226,9 +234,11 @@ int nested___finally___finally_with_eh_edge() { // CHECK-NEXT: cleanupret from %[[outerpad]] unwind to caller // CHECK-LABEL: define internal void @"\01?fin$0@0@nested___finally___finally_with_eh_edge@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: ret void // CHECK-LABEL: define internal void @"\01?fin$1@0@nested___finally___finally_with_eh_edge@@"({{.*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: unreachable void finally_within_finally() { @@ -248,10 +258,17 @@ void finally_within_finally() { // CHECK: call void @"\01?fin$0@0@finally_within_finally@@"( // CHECK: call void @"\01?fin$0@0@finally_within_finally@@"({{.*}}) [ "funclet"( -// CHECK-LABEL: define internal void @"\01?fin$0@0@finally_within_finally@@"( +// CHECK-LABEL: define internal void @"\01?fin$0@0@finally_within_finally@@"({{[^)]*}}) +// CHECK-SAME: [[finally_attrs]] // CHECK: invoke void @might_crash( // CHECK: call void @"\01?fin$1@0@finally_within_finally@@"( // CHECK: call void @"\01?fin$1@0@finally_within_finally@@"({{.*}}) [ "funclet"( -// CHECK-LABEL: define internal void @"\01?fin$1@0@finally_within_finally@@"( +// CHECK-LABEL: define internal void @"\01?fin$1@0@finally_within_finally@@"({{[^)]*}}) +// CHECK-SAME: [[finally_attrs]] + +// Look for the absence of noinline. Enum attributes come first, so check that +// a string attribute is the first to verify that no enum attributes are +// present. +// CHECK: attributes [[finally_attrs]] = { "{{.*}}" } -- 2.40.0