diff options
| author | Akira Hatanaka <ahatanaka@mips.com> | 2012-11-21 20:40:38 +0000 |
|---|---|---|
| committer | Akira Hatanaka <ahatanaka@mips.com> | 2012-11-21 20:40:38 +0000 |
| commit | bb6e74a2f17c0b5ab66749343f48103ea03da968 (patch) | |
| tree | c7c2c68324453fb708f4bfe1d14b3dc14fe3e1d8 /llvm/lib/Target/Mips/MipsISelLowering.cpp | |
| parent | 93fe3dcb13c9d6e8bac05626f39b0361d87f76e6 (diff) | |
| download | bcm5719-llvm-bb6e74a2f17c0b5ab66749343f48103ea03da968.tar.gz bcm5719-llvm-bb6e74a2f17c0b5ab66749343f48103ea03da968.zip | |
[mips] Generate big GOT code.
llvm-svn: 168460
Diffstat (limited to 'llvm/lib/Target/Mips/MipsISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsISelLowering.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp index 105c945328d..2a3c5f91d45 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp @@ -1832,6 +1832,10 @@ SDValue MipsTargetLowering::LowerGlobalAddress(SDValue Op, if (GV->hasInternalLinkage() || (GV->hasLocalLinkage() && !isa<Function>(GV))) return getAddrLocal(Op, DAG, HasMips64); + if (LargeGOT) + return getAddrGlobalLargeGOT(Op, DAG, MipsII::MO_GOT_HI16, + MipsII::MO_GOT_LO16); + return getAddrGlobal(Op, DAG, HasMips64 ? MipsII::MO_GOT_DISP : MipsII::MO_GOT16); } @@ -2850,6 +2854,9 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, if (IsPICCall) { if (G->getGlobal()->hasInternalLinkage()) Callee = getAddrLocal(Callee, DAG, HasMips64); + else if (LargeGOT) + Callee = getAddrGlobalLargeGOT(Callee, DAG, MipsII::MO_CALL_HI16, + MipsII::MO_CALL_LO16); else Callee = getAddrGlobal(Callee, DAG, MipsII::MO_GOT_CALL); } else @@ -2858,11 +2865,14 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, GlobalOrExternal = true; } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) { - if (IsN64 || (!IsO32 && IsPIC)) - Callee = getAddrGlobal(Callee, DAG, MipsII::MO_GOT_DISP); - else if (!IsPIC) // !N64 && static + if (!IsN64 && !IsPIC) // !N64 && static Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy(), MipsII::MO_NO_FLAG); + else if (LargeGOT) + Callee = getAddrGlobalLargeGOT(Callee, DAG, MipsII::MO_CALL_HI16, + MipsII::MO_CALL_LO16); + else if (HasMips64) + Callee = getAddrGlobal(Callee, DAG, MipsII::MO_GOT_DISP); else // O32 & PIC Callee = getAddrGlobal(Callee, DAG, MipsII::MO_GOT_CALL); |

