1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Fix incorrect linker behaviour: we shouldn't resolve weak aliases.

llvm-svn: 55997
This commit is contained in:
Anton Korobeynikov 2008-09-09 18:23:48 +00:00
parent 59a67c60db
commit 3a24741034
3 changed files with 15 additions and 5 deletions

View File

@ -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; }

View File

@ -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;

View File

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