mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-24 07:35:04 +00:00
Given two identical weak functions, produce one internal function and two weak
thunks. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73230 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7e0842fb21
commit
8728d7a3ea
@ -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) {
|
||||
|
13
test/Transforms/MergeFunc/fold-weak.ll
Normal file
13
test/Transforms/MergeFunc/fold-weak.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user