mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 21:18:19 +00:00
[PowerPC] 32-bit ELF PIC support
This adds initial support for PPC32 ELF PIC (Position Independent Code; the -fPIC variety), thus rectifying a long-standing deficiency in the PowerPC backend. Patch by Justin Hibbits! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213427 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -461,7 +461,7 @@ void PPCFrameLowering::replaceFPWithRealFP(MachineFunction &MF) const {
|
||||
const PPCRegisterInfo *RegInfo =
|
||||
static_cast<const PPCRegisterInfo*>(MF.getTarget().getRegisterInfo());
|
||||
bool HasBP = RegInfo->hasBasePointer(MF);
|
||||
unsigned BPReg = HasBP ? (unsigned) PPC::R30 : FPReg;
|
||||
unsigned BPReg = HasBP ? (unsigned) RegInfo->getBaseRegister(MF) : FPReg;
|
||||
unsigned BP8Reg = HasBP ? (unsigned) PPC::X30 : FPReg;
|
||||
|
||||
for (MachineFunction::iterator BI = MF.begin(), BE = MF.end();
|
||||
@@ -506,6 +506,7 @@ void PPCFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
DebugLoc dl;
|
||||
bool needsFrameMoves = MMI.hasDebugInfo() ||
|
||||
MF.getFunction()->needsUnwindTableEntry();
|
||||
bool isPIC = MF.getTarget().getRelocationModel() == Reloc::PIC_;
|
||||
|
||||
// Get processor type.
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
@@ -546,7 +547,7 @@ void PPCFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
bool HasBP = RegInfo->hasBasePointer(MF);
|
||||
|
||||
unsigned SPReg = isPPC64 ? PPC::X1 : PPC::R1;
|
||||
unsigned BPReg = isPPC64 ? PPC::X30 : PPC::R30;
|
||||
unsigned BPReg = RegInfo->getBaseRegister(MF);
|
||||
unsigned FPReg = isPPC64 ? PPC::X31 : PPC::R31;
|
||||
unsigned LRReg = isPPC64 ? PPC::LR8 : PPC::LR;
|
||||
unsigned ScratchReg = isPPC64 ? PPC::X0 : PPC::R0;
|
||||
@@ -602,7 +603,9 @@ void PPCFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
BPOffset = FFI->getObjectOffset(BPIndex);
|
||||
} else {
|
||||
BPOffset =
|
||||
PPCFrameLowering::getBasePointerSaveOffset(isPPC64, isDarwinABI);
|
||||
PPCFrameLowering::getBasePointerSaveOffset(isPPC64,
|
||||
isDarwinABI,
|
||||
isPIC);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -839,6 +842,7 @@ void PPCFrameLowering::emitEpilogue(MachineFunction &MF,
|
||||
// Get the ABI.
|
||||
bool isDarwinABI = Subtarget.isDarwinABI();
|
||||
bool isSVR4ABI = Subtarget.isSVR4ABI();
|
||||
bool isPIC = MF.getTarget().getRelocationModel() == Reloc::PIC_;
|
||||
|
||||
// Check if the link register (LR) has been saved.
|
||||
PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
|
||||
@@ -849,7 +853,7 @@ void PPCFrameLowering::emitEpilogue(MachineFunction &MF,
|
||||
bool HasBP = RegInfo->hasBasePointer(MF);
|
||||
|
||||
unsigned SPReg = isPPC64 ? PPC::X1 : PPC::R1;
|
||||
unsigned BPReg = isPPC64 ? PPC::X30 : PPC::R30;
|
||||
unsigned BPReg = RegInfo->getBaseRegister(MF);
|
||||
unsigned FPReg = isPPC64 ? PPC::X31 : PPC::R31;
|
||||
unsigned ScratchReg = isPPC64 ? PPC::X0 : PPC::R0;
|
||||
unsigned TempReg = isPPC64 ? PPC::X12 : PPC::R12; // another scratch reg
|
||||
@@ -890,7 +894,9 @@ void PPCFrameLowering::emitEpilogue(MachineFunction &MF,
|
||||
BPOffset = FFI->getObjectOffset(BPIndex);
|
||||
} else {
|
||||
BPOffset =
|
||||
PPCFrameLowering::getBasePointerSaveOffset(isPPC64, isDarwinABI);
|
||||
PPCFrameLowering::getBasePointerSaveOffset(isPPC64,
|
||||
isDarwinABI,
|
||||
isPIC);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1067,6 +1073,7 @@ PPCFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
int FPSI = FI->getFramePointerSaveIndex();
|
||||
bool isPPC64 = Subtarget.isPPC64();
|
||||
bool isDarwinABI = Subtarget.isDarwinABI();
|
||||
bool isPIC = MF.getTarget().getRelocationModel() == Reloc::PIC_;
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
|
||||
// If the frame pointer save index hasn't been defined yet.
|
||||
@@ -1081,7 +1088,7 @@ PPCFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||
|
||||
int BPSI = FI->getBasePointerSaveIndex();
|
||||
if (!BPSI && RegInfo->hasBasePointer(MF)) {
|
||||
int BPOffset = getBasePointerSaveOffset(isPPC64, isDarwinABI);
|
||||
int BPOffset = getBasePointerSaveOffset(isPPC64, isDarwinABI, isPIC);
|
||||
// Allocate the frame index for the base pointer save area.
|
||||
BPSI = MFI->CreateFixedObject(isPPC64? 8 : 4, BPOffset, true);
|
||||
// Save the result.
|
||||
|
||||
Reference in New Issue
Block a user