mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
Fix PR8300 by remembering to keep the bitcast in all cases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116788 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5c0db76cf2
commit
19785995f6
@ -668,6 +668,13 @@ static bool LinkAlias(Module *Dest, const Module *Src,
|
|||||||
GlobalValue* DAliasee = cast<GlobalValue>(VMI->second);
|
GlobalValue* DAliasee = cast<GlobalValue>(VMI->second);
|
||||||
GlobalValue* DGV = NULL;
|
GlobalValue* DGV = NULL;
|
||||||
|
|
||||||
|
// Fixup aliases to bitcasts. Note that aliases to GEPs are still broken
|
||||||
|
// by this, but aliases to GEPs are broken to a lot of other things, so
|
||||||
|
// it's less important.
|
||||||
|
Constant *DAliaseeConst = DAliasee;
|
||||||
|
if (SGA->getType() != DAliasee->getType())
|
||||||
|
DAliaseeConst = ConstantExpr::getBitCast(DAliasee, SGA->getType());
|
||||||
|
|
||||||
// Try to find something 'similar' to SGA in destination module.
|
// Try to find something 'similar' to SGA in destination module.
|
||||||
if (!DGV && !SGA->hasLocalLinkage()) {
|
if (!DGV && !SGA->hasLocalLinkage()) {
|
||||||
DGV = Dest->getNamedAlias(SGA->getName());
|
DGV = Dest->getNamedAlias(SGA->getName());
|
||||||
@ -721,7 +728,7 @@ static bool LinkAlias(Module *Dest, const Module *Src,
|
|||||||
"': aliasee is not global variable");
|
"': aliasee is not global variable");
|
||||||
|
|
||||||
NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
|
NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
|
||||||
SGA->getName(), DAliasee, Dest);
|
SGA->getName(), DAliaseeConst, Dest);
|
||||||
CopyGVAttributes(NewGA, SGA);
|
CopyGVAttributes(NewGA, SGA);
|
||||||
|
|
||||||
// Any uses of DGV need to change to NewGA, with cast, if needed.
|
// Any uses of DGV need to change to NewGA, with cast, if needed.
|
||||||
@ -750,7 +757,7 @@ static bool LinkAlias(Module *Dest, const Module *Src,
|
|||||||
"': aliasee is not function");
|
"': aliasee is not function");
|
||||||
|
|
||||||
NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
|
NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
|
||||||
SGA->getName(), DAliasee, Dest);
|
SGA->getName(), DAliaseeConst, Dest);
|
||||||
CopyGVAttributes(NewGA, SGA);
|
CopyGVAttributes(NewGA, SGA);
|
||||||
|
|
||||||
// Any uses of DF need to change to NewGA, with cast, if needed.
|
// Any uses of DF need to change to NewGA, with cast, if needed.
|
||||||
@ -772,14 +779,8 @@ static bool LinkAlias(Module *Dest, const Module *Src,
|
|||||||
} else {
|
} else {
|
||||||
// No linking to be performed, simply create an identical version of the
|
// No linking to be performed, simply create an identical version of the
|
||||||
// alias over in the dest module...
|
// alias over in the dest module...
|
||||||
Constant *Aliasee = DAliasee;
|
|
||||||
// Fixup aliases to bitcasts. Note that aliases to GEPs are still broken
|
|
||||||
// by this, but aliases to GEPs are broken to a lot of other things, so
|
|
||||||
// it's less important.
|
|
||||||
if (SGA->getType() != DAliasee->getType())
|
|
||||||
Aliasee = ConstantExpr::getBitCast(DAliasee, SGA->getType());
|
|
||||||
NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
|
NewGA = new GlobalAlias(SGA->getType(), SGA->getLinkage(),
|
||||||
SGA->getName(), Aliasee, Dest);
|
SGA->getName(), DAliaseeConst, Dest);
|
||||||
CopyGVAttributes(NewGA, SGA);
|
CopyGVAttributes(NewGA, SGA);
|
||||||
|
|
||||||
// Proceed to 'common' steps
|
// Proceed to 'common' steps
|
||||||
|
13
test/Linker/PR8300.ll
Normal file
13
test/Linker/PR8300.ll
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
; RUN: echo {%foo2 = type \{ \[8 x i8\] \} \
|
||||||
|
; RUN: declare void @zed(%foo2*) } > %t.ll
|
||||||
|
; RUN: llvm-link %t.ll %s -o %t.bc
|
||||||
|
|
||||||
|
%foo = type { [8 x i8] }
|
||||||
|
%bar = type { [9 x i8] }
|
||||||
|
|
||||||
|
@zed = alias bitcast (void (%bar*)* @xyz to void (%foo*)*)
|
||||||
|
|
||||||
|
define void @xyz(%bar* %this) {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user