diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2013-01-07 19:29:18 +0000 |
---|---|---|
committer | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2013-01-07 19:29:18 +0000 |
commit | 5b7f9216c357f1cdf507f300f396b44cb982eb3f (patch) | |
tree | 0ec0da8431762da98a57a1a6a7dc944053f46836 /lib/Target/PowerPC/PPCISelDAGToDAG.cpp | |
parent | 3ebe59c892051375623fea55e977ff559fdb3323 (diff) | |
download | llvm-5b7f9216c357f1cdf507f300f396b44cb982eb3f.tar.gz llvm-5b7f9216c357f1cdf507f300f396b44cb982eb3f.tar.bz2 llvm-5b7f9216c357f1cdf507f300f396b44cb982eb3f.tar.xz |
This patch addresses bug 14678 by fixing two problems in medium code model
code generation. Variables addressed through a GlobalAlias were not being
handled, and variables with available_externally linkage were treated
incorrectly. The patch contains two new tests to verify the correct code
generation for these cases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171778 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCISelDAGToDAG.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index 9ac0a2731a..762b3467c3 100644 --- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -25,6 +25,7 @@ #include "llvm/IR/Function.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/GlobalVariable.h" +#include "llvm/IR/GlobalAlias.h" #include "llvm/IR/Intrinsics.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -1296,14 +1297,18 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) { if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(GA)) { const GlobalValue *GValue = G->getGlobal(); - const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GValue); - assert((GVar || isa<Function>(GValue)) && + const GlobalAlias *GAlias = dyn_cast<GlobalAlias>(GValue); + const GlobalValue *RealGValue = GAlias ? + GAlias->resolveAliasedGlobal(false) : GValue; + const GlobalVariable *GVar = dyn_cast<GlobalVariable>(RealGValue); + assert((GVar || isa<Function>(RealGValue)) && "Unexpected global value subclass!"); // An external variable is one without an initializer. For these, // for variables with common linkage, and for Functions, generate // the LDtocL form. - if (!GVar || !GVar->hasInitializer() || GValue->hasCommonLinkage()) + if (!GVar || !GVar->hasInitializer() || RealGValue->hasCommonLinkage() || + RealGValue->hasAvailableExternallyLinkage()) return CurDAG->getMachineNode(PPC::LDtocL, dl, MVT::i64, GA, SDValue(Tmp, 0)); } |