@@ -48,6 +48,11 @@ static bool IsShiftedMask(uint64_t I, uint64_t &Pos, uint64_t &Size) {
48
48
return true ;
49
49
}
50
50
51
+ static SDValue GetGlobalReg (SelectionDAG &DAG, EVT Ty) {
52
+ MipsFunctionInfo *FI = DAG.getMachineFunction ().getInfo <MipsFunctionInfo>();
53
+ return DAG.getRegister (FI->getGlobalBaseReg (), Ty);
54
+ }
55
+
51
56
const char *MipsTargetLowering::getTargetNodeName (unsigned Opcode) const {
52
57
switch (Opcode) {
53
58
case MipsISD::JmpLink: return " MipsISD::JmpLink" ;
@@ -1496,7 +1501,7 @@ SDValue MipsTargetLowering::LowerGlobalAddress(SDValue Op,
1496
1501
(HasGotOfst ? MipsII::MO_GOT_PAGE : MipsII::MO_GOT_DISP) :
1497
1502
(HasGotOfst ? MipsII::MO_GOT : MipsII::MO_GOT16);
1498
1503
SDValue GA = DAG.getTargetGlobalAddress (GV, dl, ValTy, 0 , GotFlag);
1499
- GA = DAG.getNode (MipsISD::Wrapper, dl, ValTy, GA);
1504
+ GA = DAG.getNode (MipsISD::Wrapper, dl, ValTy, GetGlobalReg (DAG, ValTy), GA);
1500
1505
SDValue ResNode = DAG.getLoad (ValTy, dl, DAG.getEntryNode (), GA,
1501
1506
MachinePointerInfo (), false , false , false , 0 );
1502
1507
// On functions and global targets not internal linked only
@@ -1529,7 +1534,8 @@ SDValue MipsTargetLowering::LowerBlockAddress(SDValue Op,
1529
1534
unsigned GOTFlag = IsN64 ? MipsII::MO_GOT_PAGE : MipsII::MO_GOT;
1530
1535
unsigned OFSTFlag = IsN64 ? MipsII::MO_GOT_OFST : MipsII::MO_ABS_LO;
1531
1536
SDValue BAGOTOffset = DAG.getBlockAddress (BA, ValTy, true , GOTFlag);
1532
- BAGOTOffset = DAG.getNode (MipsISD::Wrapper, dl, ValTy, BAGOTOffset);
1537
+ BAGOTOffset = DAG.getNode (MipsISD::Wrapper, dl, ValTy,
1538
+ GetGlobalReg (DAG, ValTy), BAGOTOffset);
1533
1539
SDValue BALOOffset = DAG.getBlockAddress (BA, ValTy, true , OFSTFlag);
1534
1540
SDValue Load = DAG.getLoad (ValTy, dl, DAG.getEntryNode (), BAGOTOffset,
1535
1541
MachinePointerInfo (), false , false , false , 0 );
@@ -1554,7 +1560,8 @@ LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
1554
1560
bool LocalDynamic = GV->hasInternalLinkage ();
1555
1561
unsigned Flag = LocalDynamic ? MipsII::MO_TLSLDM :MipsII::MO_TLSGD;
1556
1562
SDValue TGA = DAG.getTargetGlobalAddress (GV, dl, PtrVT, 0 , Flag);
1557
- SDValue Argument = DAG.getNode (MipsISD::Wrapper, dl, PtrVT, TGA);
1563
+ SDValue Argument = DAG.getNode (MipsISD::Wrapper, dl, PtrVT,
1564
+ GetGlobalReg (DAG, PtrVT), TGA);
1558
1565
unsigned PtrSize = PtrVT.getSizeInBits ();
1559
1566
IntegerType *PtrTy = Type::getIntNTy (*DAG.getContext (), PtrSize);
1560
1567
@@ -1591,7 +1598,8 @@ LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
1591
1598
// Initial Exec TLS Model
1592
1599
SDValue TGA = DAG.getTargetGlobalAddress (GV, dl, PtrVT, 0 ,
1593
1600
MipsII::MO_GOTTPREL);
1594
- TGA = DAG.getNode (MipsISD::Wrapper, dl, PtrVT, TGA);
1601
+ TGA = DAG.getNode (MipsISD::Wrapper, dl, PtrVT, GetGlobalReg (DAG, PtrVT),
1602
+ TGA);
1595
1603
Offset = DAG.getLoad (PtrVT, dl,
1596
1604
DAG.getEntryNode (), TGA, MachinePointerInfo (),
1597
1605
false , false , false , 0 );
@@ -1628,7 +1636,8 @@ LowerJumpTable(SDValue Op, SelectionDAG &DAG) const
1628
1636
unsigned GOTFlag = IsN64 ? MipsII::MO_GOT_PAGE : MipsII::MO_GOT;
1629
1637
unsigned OfstFlag = IsN64 ? MipsII::MO_GOT_OFST : MipsII::MO_ABS_LO;
1630
1638
JTI = DAG.getTargetJumpTable (JT->getIndex (), PtrVT, GOTFlag);
1631
- JTI = DAG.getNode (MipsISD::Wrapper, dl, PtrVT, JTI);
1639
+ JTI = DAG.getNode (MipsISD::Wrapper, dl, PtrVT, GetGlobalReg (DAG, PtrVT),
1640
+ JTI);
1632
1641
HiPart = DAG.getLoad (PtrVT, dl, DAG.getEntryNode (), JTI,
1633
1642
MachinePointerInfo (), false , false , false , 0 );
1634
1643
JTILo = DAG.getTargetJumpTable (JT->getIndex (), PtrVT, OfstFlag);
@@ -1671,7 +1680,7 @@ LowerConstantPool(SDValue Op, SelectionDAG &DAG) const
1671
1680
unsigned OFSTFlag = IsN64 ? MipsII::MO_GOT_OFST : MipsII::MO_ABS_LO;
1672
1681
SDValue CP = DAG.getTargetConstantPool (C, ValTy, N->getAlignment (),
1673
1682
N->getOffset (), GOTFlag);
1674
- CP = DAG.getNode (MipsISD::Wrapper, dl, ValTy, CP);
1683
+ CP = DAG.getNode (MipsISD::Wrapper, dl, ValTy, GetGlobalReg (DAG, ValTy), CP);
1675
1684
SDValue Load = DAG.getLoad (ValTy, dl, DAG.getEntryNode (), CP,
1676
1685
MachinePointerInfo::getConstantPool (), false ,
1677
1686
false , false , 0 );
@@ -2210,7 +2219,7 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
2210
2219
2211
2220
// If this is the first call, create a stack frame object that points to
2212
2221
// a location to which .cprestore saves $gp.
2213
- if (IsO32 && IsPIC && !MipsFI->getGPFI ())
2222
+ if (IsO32 && IsPIC && MipsFI-> globalBaseRegFixed () && !MipsFI->getGPFI ())
2214
2223
MipsFI->setGPFI (MFI->CreateFixedObject (4 , 0 , true ));
2215
2224
2216
2225
// Get the frame index of the stack frame object that points to the location
@@ -2384,7 +2393,8 @@ MipsTargetLowering::LowerCall(SDValue InChain, SDValue Callee,
2384
2393
if (IsPICCall) {
2385
2394
if (GlobalOrExternal) {
2386
2395
// Load callee address
2387
- Callee = DAG.getNode (MipsISD::Wrapper, dl, getPointerTy (), Callee);
2396
+ Callee = DAG.getNode (MipsISD::Wrapper, dl, getPointerTy (),
2397
+ GetGlobalReg (DAG, getPointerTy ()), Callee);
2388
2398
SDValue LoadValue = DAG.getLoad (getPointerTy (), dl, DAG.getEntryNode (),
2389
2399
Callee, MachinePointerInfo::getGOT (),
2390
2400
false , false , false , 0 );
0 commit comments