Weak functions not declared non-throwing might be
authorDale Johannesen <dalej@apple.com>
Fri, 16 May 2008 21:31:48 +0000 (21:31 +0000)
committerDale Johannesen <dalej@apple.com>
Fri, 16 May 2008 21:31:48 +0000 (21:31 +0000)
replaced at linktime with a body that throws, even
if the body in this file does not.  Make PruneEH
be more conservative in this case.
g++.dg/eh/weak1.C

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

lib/Transforms/IPO/PruneEH.cpp

index ceb9e3e54e81c3e87cdb4f14611f350a6dc2c009..d2f3a8437cf3b5a8b25640e7289692acf128c099 100644 (file)
@@ -64,6 +64,8 @@ bool PruneEH::runOnSCC(const std::vector<CallGraphNode *> &SCC) {
 
   // Next, check to see if any callees might throw or if there are any external
   // functions in this SCC: if so, we cannot prune any functions in this SCC.
+  // Definitions that are weak and not declared non-throwing might be 
+  // overridden at linktime with something that throws, so assume that.
   // If this SCC includes the unwind instruction, we KNOW it throws, so
   // obviously the SCC might throw.
   //
@@ -71,7 +73,7 @@ bool PruneEH::runOnSCC(const std::vector<CallGraphNode *> &SCC) {
   for (unsigned i = 0, e = SCC.size();
        (!SCCMightUnwind || !SCCMightReturn) && i != e; ++i) {
     Function *F = SCC[i]->getFunction();
-    if (F == 0) {
+    if (F == 0 || (F->hasWeakLinkage() && !F->doesNotThrow())) {
       SCCMightUnwind = true;
       SCCMightReturn = true;
     } else if (F->isDeclaration()) {