Position Independent Code (PIC) support [2]
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 9 Oct 2007 03:01:19 +0000 (03:01 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 9 Oct 2007 03:01:19 +0000 (03:01 +0000)
- 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

lib/Target/Mips/MipsAsmPrinter.cpp
lib/Target/Mips/MipsMachineFunction.h
lib/Target/Mips/MipsTargetMachine.cpp

index 254cc563c9c43ba17200bcc76df20cc40c81f189..cd5c1a3d657dcfa5dd5ed334e863c20237452f1b 100644 (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;
index 0f9a1e0e6a31932452505f4cc9966061f2698182..2515aa0438a6d0231daa6274908f15f9d12f57af 100644 (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);
index 372e267d4629f99ddb20dba7183cf0434623a83d..64516594f66947c2fbe9193a1157961a547cf29b 100644 (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::