mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Add support for C++ exception handling.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132131 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
32bfb2c513
commit
cf0cd8005c
@ -55,6 +55,20 @@ bool Inserter::runOnMachineFunction(MachineFunction &F) {
|
|||||||
MachineBasicBlock& MBB = *MFI;
|
MachineBasicBlock& MBB = *MFI;
|
||||||
MachineBasicBlock::iterator I = MFI->begin();
|
MachineBasicBlock::iterator I = MFI->begin();
|
||||||
|
|
||||||
|
// If MBB is a landing pad, insert instruction that restores $gp after
|
||||||
|
// EH_LABEL.
|
||||||
|
if (MBB.isLandingPad()) {
|
||||||
|
// Find EH_LABEL first.
|
||||||
|
for (; I->getOpcode() != TargetOpcode::EH_LABEL; ++I) ;
|
||||||
|
|
||||||
|
// Insert lw.
|
||||||
|
++I;
|
||||||
|
DebugLoc dl = I != MBB.end() ? I->getDebugLoc() : DebugLoc();
|
||||||
|
BuildMI(MBB, I, dl, TII->get(Mips::LW), Mips::GP).addImm(0)
|
||||||
|
.addFrameIndex(FI);
|
||||||
|
Changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
while (I != MFI->end()) {
|
while (I != MFI->end()) {
|
||||||
if (I->getOpcode() != Mips::JALR) {
|
if (I->getOpcode() != Mips::JALR) {
|
||||||
++I;
|
++I;
|
||||||
|
@ -182,8 +182,6 @@ void MipsFrameLowering::emitPrologue(MachineFunction &MF) const {
|
|||||||
if (ATUsed)
|
if (ATUsed)
|
||||||
BuildMI(MBB, MBBI, dl, TII.get(Mips::ATMACRO));
|
BuildMI(MBB, MBBI, dl, TII.get(Mips::ATMACRO));
|
||||||
|
|
||||||
// if framepointer enabled, set it to point to the stack pointer.
|
|
||||||
if (hasFP(MF)) {
|
|
||||||
// Find the instruction past the last instruction that saves a callee-saved
|
// Find the instruction past the last instruction that saves a callee-saved
|
||||||
// register to the stack.
|
// register to the stack.
|
||||||
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
|
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
|
||||||
@ -191,15 +189,42 @@ void MipsFrameLowering::emitPrologue(MachineFunction &MF) const {
|
|||||||
for (unsigned i = 0; i < CSI.size(); ++i)
|
for (unsigned i = 0; i < CSI.size(); ++i)
|
||||||
++MBBI;
|
++MBBI;
|
||||||
|
|
||||||
|
// if framepointer enabled, set it to point to the stack pointer.
|
||||||
|
if (hasFP(MF))
|
||||||
// Insert instruction "move $fp, $sp" at this location.
|
// Insert instruction "move $fp, $sp" at this location.
|
||||||
BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDu), Mips::FP)
|
BuildMI(MBB, MBBI, dl, TII.get(Mips::ADDu), Mips::FP)
|
||||||
.addReg(Mips::SP).addReg(Mips::ZERO);
|
.addReg(Mips::SP).addReg(Mips::ZERO);
|
||||||
}
|
|
||||||
|
|
||||||
// Restore GP from the saved stack location
|
// Restore GP from the saved stack location
|
||||||
if (MipsFI->needGPSaveRestore())
|
if (MipsFI->needGPSaveRestore())
|
||||||
BuildMI(MBB, MBBI, dl, TII.get(Mips::CPRESTORE))
|
BuildMI(MBB, MBBI, dl, TII.get(Mips::CPRESTORE))
|
||||||
.addImm(MFI->getObjectOffset(MipsFI->getGPFI()));
|
.addImm(MFI->getObjectOffset(MipsFI->getGPFI()));
|
||||||
|
|
||||||
|
// EH Frame infomation.
|
||||||
|
MachineModuleInfo &MMI = MF.getMMI();
|
||||||
|
std::vector<MachineMove> &Moves = MMI.getFrameMoves();
|
||||||
|
MCSymbol *FrameLabel = MMI.getContext().CreateTempSymbol();
|
||||||
|
BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)).addSym(FrameLabel);
|
||||||
|
|
||||||
|
if (hasFP(MF)) {
|
||||||
|
MachineLocation SPDst(Mips::FP);
|
||||||
|
MachineLocation SPSrc(Mips::SP);
|
||||||
|
Moves.push_back(MachineMove(FrameLabel, SPDst, SPSrc));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StackSize) {
|
||||||
|
MachineLocation SPDst(MachineLocation::VirtualFP);
|
||||||
|
MachineLocation SPSrc(MachineLocation::VirtualFP, -StackSize);
|
||||||
|
Moves.push_back(MachineMove(FrameLabel, SPDst, SPSrc));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
|
||||||
|
E = CSI.end(); I != E; ++I) {
|
||||||
|
int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
|
||||||
|
MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
|
||||||
|
MachineLocation CSSrc(I->getReg());
|
||||||
|
Moves.push_back(MachineMove(FrameLabel, CSDst, CSSrc));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MipsFrameLowering::emitEpilogue(MachineFunction &MF,
|
void MipsFrameLowering::emitEpilogue(MachineFunction &MF,
|
||||||
@ -243,6 +268,13 @@ void MipsFrameLowering::emitEpilogue(MachineFunction &MF,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MipsFrameLowering::getInitialFrameState(std::vector<MachineMove> &Moves) const {
|
||||||
|
MachineLocation Dst(MachineLocation::VirtualFP);
|
||||||
|
MachineLocation Src(Mips::SP, 0);
|
||||||
|
Moves.push_back(MachineMove(0, Dst, Src));
|
||||||
|
}
|
||||||
|
|
||||||
void MipsFrameLowering::
|
void MipsFrameLowering::
|
||||||
processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||||
RegScavenger *RS) const {
|
RegScavenger *RS) const {
|
||||||
|
@ -39,6 +39,8 @@ public:
|
|||||||
|
|
||||||
bool hasFP(const MachineFunction &MF) const;
|
bool hasFP(const MachineFunction &MF) const;
|
||||||
|
|
||||||
|
void getInitialFrameState(std::vector<MachineMove> &Moves) const;
|
||||||
|
|
||||||
void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||||
RegScavenger *RS) const;
|
RegScavenger *RS) const;
|
||||||
};
|
};
|
||||||
|
@ -141,7 +141,8 @@ MipsTargetLowering(MipsTargetMachine &TM)
|
|||||||
setOperationAction(ISD::FLOG10, MVT::f32, Expand);
|
setOperationAction(ISD::FLOG10, MVT::f32, Expand);
|
||||||
setOperationAction(ISD::FEXP, MVT::f32, Expand);
|
setOperationAction(ISD::FEXP, MVT::f32, Expand);
|
||||||
|
|
||||||
setOperationAction(ISD::EH_LABEL, MVT::Other, Expand);
|
setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
|
||||||
|
setOperationAction(ISD::EHSELECTION, MVT::i32, Expand);
|
||||||
|
|
||||||
setOperationAction(ISD::VAARG, MVT::Other, Expand);
|
setOperationAction(ISD::VAARG, MVT::Other, Expand);
|
||||||
setOperationAction(ISD::VACOPY, MVT::Other, Expand);
|
setOperationAction(ISD::VACOPY, MVT::Other, Expand);
|
||||||
@ -176,6 +177,9 @@ MipsTargetLowering(MipsTargetMachine &TM)
|
|||||||
|
|
||||||
setStackPointerRegisterToSaveRestore(Mips::SP);
|
setStackPointerRegisterToSaveRestore(Mips::SP);
|
||||||
computeRegisterProperties();
|
computeRegisterProperties();
|
||||||
|
|
||||||
|
setExceptionPointerRegister(Mips::A0);
|
||||||
|
setExceptionSelectorRegister(Mips::A1);
|
||||||
}
|
}
|
||||||
|
|
||||||
MVT::SimpleValueType MipsTargetLowering::getSetCCResultType(EVT VT) const {
|
MVT::SimpleValueType MipsTargetLowering::getSetCCResultType(EVT VT) const {
|
||||||
|
@ -17,11 +17,15 @@ using namespace llvm;
|
|||||||
MipsMCAsmInfo::MipsMCAsmInfo(const Target &T, StringRef TT) {
|
MipsMCAsmInfo::MipsMCAsmInfo(const Target &T, StringRef TT) {
|
||||||
AlignmentIsInBytes = false;
|
AlignmentIsInBytes = false;
|
||||||
Data16bitsDirective = "\t.half\t";
|
Data16bitsDirective = "\t.half\t";
|
||||||
Data32bitsDirective = "\t.word\t";
|
Data32bitsDirective = "\t.4byte\t";
|
||||||
Data64bitsDirective = 0;
|
Data64bitsDirective = 0;
|
||||||
PrivateGlobalPrefix = "$";
|
PrivateGlobalPrefix = "$";
|
||||||
CommentString = "#";
|
CommentString = "#";
|
||||||
ZeroDirective = "\t.space\t";
|
ZeroDirective = "\t.space\t";
|
||||||
GPRel32Directive = "\t.gpword\t";
|
GPRel32Directive = "\t.gpword\t";
|
||||||
WeakRefDirective = "\t.weak\t";
|
WeakRefDirective = "\t.weak\t";
|
||||||
|
|
||||||
|
SupportsDebugInformation = true;
|
||||||
|
ExceptionsType = ExceptionHandling::DwarfCFI;
|
||||||
|
HasLEB128 = true;
|
||||||
}
|
}
|
||||||
|
@ -283,8 +283,7 @@ getEHHandlerRegister() const {
|
|||||||
|
|
||||||
int MipsRegisterInfo::
|
int MipsRegisterInfo::
|
||||||
getDwarfRegNum(unsigned RegNum, bool isEH) const {
|
getDwarfRegNum(unsigned RegNum, bool isEH) const {
|
||||||
llvm_unreachable("What is the dwarf register number");
|
return MipsGenRegisterInfo::getDwarfRegNumFull(RegNum, 0);
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "MipsGenRegisterInfo.inc"
|
#include "MipsGenRegisterInfo.inc"
|
||||||
|
@ -8,14 +8,14 @@ entry:
|
|||||||
ret i8* %x
|
ret i8* %x
|
||||||
}
|
}
|
||||||
|
|
||||||
; CHECK-PIC: lw $[[R0:[0-9]+]], %got($tmp1)($gp)
|
; CHECK-PIC: lw $[[R0:[0-9]+]], %got($tmp[[T0:[0-9]+]])($gp)
|
||||||
; CHECK-PIC: addiu ${{[0-9]+}}, $[[R0]], %lo($tmp1)
|
; CHECK-PIC: addiu ${{[0-9]+}}, $[[R0]], %lo($tmp[[T0]])
|
||||||
; CHECK-PIC: lw $[[R1:[0-9]+]], %got($tmp2)($gp)
|
; CHECK-PIC: lw $[[R1:[0-9]+]], %got($tmp[[T1:[0-9]+]])($gp)
|
||||||
; CHECK-PIC: addiu ${{[0-9]+}}, $[[R1]], %lo($tmp2)
|
; CHECK-PIC: addiu ${{[0-9]+}}, $[[R1]], %lo($tmp[[T1]])
|
||||||
; CHECK-STATIC: lui $[[R2:[0-9]+]], %hi($tmp1)
|
; CHECK-STATIC: lui $[[R2:[0-9]+]], %hi($tmp[[T0:[0-9]+]])
|
||||||
; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R2]], %lo($tmp1)
|
; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R2]], %lo($tmp[[T0]])
|
||||||
; CHECK-STATIC: lui $[[R3:[0-9]+]], %hi($tmp2)
|
; CHECK-STATIC: lui $[[R3:[0-9]+]], %hi($tmp[[T1:[0-9]+]])
|
||||||
; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R3]], %lo($tmp2)
|
; CHECK-STATIC: addiu ${{[0-9]+}}, $[[R3]], %lo($tmp[[T1]])
|
||||||
define void @f() nounwind {
|
define void @f() nounwind {
|
||||||
entry:
|
entry:
|
||||||
%call = tail call i8* @dummy(i8* blockaddress(@f, %baz))
|
%call = tail call i8* @dummy(i8* blockaddress(@f, %baz))
|
||||||
|
Loading…
Reference in New Issue
Block a user