Support .debug_frame
This commit is contained in:
parent
b62191afce
commit
5aceff62cb
@ -294,8 +294,8 @@ private:
|
||||
protected:
|
||||
ELFFile<ELFT> EF;
|
||||
|
||||
const Elf_Shdr *DotDynSymSec = nullptr; // Dynamic symbol table section.
|
||||
const Elf_Shdr *DotSymtabSec = nullptr; // Symbol table section.
|
||||
const Elf_Shdr *DotDynSymSec = nullptr; // Dynamic symbol table section.
|
||||
const Elf_Shdr *DotSymtabSec = nullptr; // Symbol table section.
|
||||
const Elf_Shdr *DotSymtabShndxSec = nullptr; // SHT_SYMTAB_SHNDX section.
|
||||
|
||||
// Hold CREL relocations for SectionRef::relocations().
|
||||
@ -677,8 +677,7 @@ uint32_t ELFObjectFile<ELFT>::getSymbolAlignment(DataRefImpl Symb) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
uint16_t ELFObjectFile<ELFT>::getEMachine() const {
|
||||
template <class ELFT> uint16_t ELFObjectFile<ELFT>::getEMachine() const {
|
||||
return EF.getHeader().e_machine;
|
||||
}
|
||||
|
||||
@ -1278,13 +1277,11 @@ section_iterator ELFObjectFile<ELFT>::section_end() const {
|
||||
return section_iterator(SectionRef(toDRI((*SectionsOrErr).end()), this));
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
uint8_t ELFObjectFile<ELFT>::getBytesInAddress() const {
|
||||
template <class ELFT> uint8_t ELFObjectFile<ELFT>::getBytesInAddress() const {
|
||||
return ELFT::Is64Bits ? 8 : 4;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
|
||||
template <class ELFT> StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
|
||||
constexpr bool IsLittleEndian = ELFT::Endianness == llvm::endianness::little;
|
||||
switch (EF.getHeader().e_ident[ELF::EI_CLASS]) {
|
||||
case ELF::ELFCLASS32:
|
||||
@ -1324,6 +1321,8 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
|
||||
return "elf32-loongarch";
|
||||
case ELF::EM_XTENSA:
|
||||
return "elf32-xtensa";
|
||||
case ELF::EM_FOOT:
|
||||
return "elf32-foot";
|
||||
default:
|
||||
return "elf32-unknown";
|
||||
}
|
||||
@ -1457,6 +1456,9 @@ template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const {
|
||||
case ELF::EM_XTENSA:
|
||||
return Triple::xtensa;
|
||||
|
||||
case ELF::EM_FOOT:
|
||||
return Triple::foot;
|
||||
|
||||
default:
|
||||
return Triple::UnknownArch;
|
||||
}
|
||||
|
||||
@ -26,6 +26,7 @@ public:
|
||||
bool lowerOperand(const MachineOperand &MO, MCOperand &MCO);
|
||||
|
||||
void emitInstruction(const MachineInstr *MI) override;
|
||||
void emitFunctionBodyStart() override;
|
||||
|
||||
StringRef getPassName() const override { return "FootAsmPrinter"; }
|
||||
};
|
||||
@ -127,6 +128,12 @@ void FootAsmPrinter::emitInstruction(const MachineInstr *MI) {
|
||||
EmitToStreamer(*OutStreamer, TmpInst);
|
||||
}
|
||||
|
||||
void FootAsmPrinter::emitFunctionBodyStart() {
|
||||
for (const auto &CFI : MF->getFrameInstructions()) {
|
||||
emitCFIInstruction(CFI);
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeFootAsmPrinter() {
|
||||
RegisterAsmPrinter<FootAsmPrinter> Tmp(getTheFootTarget());
|
||||
}
|
||||
|
||||
@ -6,11 +6,12 @@
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/TargetInstrInfo.h"
|
||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||
#include "llvm/MC/MCDwarf.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
bool FootFrameLowering::hasFPImpl(const MachineFunction& MF) const {
|
||||
return false;
|
||||
bool FootFrameLowering::hasFPImpl(const MachineFunction &MF) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
void FootFrameLowering::emitPrologue(MachineFunction &MF,
|
||||
@ -20,27 +21,41 @@ void FootFrameLowering::emitPrologue(MachineFunction &MF,
|
||||
|
||||
int FI = MF.getInfo<FootMachineFunctionInfo>()->getReturnAddressFrameIndex();
|
||||
|
||||
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfaRegister(
|
||||
nullptr, MF.getRegInfo().getTargetRegisterInfo()->getDwarfRegNum(
|
||||
Foot::RSP, true)));
|
||||
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(TargetOpcode::CFI_INSTRUCTION))
|
||||
.addCFIIndex(CFIIndex);
|
||||
|
||||
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::BWOR_I_D_M_A))
|
||||
.addFrameIndex(FI)
|
||||
.addReg(Foot::RRA)
|
||||
.addImm(0);
|
||||
.addFrameIndex(FI)
|
||||
.addReg(Foot::RRA)
|
||||
.addImm(0);
|
||||
|
||||
unsigned NumBytes = MFI.getStackSize();
|
||||
|
||||
if (NumBytes > 0) {
|
||||
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
|
||||
|
||||
if (NumBytes < (1 << 5)) {
|
||||
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::SUBT_D_D_M_A), Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addImm(NumBytes);
|
||||
}
|
||||
else {
|
||||
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::SUBT_D_D_D_A), Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addReg(Foot::R27);
|
||||
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::SUBT_D_D_M_A),
|
||||
Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addImm(NumBytes);
|
||||
} else {
|
||||
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::SUBT_D_D_D_A),
|
||||
Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addReg(Foot::R27);
|
||||
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::CNST_D_A), Foot::R27)
|
||||
.addImm(NumBytes);
|
||||
.addImm(NumBytes);
|
||||
}
|
||||
|
||||
unsigned int CFIOffsetIndex = MF.addFrameInst(
|
||||
MCCFIInstruction::createAdjustCfaOffset(nullptr, NumBytes));
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(),
|
||||
TII->get(TargetOpcode::CFI_INSTRUCTION))
|
||||
.addCFIIndex(CFIOffsetIndex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -52,37 +67,48 @@ void FootFrameLowering::emitEpilogue(MachineFunction &MF,
|
||||
unsigned NumBytes = MFI.getStackSize();
|
||||
|
||||
int FI = MF.getInfo<FootMachineFunctionInfo>()->getReturnAddressFrameIndex();
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::BWOR_D_I_M_A))
|
||||
.addReg(Foot::RRA)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(0);
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(),
|
||||
TII->get(Foot::BWOR_D_I_M_A))
|
||||
.addReg(Foot::RRA)
|
||||
.addFrameIndex(FI)
|
||||
.addImm(0);
|
||||
|
||||
if (NumBytes > 0) {
|
||||
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
|
||||
if (NumBytes < (1 << 5)) {
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::ADDI_D_D_M_A), Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addImm(NumBytes);
|
||||
}
|
||||
else {
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::ADDI_D_D_D_A), Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addReg(Foot::R27);
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::CNST_D_A), Foot::R27)
|
||||
.addImm(NumBytes);
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(),
|
||||
TII->get(Foot::ADDI_D_D_M_A), Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addImm(NumBytes);
|
||||
} else {
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(),
|
||||
TII->get(Foot::ADDI_D_D_D_A), Foot::RSP)
|
||||
.addReg(Foot::RSP)
|
||||
.addReg(Foot::R27);
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(),
|
||||
TII->get(Foot::CNST_D_A), Foot::R27)
|
||||
.addImm(NumBytes);
|
||||
}
|
||||
|
||||
unsigned int CFIIndex =
|
||||
MF.addFrameInst(MCCFIInstruction::createAdjustCfaOffset(nullptr, 0));
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(),
|
||||
TII->get(TargetOpcode::CFI_INSTRUCTION))
|
||||
.addCFIIndex(CFIIndex);
|
||||
}
|
||||
|
||||
const auto& I = MBB.getFirstTerminator();
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), I->getDebugLoc(), TII->get(Foot::COPY_D_D_A))
|
||||
.addReg(Foot::RPC)
|
||||
.addReg(Foot::RRA);
|
||||
const auto &I = MBB.getFirstTerminator();
|
||||
BuildMI(MBB, MBB.getFirstTerminator(), I->getDebugLoc(),
|
||||
TII->get(Foot::COPY_D_D_A))
|
||||
.addReg(Foot::RPC)
|
||||
.addReg(Foot::RRA);
|
||||
|
||||
MBB.erase(I);
|
||||
}
|
||||
|
||||
MachineBasicBlock::iterator FootFrameLowering::eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI) const {
|
||||
MachineBasicBlock::iterator FootFrameLowering::eliminateCallFramePseudoInstr(
|
||||
MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI) const {
|
||||
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
|
||||
unsigned Opc = MI->getOpcode();
|
||||
|
||||
@ -100,26 +126,13 @@ MachineBasicBlock::iterator FootFrameLowering::eliminateCallFramePseudoInstr(Mac
|
||||
return MBB.erase(MI);
|
||||
}
|
||||
|
||||
StackOffset FootFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FrameIndex,
|
||||
Register &FrameReg) const {
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
|
||||
int Offset = MFI.getObjectSize(FrameIndex) + getOffsetOfLocalArea() +
|
||||
MFI.getStackSize();
|
||||
|
||||
if (hasFP(MF)) {
|
||||
llvm_unreachable("foot has no frame pointer");
|
||||
}
|
||||
|
||||
FrameReg = Foot::RSP;
|
||||
|
||||
return StackOffset::getFixed(Offset);
|
||||
}
|
||||
|
||||
void FootFrameLowering::determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
|
||||
void FootFrameLowering::determineCalleeSaves(MachineFunction &MF,
|
||||
BitVector &SavedRegs,
|
||||
RegScavenger *RS) const {
|
||||
TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS);
|
||||
|
||||
SavedRegs.set(Foot::RSP);
|
||||
|
||||
MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
|
||||
int RetAddrFI = MFI.CreateStackObject(4, Align(4), false);
|
||||
|
||||
@ -9,22 +9,19 @@ class FootSubtarget;
|
||||
|
||||
class FootFrameLowering : public TargetFrameLowering {
|
||||
protected:
|
||||
bool hasFPImpl(const MachineFunction &MF) const override;
|
||||
bool hasFPImpl(const MachineFunction &MF) const override;
|
||||
|
||||
public:
|
||||
FootFrameLowering(const FootSubtarget &Sti)
|
||||
: TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align(8), 0) {}
|
||||
FootFrameLowering(const FootSubtarget &Sti)
|
||||
: TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align(8), 0) {}
|
||||
|
||||
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
|
||||
void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
|
||||
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
|
||||
|
||||
MachineBasicBlock::iterator
|
||||
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI) const override;
|
||||
|
||||
StackOffset getFrameIndexReference(const MachineFunction &MF, int FrameIndex,
|
||||
Register &FrameReg) const override;
|
||||
|
||||
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
|
||||
RegScavenger *RS) const override;
|
||||
};
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#include "FootFrameLowering.h"
|
||||
#include "FootRegisterInfo.h"
|
||||
#include "FootFrameLowering.h"
|
||||
|
||||
#include "MCTargetDesc/FootMCTargetDesc.h"
|
||||
|
||||
@ -16,18 +16,26 @@ using namespace llvm;
|
||||
|
||||
FootRegisterInfo::FootRegisterInfo() : FootGenRegisterInfo(Foot::RRA) {}
|
||||
|
||||
const MCPhysReg *FootRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
const MCPhysReg *
|
||||
FootRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
return CSR_Foot_Common_SaveList;
|
||||
}
|
||||
|
||||
const uint32_t *FootRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
|
||||
CallingConv::ID CC) const {
|
||||
const uint32_t *
|
||||
FootRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
|
||||
CallingConv::ID CC) const {
|
||||
return CSR_Foot_Common_RegMask;
|
||||
}
|
||||
|
||||
BitVector FootRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
BitVector Reserved{ getNumRegs() };
|
||||
return Reserved;
|
||||
BitVector Reserved;
|
||||
Reserved.set(Foot::R26);
|
||||
Reserved.set(Foot::R27);
|
||||
Reserved.set(Foot::RSP);
|
||||
Reserved.set(Foot::RRA);
|
||||
Reserved.set(Foot::RLC);
|
||||
Reserved.set(Foot::RPC);
|
||||
return Reserved;
|
||||
}
|
||||
|
||||
bool FootRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
@ -52,14 +60,14 @@ bool FootRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
|
||||
}
|
||||
|
||||
BuildMI(MBB, MI, DebugLoc(), TII.get(Foot::ADDI_D_D_M_A), DestReg)
|
||||
.addReg(Foot::RSP)
|
||||
.addImm(Offset);
|
||||
.addReg(Foot::RSP)
|
||||
.addImm(Offset);
|
||||
|
||||
FIOp.ChangeToRegister(DestReg, false);
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
Register FootRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
|
||||
return Register();
|
||||
return Foot::RSP;
|
||||
}
|
||||
|
||||
@ -8,37 +8,37 @@ class FootRegister<bits<16> enc, string name>
|
||||
}
|
||||
|
||||
def R0 : FootRegister<0, "r0">, DwarfRegNum<[0, 0, 0]>;
|
||||
def R1 : FootRegister<1, "r1">, DwarfRegNum<[0, 0, 1]>;
|
||||
def R2 : FootRegister<2, "r2">, DwarfRegNum<[0, 0, 2]>;
|
||||
def R3 : FootRegister<3, "r3">, DwarfRegNum<[0, 0, 3]>;
|
||||
def R4 : FootRegister<4, "r4">, DwarfRegNum<[0, 0, 4]>;
|
||||
def R5 : FootRegister<5, "r5">, DwarfRegNum<[0, 0, 5]>;
|
||||
def R6 : FootRegister<6, "r6">, DwarfRegNum<[0, 0, 6]>;
|
||||
def R7 : FootRegister<7, "r7">, DwarfRegNum<[0, 0, 7]>;
|
||||
def R8 : FootRegister<8, "r8">, DwarfRegNum<[0, 0, 8]>;
|
||||
def R9 : FootRegister<9, "r9">, DwarfRegNum<[0, 0, 9]>;
|
||||
def R10 : FootRegister<10, "r10">, DwarfRegNum<[0, 0, 10]>;
|
||||
def R11 : FootRegister<11, "r11">, DwarfRegNum<[0, 0, 11]>;
|
||||
def R12 : FootRegister<12, "r12">, DwarfRegNum<[0, 0, 12]>;
|
||||
def R13 : FootRegister<13, "r13">, DwarfRegNum<[0, 0, 13]>;
|
||||
def R14 : FootRegister<14, "r14">, DwarfRegNum<[0, 0, 14]>;
|
||||
def R15 : FootRegister<15, "r15">, DwarfRegNum<[0, 0, 15]>;
|
||||
def R16 : FootRegister<16, "r16">, DwarfRegNum<[0, 0, 16]>;
|
||||
def R17 : FootRegister<17, "r17">, DwarfRegNum<[0, 0, 17]>;
|
||||
def R18 : FootRegister<18, "r18">, DwarfRegNum<[0, 0, 18]>;
|
||||
def R19 : FootRegister<19, "r19">, DwarfRegNum<[0, 0, 19]>;
|
||||
def R20 : FootRegister<20, "r20">, DwarfRegNum<[0, 0, 20]>;
|
||||
def R21 : FootRegister<21, "r21">, DwarfRegNum<[0, 0, 21]>;
|
||||
def R22 : FootRegister<22, "r22">, DwarfRegNum<[0, 0, 22]>;
|
||||
def R23 : FootRegister<23, "r23">, DwarfRegNum<[0, 0, 23]>;
|
||||
def R24 : FootRegister<24, "r24">, DwarfRegNum<[0, 0, 24]>;
|
||||
def R25 : FootRegister<25, "r25">, DwarfRegNum<[0, 0, 25]>;
|
||||
def R26 : FootRegister<26, "r26">, DwarfRegNum<[0, 0, 26]>; /* used by compiler */
|
||||
def R27 : FootRegister<27, "r27">, DwarfRegNum<[0, 0, 27]>; /* used by compiler */
|
||||
def RSP : FootRegister<28, "rsp">, DwarfRegNum<[0, 0, 28]>; /* stack pointer */
|
||||
def RRA : FootRegister<29, "rra">, DwarfRegNum<[0, 0, 29]>; /* return address */
|
||||
def RLC : FootRegister<30, "rlc">, DwarfRegNum<[0, 0, 30]>; /* loop counter */
|
||||
def RPC : FootRegister<31, "rpc">, DwarfRegNum<[0, 0, 31]>; /* program counter */
|
||||
def R1 : FootRegister<1, "r1">, DwarfRegNum<[1, 1, 1]>;
|
||||
def R2 : FootRegister<2, "r2">, DwarfRegNum<[2, 2, 2]>;
|
||||
def R3 : FootRegister<3, "r3">, DwarfRegNum<[3, 3, 3]>;
|
||||
def R4 : FootRegister<4, "r4">, DwarfRegNum<[4, 4, 4]>;
|
||||
def R5 : FootRegister<5, "r5">, DwarfRegNum<[5, 5, 5]>;
|
||||
def R6 : FootRegister<6, "r6">, DwarfRegNum<[6, 6, 6]>;
|
||||
def R7 : FootRegister<7, "r7">, DwarfRegNum<[7, 7, 7]>;
|
||||
def R8 : FootRegister<8, "r8">, DwarfRegNum<[8, 8, 8]>;
|
||||
def R9 : FootRegister<9, "r9">, DwarfRegNum<[9, 9, 9]>;
|
||||
def R10 : FootRegister<10, "r10">, DwarfRegNum<[10, 10, 10]>;
|
||||
def R11 : FootRegister<11, "r11">, DwarfRegNum<[11, 11, 11]>;
|
||||
def R12 : FootRegister<12, "r12">, DwarfRegNum<[12, 12, 12]>;
|
||||
def R13 : FootRegister<13, "r13">, DwarfRegNum<[13, 13, 13]>;
|
||||
def R14 : FootRegister<14, "r14">, DwarfRegNum<[14, 14, 14]>;
|
||||
def R15 : FootRegister<15, "r15">, DwarfRegNum<[15, 15, 15]>;
|
||||
def R16 : FootRegister<16, "r16">, DwarfRegNum<[16, 16, 16]>;
|
||||
def R17 : FootRegister<17, "r17">, DwarfRegNum<[17, 17, 17]>;
|
||||
def R18 : FootRegister<18, "r18">, DwarfRegNum<[18, 18, 18]>;
|
||||
def R19 : FootRegister<19, "r19">, DwarfRegNum<[19, 19, 19]>;
|
||||
def R20 : FootRegister<20, "r20">, DwarfRegNum<[20, 20, 20]>;
|
||||
def R21 : FootRegister<21, "r21">, DwarfRegNum<[21, 21, 21]>;
|
||||
def R22 : FootRegister<22, "r22">, DwarfRegNum<[22, 22, 22]>;
|
||||
def R23 : FootRegister<23, "r23">, DwarfRegNum<[23, 23, 23]>;
|
||||
def R24 : FootRegister<24, "r24">, DwarfRegNum<[24, 24, 24]>;
|
||||
def R25 : FootRegister<25, "r25">, DwarfRegNum<[25, 25, 25]>;
|
||||
def R26 : FootRegister<26, "r26">, DwarfRegNum<[26, 26, 26]>; /* used by compiler */
|
||||
def R27 : FootRegister<27, "r27">, DwarfRegNum<[27, 27, 27]>; /* used by compiler */
|
||||
def RSP : FootRegister<28, "rsp">, DwarfRegNum<[28, 28, 28]>; /* stack pointer */
|
||||
def RRA : FootRegister<29, "rra">, DwarfRegNum<[29, 29, 29]>; /* return address */
|
||||
def RLC : FootRegister<30, "rlc">, DwarfRegNum<[30, 30, 30]>; /* loop counter */
|
||||
def RPC : FootRegister<31, "rpc">, DwarfRegNum<[31, 31, 31]>; /* program counter */
|
||||
|
||||
def GP32 : RegisterClass<"Foot", [i32], 32, (sequence "R%u", 0, 27)>;
|
||||
def PC32 : RegisterClass<"Foot", [i32], 32, (add RPC)>;
|
||||
|
||||
@ -4,4 +4,6 @@ using namespace llvm;
|
||||
|
||||
FootMCAsmInfoELF::FootMCAsmInfoELF() : MCAsmInfoELF() {
|
||||
SupportsDebugInformation = true;
|
||||
DwarfUsesRelocationsAcrossSections = true;
|
||||
UsesCFIWithoutEH = true;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user