mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
Refactor some of the code that sets up the entry block for SjLj EH. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141323 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bee5d2fac8
commit
e29fa1df55
@ -5483,8 +5483,11 @@ ARMTargetLowering::EmitAtomicBinary64(MachineInstr *MI, MachineBasicBlock *BB,
|
||||
return BB;
|
||||
}
|
||||
|
||||
MachineBasicBlock *ARMTargetLowering::
|
||||
EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
/// SetupEntryBlockForSjLj - Insert code into the entry block that creates and
|
||||
/// registers the function context.
|
||||
void ARMTargetLowering::
|
||||
SetupEntryBlockForSjLj(MachineInstr *MI, MachineBasicBlock *MBB,
|
||||
MachineBasicBlock *DispatchBB, int FI) const {
|
||||
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
|
||||
DebugLoc dl = MI->getDebugLoc();
|
||||
MachineFunction *MF = MBB->getParent();
|
||||
@ -5492,17 +5495,10 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
MachineConstantPool *MCP = MF->getConstantPool();
|
||||
ARMFunctionInfo *AFI = MF->getInfo<ARMFunctionInfo>();
|
||||
const Function *F = MF->getFunction();
|
||||
MachineFrameInfo *MFI = MF->getFrameInfo();
|
||||
int FI = MFI->getFunctionContextIndex();
|
||||
|
||||
MachineBasicBlock *DispatchBB = MF->CreateMachineBasicBlock();
|
||||
|
||||
// Shove the dispatch's address into the return slot in the function context.
|
||||
DispatchBB->setIsLandingPad();
|
||||
MBB->addSuccessor(DispatchBB);
|
||||
|
||||
bool isThumb = Subtarget->isThumb();
|
||||
bool isThumb2 = Subtarget->isThumb2();
|
||||
|
||||
unsigned PCLabelId = AFI->createPICLabelUId();
|
||||
unsigned PCAdj = (isThumb || isThumb2) ? 4 : 8;
|
||||
ARMConstantPoolValue *CPV =
|
||||
@ -5512,6 +5508,111 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
const TargetRegisterClass *TRC =
|
||||
isThumb ? ARM::tGPRRegisterClass : ARM::GPRRegisterClass;
|
||||
|
||||
// Grab constant pool and fixed stack memory operands.
|
||||
MachineMemOperand *CPMMO =
|
||||
MF->getMachineMemOperand(MachinePointerInfo::getConstantPool(),
|
||||
MachineMemOperand::MOLoad, 4, 4);
|
||||
|
||||
MachineMemOperand *FIMMOSt =
|
||||
MF->getMachineMemOperand(MachinePointerInfo::getFixedStack(FI),
|
||||
MachineMemOperand::MOStore, 4, 4);
|
||||
|
||||
// Load the address of the dispatch MBB into the jump buffer.
|
||||
if (isThumb2) {
|
||||
// Incoming value: jbuf
|
||||
// ldr.n r5, LCPI1_1
|
||||
// orr r5, r5, #1
|
||||
// add r5, pc
|
||||
// str r5, [$jbuf, #+4] ; &jbuf[1]
|
||||
unsigned NewVReg1 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::t2LDRpci), NewVReg1)
|
||||
.addConstantPoolIndex(CPI)
|
||||
.addMemOperand(CPMMO));
|
||||
// Set the low bit because of thumb mode.
|
||||
unsigned NewVReg2 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultCC(
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::t2ORRri), NewVReg2)
|
||||
.addReg(NewVReg1, RegState::Kill)
|
||||
.addImm(0x01)));
|
||||
unsigned NewVReg3 = MRI->createVirtualRegister(TRC);
|
||||
BuildMI(*MBB, MI, dl, TII->get(ARM::tPICADD), NewVReg3)
|
||||
.addReg(NewVReg2, RegState::Kill)
|
||||
.addImm(PCLabelId);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::t2STRi12))
|
||||
.addReg(NewVReg3, RegState::Kill)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(36) // &jbuf[1] :: pc
|
||||
.addMemOperand(FIMMOSt));
|
||||
} else if (isThumb) {
|
||||
// Incoming value: jbuf
|
||||
// ldr.n r1, LCPI1_4
|
||||
// add r1, pc
|
||||
// mov r2, #1
|
||||
// orrs r1, r2
|
||||
// add r2, $jbuf, #+4 ; &jbuf[1]
|
||||
// str r1, [r2]
|
||||
unsigned NewVReg1 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tLDRpci), NewVReg1)
|
||||
.addConstantPoolIndex(CPI)
|
||||
.addMemOperand(CPMMO));
|
||||
unsigned NewVReg2 = MRI->createVirtualRegister(TRC);
|
||||
BuildMI(*MBB, MI, dl, TII->get(ARM::tPICADD), NewVReg2)
|
||||
.addReg(NewVReg1, RegState::Kill)
|
||||
.addImm(PCLabelId);
|
||||
// Set the low bit because of thumb mode.
|
||||
unsigned NewVReg3 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tMOVi8), NewVReg3)
|
||||
.addReg(ARM::CPSR, RegState::Define)
|
||||
.addImm(1));
|
||||
unsigned NewVReg4 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tORR), NewVReg4)
|
||||
.addReg(ARM::CPSR, RegState::Define)
|
||||
.addReg(NewVReg2, RegState::Kill)
|
||||
.addReg(NewVReg3, RegState::Kill));
|
||||
unsigned NewVReg5 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tADDrSPi), NewVReg5)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(36)); // &jbuf[1] :: pc
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tSTRi))
|
||||
.addReg(NewVReg4, RegState::Kill)
|
||||
.addReg(NewVReg5, RegState::Kill)
|
||||
.addImm(0)
|
||||
.addMemOperand(FIMMOSt));
|
||||
} else {
|
||||
// Incoming value: jbuf
|
||||
// ldr r1, LCPI1_1
|
||||
// add r1, pc, r1
|
||||
// str r1, [$jbuf, #+4] ; &jbuf[1]
|
||||
unsigned NewVReg1 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::LDRi12), NewVReg1)
|
||||
.addConstantPoolIndex(CPI)
|
||||
.addImm(0)
|
||||
.addMemOperand(CPMMO));
|
||||
unsigned NewVReg2 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::PICADD), NewVReg2)
|
||||
.addReg(NewVReg1, RegState::Kill)
|
||||
.addImm(PCLabelId));
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::STRi12))
|
||||
.addReg(NewVReg2, RegState::Kill)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(36) // &jbuf[1] :: pc
|
||||
.addMemOperand(FIMMOSt));
|
||||
}
|
||||
}
|
||||
|
||||
MachineBasicBlock *ARMTargetLowering::
|
||||
EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
|
||||
DebugLoc dl = MI->getDebugLoc();
|
||||
MachineFunction *MF = MBB->getParent();
|
||||
MachineRegisterInfo *MRI = &MF->getRegInfo();
|
||||
ARMFunctionInfo *AFI = MF->getInfo<ARMFunctionInfo>();
|
||||
MachineFrameInfo *MFI = MF->getFrameInfo();
|
||||
int FI = MFI->getFunctionContextIndex();
|
||||
|
||||
const TargetRegisterClass *TRC =
|
||||
Subtarget->isThumb() ? ARM::tGPRRegisterClass : ARM::GPRRegisterClass;
|
||||
|
||||
// Get a mapping of the call site numbers to all of the landing pads they're
|
||||
// associated with.
|
||||
DenseMap<unsigned, SmallVector<MachineBasicBlock*, 2> > CallSiteNumToLPad;
|
||||
@ -5560,6 +5661,12 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
unsigned UId = AFI->createJumpTableUId();
|
||||
|
||||
// Create the MBBs for the dispatch code.
|
||||
|
||||
// Shove the dispatch's address into the return slot in the function context.
|
||||
MachineBasicBlock *DispatchBB = MF->CreateMachineBasicBlock();
|
||||
DispatchBB->setIsLandingPad();
|
||||
MBB->addSuccessor(DispatchBB);
|
||||
|
||||
MachineBasicBlock *TrapBB = MF->CreateMachineBasicBlock();
|
||||
BuildMI(TrapBB, dl, TII->get(ARM::TRAP));
|
||||
DispatchBB->addSuccessor(TrapBB);
|
||||
@ -5574,105 +5681,20 @@ EmitSjLjDispatchBlock(MachineInstr *MI, MachineBasicBlock *MBB) const {
|
||||
MF->insert(MF->end(), TrapBB);
|
||||
MF->RenumberBlocks(Last);
|
||||
|
||||
// Insert code into the entry block that creates and registers the function
|
||||
// context.
|
||||
SetupEntryBlockForSjLj(MI, MBB, DispatchBB, FI);
|
||||
|
||||
// Grab constant pool and fixed stack memory operands.
|
||||
MachineMemOperand *CPMMO =
|
||||
MF->getMachineMemOperand(MachinePointerInfo::getConstantPool(),
|
||||
MachineMemOperand::MOLoad, 4, 4);
|
||||
|
||||
MachineMemOperand *FIMMO =
|
||||
MachineMemOperand *FIMMOLd =
|
||||
MF->getMachineMemOperand(MachinePointerInfo::getFixedStack(FI),
|
||||
MachineMemOperand::MOStore, 4, 4);
|
||||
|
||||
// Load the address of the dispatch MBB into the jump buffer.
|
||||
if (isThumb2) {
|
||||
// Incoming value: jbuf
|
||||
// ldr.n r5, LCPI1_1
|
||||
// orr r5, r5, #1
|
||||
// add r5, pc
|
||||
// str r5, [$jbuf, #+4] ; &jbuf[1]
|
||||
unsigned NewVReg1 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::t2LDRpci), NewVReg1)
|
||||
.addConstantPoolIndex(CPI)
|
||||
.addMemOperand(CPMMO));
|
||||
// Set the low bit because of thumb mode.
|
||||
unsigned NewVReg2 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultCC(
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::t2ORRri), NewVReg2)
|
||||
.addReg(NewVReg1, RegState::Kill)
|
||||
.addImm(0x01)));
|
||||
unsigned NewVReg3 = MRI->createVirtualRegister(TRC);
|
||||
BuildMI(*MBB, MI, dl, TII->get(ARM::tPICADD), NewVReg3)
|
||||
.addReg(NewVReg2, RegState::Kill)
|
||||
.addImm(PCLabelId);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::t2STRi12))
|
||||
.addReg(NewVReg3, RegState::Kill)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(36) // &jbuf[1] :: pc
|
||||
.addMemOperand(FIMMO));
|
||||
} else if (isThumb) {
|
||||
// Incoming value: jbuf
|
||||
// ldr.n r1, LCPI1_4
|
||||
// add r1, pc
|
||||
// mov r2, #1
|
||||
// orrs r1, r2
|
||||
// add r2, $jbuf, #+4 ; &jbuf[1]
|
||||
// str r1, [r2]
|
||||
unsigned NewVReg1 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tLDRpci), NewVReg1)
|
||||
.addConstantPoolIndex(CPI)
|
||||
.addMemOperand(CPMMO));
|
||||
unsigned NewVReg2 = MRI->createVirtualRegister(TRC);
|
||||
BuildMI(*MBB, MI, dl, TII->get(ARM::tPICADD), NewVReg2)
|
||||
.addReg(NewVReg1, RegState::Kill)
|
||||
.addImm(PCLabelId);
|
||||
// Set the low bit because of thumb mode.
|
||||
unsigned NewVReg3 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tMOVi8), NewVReg3)
|
||||
.addReg(ARM::CPSR, RegState::Define)
|
||||
.addImm(1));
|
||||
unsigned NewVReg4 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tORR), NewVReg4)
|
||||
.addReg(ARM::CPSR, RegState::Define)
|
||||
.addReg(NewVReg2, RegState::Kill)
|
||||
.addReg(NewVReg3, RegState::Kill));
|
||||
unsigned NewVReg5 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tADDrSPi), NewVReg5)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(36)); // &jbuf[1] :: pc
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::tSTRi))
|
||||
.addReg(NewVReg4, RegState::Kill)
|
||||
.addReg(NewVReg5, RegState::Kill)
|
||||
.addImm(0)
|
||||
.addMemOperand(FIMMO));
|
||||
} else {
|
||||
// Incoming value: jbuf
|
||||
// ldr r1, LCPI1_1
|
||||
// add r1, pc, r1
|
||||
// str r1, [$jbuf, #+4] ; &jbuf[1]
|
||||
unsigned NewVReg1 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::LDRi12), NewVReg1)
|
||||
.addConstantPoolIndex(CPI)
|
||||
.addImm(0)
|
||||
.addMemOperand(CPMMO));
|
||||
unsigned NewVReg2 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::PICADD), NewVReg2)
|
||||
.addReg(NewVReg1, RegState::Kill)
|
||||
.addImm(PCLabelId));
|
||||
AddDefaultPred(BuildMI(*MBB, MI, dl, TII->get(ARM::STRi12))
|
||||
.addReg(NewVReg2, RegState::Kill)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(36) // &jbuf[1] :: pc
|
||||
.addMemOperand(FIMMO));
|
||||
}
|
||||
|
||||
FIMMO = MF->getMachineMemOperand(MachinePointerInfo::getFixedStack(FI),
|
||||
MachineMemOperand::MOLoad, 4, 4);
|
||||
MachineMemOperand::MOLoad, 4, 4);
|
||||
|
||||
unsigned NewVReg1 = MRI->createVirtualRegister(TRC);
|
||||
AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::t2LDRi12), NewVReg1)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(4)
|
||||
.addMemOperand(FIMMO));
|
||||
.addMemOperand(FIMMOLd));
|
||||
AddDefaultPred(BuildMI(DispatchBB, dl, TII->get(ARM::t2CMPri))
|
||||
.addReg(NewVReg1)
|
||||
.addImm(LPadList.size()));
|
||||
|
@ -512,6 +512,10 @@ namespace llvm {
|
||||
bool signExtend,
|
||||
ARMCC::CondCodes Cond) const;
|
||||
|
||||
void SetupEntryBlockForSjLj(MachineInstr *MI,
|
||||
MachineBasicBlock *MBB,
|
||||
MachineBasicBlock *DispatchBB, int FI) const;
|
||||
|
||||
MachineBasicBlock *EmitSjLjDispatchBlock(MachineInstr *MI,
|
||||
MachineBasicBlock *MBB) const;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user