]> granicus.if.org Git - clang/commitdiff
Mark calls to 'throw()' functions as nounwind, and mark the functions nounwind
authorJohn McCall <rjmccall@apple.com>
Thu, 8 Jul 2010 06:48:12 +0000 (06:48 +0000)
committerJohn McCall <rjmccall@apple.com>
Thu, 8 Jul 2010 06:48:12 +0000 (06:48 +0000)
as well.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107858 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp
test/CXX/except/except.spec/p14-ir.cpp
test/CodeGenCXX/destructors.cpp

index 0a17e56d7274bd5082e7bf99d64a8b8d7bb3b147..1632cb3c22b4e385a11f5f1cbb7b06ce30ca7e8d 100644 (file)
@@ -684,6 +684,12 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
   if (TargetDecl) {
     if (TargetDecl->hasAttr<NoThrowAttr>())
       FuncAttrs |= llvm::Attribute::NoUnwind;
+    else if (const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
+      const FunctionProtoType *FPT = Fn->getType()->getAs<FunctionProtoType>();
+      if (FPT && FPT->hasEmptyExceptionSpec())
+        FuncAttrs |= llvm::Attribute::NoUnwind;
+    }
+
     if (TargetDecl->hasAttr<NoReturnAttr>())
       FuncAttrs |= llvm::Attribute::NoReturn;
     if (TargetDecl->hasAttr<ConstAttr>())
index 4dd754b1f3c9db8e0592690f4289a067b77193a8..79d6f28479f7999bea9fe8134d3950cbb1da9afb 100644 (file)
@@ -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
 }
index 965aea52ee39759fc6f86fae0a0f21a26b2c93e5..8efaf01f3c608f7d6b643afb7b101164031291dc 100644 (file)
@@ -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