mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 22:20:37 +00:00
Make safer variant of alias resolution routine to be default
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56005 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7ca9d81bce
commit
19e861a4ff
@ -76,10 +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. If traverseWeak is true, then
|
||||
/// global. Returns NULL if a cycle was found. If stopOnWeak is false, then
|
||||
/// the whole chain aliasing chain is traversed, otherwise - only strong
|
||||
/// aliases.
|
||||
const GlobalValue* resolveAliasedGlobal(bool traverseWeak = true) const;
|
||||
const GlobalValue* resolveAliasedGlobal(bool stopOnWeak = true) const;
|
||||
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const GlobalAlias *) { return true; }
|
||||
|
@ -949,7 +949,7 @@ SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV,
|
||||
if (!GVar) {
|
||||
// If GV is an alias then use the aliasee for determining thread-localness.
|
||||
if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
|
||||
GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal());
|
||||
GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal(false));
|
||||
}
|
||||
|
||||
if (GVar && GVar->isThreadLocal())
|
||||
|
@ -567,7 +567,7 @@ void *JITEmitter::getPointerToGlobal(GlobalValue *V, void *Reference,
|
||||
return TheJIT->getOrEmitGlobalVariable(GV);
|
||||
}
|
||||
if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V))
|
||||
return TheJIT->getPointerToGlobal(GA->resolveAliasedGlobal());
|
||||
return TheJIT->getPointerToGlobal(GA->resolveAliasedGlobal(false));
|
||||
|
||||
// If we have already compiled the function, return a pointer to its body.
|
||||
Function *F = cast<Function>(V);
|
||||
|
@ -1169,7 +1169,7 @@ 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(/*traverseWeak*/ false))
|
||||
if (const GlobalValue *GV = I->resolveAliasedGlobal())
|
||||
if (GV != I && !GV->isDeclaration())
|
||||
I->replaceAllUsesWith(const_cast<GlobalValue*>(GV));
|
||||
|
||||
|
@ -369,7 +369,7 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
|
||||
// If GV is an alias then use the aliasee for determining
|
||||
// thread-localness.
|
||||
if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
|
||||
GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal());
|
||||
GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal(false));
|
||||
}
|
||||
|
||||
bool isThreadLocal = GVar && GVar->isThreadLocal();
|
||||
|
@ -2223,7 +2223,7 @@ bool GlobalOpt::ResolveAliases(Module &M) {
|
||||
if (I->use_empty())
|
||||
continue;
|
||||
|
||||
if (const GlobalValue *GV = I->resolveAliasedGlobal(/*traverseWeak*/ false))
|
||||
if (const GlobalValue *GV = I->resolveAliasedGlobal())
|
||||
if (GV != I) {
|
||||
I->replaceAllUsesWith(const_cast<GlobalValue*>(GV));
|
||||
Changed = true;
|
||||
@ -2252,7 +2252,6 @@ bool GlobalOpt::runOnModule(Module &M) {
|
||||
|
||||
// Optimize non-address-taken globals.
|
||||
LocalChange |= OptimizeGlobalVars(M);
|
||||
Changed |= LocalChange;
|
||||
|
||||
// Resolve aliases, when possible.
|
||||
LocalChange |= ResolveAliases(M);
|
||||
|
@ -248,11 +248,11 @@ const GlobalValue *GlobalAlias::getAliasedGlobal() const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const GlobalValue *GlobalAlias::resolveAliasedGlobal(bool traverseWeak) const {
|
||||
const GlobalValue *GlobalAlias::resolveAliasedGlobal(bool stopOnWeak) const {
|
||||
SmallPtrSet<const GlobalValue*, 3> Visited;
|
||||
|
||||
// Check if we need to stop early.
|
||||
if (!traverseWeak && hasWeakLinkage())
|
||||
if (stopOnWeak && hasWeakLinkage())
|
||||
return this;
|
||||
|
||||
const GlobalValue *GV = getAliasedGlobal();
|
||||
@ -260,7 +260,7 @@ const GlobalValue *GlobalAlias::resolveAliasedGlobal(bool traverseWeak) const {
|
||||
|
||||
// Iterate over aliasing chain, stopping on weak alias if necessary.
|
||||
while (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV)) {
|
||||
if (!traverseWeak && GA->hasWeakLinkage())
|
||||
if (stopOnWeak && GA->hasWeakLinkage())
|
||||
break;
|
||||
|
||||
GV = GA->getAliasedGlobal();
|
||||
|
@ -394,7 +394,7 @@ void Verifier::visitGlobalAlias(GlobalAlias &GA) {
|
||||
&GA);
|
||||
}
|
||||
|
||||
const GlobalValue* Aliasee = GA.resolveAliasedGlobal();
|
||||
const GlobalValue* Aliasee = GA.resolveAliasedGlobal(/*stopOnWeak*/ false);
|
||||
Assert1(Aliasee,
|
||||
"Aliasing chain should end with function or global variable", &GA);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user