Given two identical weak functions, produce one internal function and two weak

thunks.

llvm-svn: 73230
This commit is contained in:
Nick Lewycky 2009-06-12 15:56:56 +00:00
parent 768042812c
commit 25675ac14a
2 changed files with 30 additions and 4 deletions

View File

@ -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) {

View File

@ -0,0 +1,13 @@
; RUN: llvm-as < %s | opt -mergefunc | llvm-dis > %t
; RUN: grep {define weak} %t | count 2
; RUN: grep {call} %t | count 2
define weak i32 @sum(i32 %x, i32 %y) {
%sum = add i32 %x, %y
ret i32 %sum
}
define weak i32 @add(i32 %x, i32 %y) {
%sum = add i32 %x, %y
ret i32 %sum
}