mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
When linking two modules, we should copy the alias.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37776 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ef6ba18a4c
commit
31ed0fb804
@ -561,6 +561,31 @@ static bool LinkGlobals(Module *Dest, Module *Src,
|
||||
return false;
|
||||
}
|
||||
|
||||
// LinkAlias - Loop through the alias in the src module and link them into the
|
||||
// dest module.
|
||||
static bool LinkAlias(Module *Dest, const Module *Src, std::string *Err) {
|
||||
// Loop over all alias in the src module
|
||||
for (Module::const_alias_iterator I = Src->alias_begin(),
|
||||
E = Src->alias_end(); I != E; ++I) {
|
||||
const GlobalAlias *GA = I;
|
||||
|
||||
GlobalValue *NewAliased = NULL;
|
||||
const GlobalValue *Aliased = GA->getAliasedGlobal();
|
||||
if (isa<GlobalVariable>(*Aliased))
|
||||
NewAliased = Dest->getGlobalVariable(Aliased->getName());
|
||||
else if (isa<Function>(*Aliased))
|
||||
NewAliased = Dest->getFunction(Aliased->getName());
|
||||
// FIXME: we should handle the bitcast alias.
|
||||
assert(NewAliased && "Can't find the aliased GV.");
|
||||
|
||||
GlobalAlias *NewGA = new GlobalAlias(GA->getType()->getElementType(),
|
||||
GA->getLinkage(), GA->getName(),
|
||||
NewAliased, Dest);
|
||||
CopyGVAttributes(NewGA, GA);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// LinkGlobalInits - Update the initializers in the Dest module now that all
|
||||
// globals that may be referenced are in Dest.
|
||||
@ -1005,6 +1030,9 @@ Linker::LinkModules(Module *Dest, Module *Src, std::string *ErrorMsg) {
|
||||
// If there were any appending global variables, link them together now.
|
||||
if (LinkAppendingVars(Dest, AppendingVars, ErrorMsg)) return true;
|
||||
|
||||
// If there were any alias, link them now.
|
||||
if (LinkAlias(Dest, Src, ErrorMsg)) return true;
|
||||
|
||||
// If the source library's module id is in the dependent library list of the
|
||||
// destination library, remove it since that module is now linked in.
|
||||
sys::Path modId;
|
||||
|
Loading…
x
Reference in New Issue
Block a user