Position Independent Code (PIC) support [2]

- Added a function to hold the stack location 
  where GP must be stored during LowerCALL
- AsmPrinter now emits directives based on
  relocation type
- PIC_ set to default relocation type (same as GCC)


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42779 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bruno Cardoso Lopes 2007-10-09 03:01:19 +00:00
parent e78080c4dc
commit 0a6040063f
3 changed files with 32 additions and 10 deletions

View File

@ -67,7 +67,7 @@ namespace {
void printHex32(unsigned int Value);
void emitFunctionStart(MachineFunction &MF);
void emitFunctionEnd();
void emitFunctionEnd(MachineFunction &MF);
void emitFrameDirective(MachineFunction &MF);
void emitMaskDirective(MachineFunction &MF);
void emitFMaskDirective(MachineFunction &MF);
@ -209,10 +209,12 @@ getSavedRegsBitmask(bool isFloat, MachineFunction &MF)
Bitmask |= (1 << MipsRegisterInfo::getRegisterNumbering(CSI[i].getReg()));
if (RI.hasFP(MF))
Bitmask |= (1 << MipsRegisterInfo::getRegisterNumbering(RI.getFrameRegister(MF)));
Bitmask |= (1 << MipsRegisterInfo::
getRegisterNumbering(RI.getFrameRegister(MF)));
if (MF.getFrameInfo()->hasCalls())
Bitmask |= (1 << MipsRegisterInfo::getRegisterNumbering(RI.getRARegister()));
Bitmask |= (1 << MipsRegisterInfo::
getRegisterNumbering(RI.getRARegister()));
return Bitmask;
}
@ -247,16 +249,24 @@ emitFunctionStart(MachineFunction &MF)
emitFrameDirective(MF);
emitMaskDirective(MF);
emitFMaskDirective(MF);
emitSetDirective(NOREORDER);
emitSetDirective(NOMACRO);
if (MF.getTarget().getRelocationModel() == Reloc::Static) {
emitSetDirective(NOREORDER);
emitSetDirective(NOMACRO);
}
O << "\n";
}
/// Emit the directives used by GAS on the end of functions
void MipsAsmPrinter::
emitFunctionEnd() {
emitSetDirective(MACRO);
emitSetDirective(REORDER);
emitFunctionEnd(MachineFunction &MF)
{
if (MF.getTarget().getRelocationModel() == Reloc::Static) {
emitSetDirective(MACRO);
emitSetDirective(REORDER);
}
O << "\t.end\t" << CurrentFnName << "\n";
}
@ -298,7 +308,7 @@ runOnMachineFunction(MachineFunction &MF)
}
// Emit function end directives
emitFunctionEnd();
emitFunctionEnd(MF);
// We didn't modify anything.
return false;

View File

@ -33,6 +33,11 @@ private:
/// the Return Address must be saved
int RAStackOffset;
/// When PIC is used the GP must be saved on the stack
/// on the function prologue, so a reference to its stack
/// location must be kept.
int GPStackOffset;
/// MipsFIHolder - Holds a FrameIndex and it's Stack Pointer Offset
struct MipsFIHolder {
@ -69,6 +74,9 @@ public:
int getRAStackOffset() const { return RAStackOffset; }
void setRAStackOffset(int Off) { RAStackOffset = Off; }
int getGPStackOffset() const { return GPStackOffset; }
void setGPStackOffset(int Off) { GPStackOffset = Off; }
int getTopSavedRegOffset() const {
return (RAStackOffset > FPStackOffset) ?
(RAStackOffset) : (FPStackOffset);

View File

@ -39,7 +39,11 @@ MipsTargetMachine::
MipsTargetMachine(const Module &M, const std::string &FS):
Subtarget(*this, M, FS), DataLayout("E-p:32:32:32"),
InstrInfo(*this), FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0),
TLInfo(*this) {}
TLInfo(*this)
{
if (getRelocationModel() != Reloc::Static)
setRelocationModel(Reloc::PIC_);
}
// return 0 and must specify -march to gen MIPS code.
unsigned MipsTargetMachine::