Support .debug_frame

This commit is contained in:
shylie 2026-03-31 13:37:16 -04:00
parent b62191afce
commit 5aceff62cb
7 changed files with 137 additions and 108 deletions

View File

@ -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;
}

View File

@ -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());
}

View File

@ -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);

View File

@ -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;
};

View File

@ -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;
}

View File

@ -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)>;

View File

@ -4,4 +4,6 @@ using namespace llvm;
FootMCAsmInfoELF::FootMCAsmInfoELF() : MCAsmInfoELF() {
SupportsDebugInformation = true;
DwarfUsesRelocationsAcrossSections = true;
UsesCFIWithoutEH = true;
}