diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/MergeFunctions.cpp | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/llvm/lib/Transforms/IPO/MergeFunctions.cpp b/llvm/lib/Transforms/IPO/MergeFunctions.cpp index 16083ec7817..e237fcde026 100644 --- a/llvm/lib/Transforms/IPO/MergeFunctions.cpp +++ b/llvm/lib/Transforms/IPO/MergeFunctions.cpp @@ -458,8 +458,8 @@ static LinkageCategory categorize(const Function *F) {  }  static void ThunkGToF(Function *F, Function *G) { -  Function *NewG = Function::Create(G->getFunctionType(), G->getLinkage(), -                                    "", G->getParent()); +  Function *NewG = Function::Create(G->getFunctionType(), G->getLinkage(), "", +                                    G->getParent());    BasicBlock *BB = BasicBlock::Create("", NewG);    std::vector<Value *> Args; @@ -539,8 +539,21 @@ static bool fold(std::vector<Function *> &FnVec, unsigned i, unsigned j) {        }        break; -    case ExternalWeak: -      return false; +    case ExternalWeak: { +      assert(catG == ExternalWeak); + +      // Make them both thunks to the same internal function. +      F->setAlignment(std::max(F->getAlignment(), G->getAlignment())); +      Function *H = Function::Create(F->getFunctionType(), F->getLinkage(), "", +                                     F->getParent()); +      H->copyAttributesFrom(F); +      H->takeName(F); + +      ThunkGToF(F, G); +      ThunkGToF(F, H); + +      F->setLinkage(GlobalValue::InternalLinkage); +    } break;      case Internal:        switch (catG) { | 

