From 9c0c1f333ab8f5a3da055b99ee94778689face17 Mon Sep 17 00:00:00 2001 From: John McCall Date: Thu, 8 Jul 2010 06:48:12 +0000 Subject: [PATCH] Mark calls to 'throw()' functions as nounwind, and mark the functions nounwind as well. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107858 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCall.cpp | 6 +++++ test/CXX/except/except.spec/p14-ir.cpp | 36 ++++++++++++++------------ test/CodeGenCXX/destructors.cpp | 15 +++++------ 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 0a17e56d72..1632cb3c22 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -684,6 +684,12 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, if (TargetDecl) { if (TargetDecl->hasAttr()) FuncAttrs |= llvm::Attribute::NoUnwind; + else if (const FunctionDecl *Fn = dyn_cast(TargetDecl)) { + const FunctionProtoType *FPT = Fn->getType()->getAs(); + if (FPT && FPT->hasEmptyExceptionSpec()) + FuncAttrs |= llvm::Attribute::NoUnwind; + } + if (TargetDecl->hasAttr()) FuncAttrs |= llvm::Attribute::NoReturn; if (TargetDecl->hasAttr()) diff --git a/test/CXX/except/except.spec/p14-ir.cpp b/test/CXX/except/except.spec/p14-ir.cpp index 4dd754b1f3..79d6f28479 100644 --- a/test/CXX/except/except.spec/p14-ir.cpp +++ b/test/CXX/except/except.spec/p14-ir.cpp @@ -27,18 +27,14 @@ struct X5 : X0, X4 { }; void test(X2 x2, X3 x3, X5 x5) { // CHECK: define linkonce_odr void @_ZN2X2C1ERKS_ - // CHECK-NOT: } - // CHECK: ret void - // CHECK-NOT: } - // CHECK: call void @__cxa_call_unexpected - // CHECK: } + // CHECK: call void @_ZN2X2C2ERKS_({{.*}}) nounwind + // CHECK-NEXT: ret void + // CHECK-NEXT: } X2 x2a(x2); // CHECK: define linkonce_odr void @_ZN2X3C1ERKS_ - // CHECK-NOT: } - // CHECK: ret void - // CHECK-NOT: } - // CHECK: call void @__cxa_call_unexpected - // CHECK: } + // CHECK: call void @_ZN2X3C2ERKS_({{.*}}) nounwind + // CHECK-NEXT: ret void + // CHECK-NEXT: } X3 x3a(x3); // CHECK: define linkonce_odr void @_ZN2X5C1ERS_ // CHECK-NOT: call void @__cxa_call_unexpected @@ -60,14 +56,20 @@ struct X9 : X6, X7 { }; void test() { // CHECK: define linkonce_odr void @_ZN2X8C1Ev - // CHECK-NOT: } - // CHECK: ret void - // CHECK-NOT: } - // CHECK: call void @__cxa_call_unexpected - // CHECK: } + // CHECK: call void @_ZN2X8C2Ev({{.*}}) nounwind + // CHECK-NEXT: ret void X8(); // CHECK: define linkonce_odr void @_ZN2X9C1Ev - // CHECK-NOT: call void @__cxa_call_unexpected - // CHECK: ret void + // CHECK: call void @_ZN2X9C2Ev({{.*}}){{$}} + // CHECK-NEXT: ret void X9(); + + // CHECK: define linkonce_odr void @_ZN2X9C2Ev + // CHECK: call void @_ZN2X6C2Ev({{.*}}) nounwind + // CHECK-NEXT: call void @_ZN2X7C2Ev({{.*}}){{$}} + // CHECK: ret void + + // CHECK: define linkonce_odr void @_ZN2X8C2Ev + // CHECK: call void @_ZN2X6C2Ev({{.*}}) nounwind + // CHECK-NEXT: ret void } diff --git a/test/CodeGenCXX/destructors.cpp b/test/CodeGenCXX/destructors.cpp index 965aea52ee..8efaf01f3c 100644 --- a/test/CodeGenCXX/destructors.cpp +++ b/test/CodeGenCXX/destructors.cpp @@ -45,7 +45,8 @@ namespace PR7526 { allocator::~allocator() throw() { foo(); } // CHECK: define linkonce_odr void @_ZN6PR752617allocator_derivedD1Ev - // CHECK: call void @__cxa_call_unexpected + // CHECK-NOT: call void @__cxa_call_unexpected + // CHECK: } void foo() { allocator_derived ad; } @@ -268,13 +269,11 @@ namespace test5 { // CHECK: define internal void @_ZN5test312_GLOBAL__N_11DD0Ev( // CHECK: invoke void @_ZN5test312_GLOBAL__N_11DD1Ev( - // CHECK: call void @_ZdlPv( + // CHECK: call void @_ZdlPv({{.*}}) nounwind // CHECK: ret void // CHECK: call i8* @llvm.eh.exception( - // CHECK: invoke void @_ZdlPv + // CHECK: call void @_ZdlPv({{.*}}) nounwind // CHECK: call void @_Unwind_Resume_or_Rethrow - // CHECK: call i8* @llvm.eh.exception( - // CHECK: call void @_ZSt9terminatev( // Checked at top of file: // @_ZN5test312_GLOBAL__N_11DD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11DD2Ev @@ -295,13 +294,11 @@ namespace test5 { // CHECK: define internal void @_ZN5test312_GLOBAL__N_11CD0Ev( // CHECK: invoke void @_ZN5test312_GLOBAL__N_11CD1Ev( - // CHECK: call void @_ZdlPv( + // CHECK: call void @_ZdlPv({{.*}}) nounwind // CHECK: ret void // CHECK: call i8* @llvm.eh.exception() - // CHECK: invoke void @_ZdlPv( + // CHECK: call void @_ZdlPv({{.*}}) nounwind // CHECK: call void @_Unwind_Resume_or_Rethrow( - // CHECK: call i8* @llvm.eh.exception() - // CHECK: call void @_ZSt9terminatev() // CHECK: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD1Ev( // CHECK: getelementptr inbounds i8* {{.*}}, i64 -8 -- 2.40.0