mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Fix incorrect linker behaviour: we shouldn't resolve weak aliases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55997 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bff66b0c6c
commit
832b2a9cd8
@ -76,8 +76,10 @@ public:
|
||||
|
||||
/// resolveAliasedGlobal() - This method tries to ultimately resolve the alias
|
||||
/// by going through the aliasing chain and trying to find the very last
|
||||
/// global. Returns NULL if a cycle was found.
|
||||
const GlobalValue* resolveAliasedGlobal() const;
|
||||
/// global. Returns NULL if a cycle was found. If traverseWeak is true, then
|
||||
/// the whole chain aliasing chain is traversed, otherwise - only strong
|
||||
/// aliases.
|
||||
const GlobalValue* resolveAliasedGlobal(bool traverseWeak = true) const;
|
||||
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const GlobalAlias *) { return true; }
|
||||
|
@ -1169,8 +1169,8 @@ static bool LinkAppendingVars(Module *M,
|
||||
static bool ResolveAliases(Module *Dest) {
|
||||
for (Module::alias_iterator I = Dest->alias_begin(), E = Dest->alias_end();
|
||||
I != E; ++I)
|
||||
if (const GlobalValue *GV = I->resolveAliasedGlobal())
|
||||
if (!GV->isDeclaration())
|
||||
if (const GlobalValue *GV = I->resolveAliasedGlobal(/*traverseWeak*/ false))
|
||||
if (GV != I && !GV->isDeclaration())
|
||||
I->replaceAllUsesWith(const_cast<GlobalValue*>(GV));
|
||||
|
||||
return false;
|
||||
|
@ -248,13 +248,21 @@ const GlobalValue *GlobalAlias::getAliasedGlobal() const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const GlobalValue *GlobalAlias::resolveAliasedGlobal() const {
|
||||
const GlobalValue *GlobalAlias::resolveAliasedGlobal(bool traverseWeak) const {
|
||||
SmallPtrSet<const GlobalValue*, 3> Visited;
|
||||
|
||||
// Check if we need to stop early.
|
||||
if (!traverseWeak && hasWeakLinkage())
|
||||
return this;
|
||||
|
||||
const GlobalValue *GV = getAliasedGlobal();
|
||||
Visited.insert(GV);
|
||||
|
||||
// Iterate over aliasing chain, stopping on weak alias if necessary.
|
||||
while (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV)) {
|
||||
if (traverseWeak && GA->hasWeakLinkage())
|
||||
break;
|
||||
|
||||
GV = GA->getAliasedGlobal();
|
||||
|
||||
if (!Visited.insert(GV))
|
||||
|
Loading…
Reference in New Issue
Block a user