aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/Mips/MipsRegisterInfo.cpp
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2007-10-09 03:15:11 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2007-10-09 03:15:11 +0000
commit8262df3aa49feaae18a86d21ed8a20427d638218 (patch)
tree34c2d80693d9f5bac537de5aaa2f497642f85df1 /lib/Target/Mips/MipsRegisterInfo.cpp
parent0a6040063fd9419041a81ada8f75b389381eb6b9 (diff)
Position Independent Code (PIC) support [3]
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42780 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Mips/MipsRegisterInfo.cpp')
-rw-r--r--lib/Target/Mips/MipsRegisterInfo.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/Target/Mips/MipsRegisterInfo.cpp b/lib/Target/Mips/MipsRegisterInfo.cpp
index 8ab5e0e088..2e872932ac 100644
--- a/lib/Target/Mips/MipsRegisterInfo.cpp
+++ b/lib/Target/Mips/MipsRegisterInfo.cpp
@@ -369,9 +369,10 @@ emitPrologue(MachineFunction &MF) const
MachineFrameInfo *MFI = MF.getFrameInfo();
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
MachineBasicBlock::iterator MBBI = MBB.begin();
+ bool isPIC = (MF.getTarget().getRelocationModel() == Reloc::PIC_);
- // Replace the dummy '0' SPOffset by the negative offsets, as
- // explained on LowerFORMAL_ARGUMENTS
+ // Replace the dummy '0' SPOffset by the negative
+ // offsets, as explained on LowerFORMAL_ARGUMENTS
MipsFI->adjustLoadArgsFI(MFI);
MipsFI->adjustStoreVarArgsFI(MFI);
@@ -421,6 +422,10 @@ emitPrologue(MachineFunction &MF) const
// Update frame info
MFI->setStackSize(NumBytes);
+ // PIC speficic function prologue
+ if (isPIC)
+ BuildMI(MBB, MBBI, TII.get(Mips::CPLOAD)).addReg(Mips::T9);
+
// Adjust stack : addi sp, sp, (-imm)
BuildMI(MBB, MBBI, TII.get(Mips::ADDiu), Mips::SP)
.addReg(Mips::SP).addImm(-NumBytes);
@@ -443,6 +448,12 @@ emitPrologue(MachineFunction &MF) const
BuildMI(MBB, MBBI, TII.get(Mips::ADDu), Mips::FP)
.addReg(Mips::SP).addReg(Mips::ZERO);
}
+
+ // PIC speficic function prologue
+ if ((isPIC) && (MFI->hasCalls()))
+ BuildMI(MBB, MBBI, TII.get(Mips::CPRESTORE))
+ .addImm(MipsFI->getGPStackOffset());
+
}
void MipsRegisterInfo::