diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index ced1afdd4cc6..15da7dfcbdf2 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -294,8 +294,8 @@ private: protected: ELFFile 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::getSymbolAlignment(DataRefImpl Symb) const { return 0; } -template -uint16_t ELFObjectFile::getEMachine() const { +template uint16_t ELFObjectFile::getEMachine() const { return EF.getHeader().e_machine; } @@ -1278,13 +1277,11 @@ section_iterator ELFObjectFile::section_end() const { return section_iterator(SectionRef(toDRI((*SectionsOrErr).end()), this)); } -template -uint8_t ELFObjectFile::getBytesInAddress() const { +template uint8_t ELFObjectFile::getBytesInAddress() const { return ELFT::Is64Bits ? 8 : 4; } -template -StringRef ELFObjectFile::getFileFormatName() const { +template StringRef ELFObjectFile::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::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 Triple::ArchType ELFObjectFile::getArch() const { case ELF::EM_XTENSA: return Triple::xtensa; + case ELF::EM_FOOT: + return Triple::foot; + default: return Triple::UnknownArch; } diff --git a/llvm/lib/Target/Foot/FootAsmPrinter.cpp b/llvm/lib/Target/Foot/FootAsmPrinter.cpp index d15d54640dba..eb63b574db5d 100644 --- a/llvm/lib/Target/Foot/FootAsmPrinter.cpp +++ b/llvm/lib/Target/Foot/FootAsmPrinter.cpp @@ -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 Tmp(getTheFootTarget()); } diff --git a/llvm/lib/Target/Foot/FootFrameLowering.cpp b/llvm/lib/Target/Foot/FootFrameLowering.cpp index 6afd31f8d4de..2fe1dc811895 100644 --- a/llvm/lib/Target/Foot/FootFrameLowering.cpp +++ b/llvm/lib/Target/Foot/FootFrameLowering.cpp @@ -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()->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()->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); diff --git a/llvm/lib/Target/Foot/FootFrameLowering.h b/llvm/lib/Target/Foot/FootFrameLowering.h index 3f8bfc1ead90..03338c2bef09 100644 --- a/llvm/lib/Target/Foot/FootFrameLowering.h +++ b/llvm/lib/Target/Foot/FootFrameLowering.h @@ -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; }; diff --git a/llvm/lib/Target/Foot/FootRegisterInfo.cpp b/llvm/lib/Target/Foot/FootRegisterInfo.cpp index 3d0bb49d31da..8cfb2974bceb 100644 --- a/llvm/lib/Target/Foot/FootRegisterInfo.cpp +++ b/llvm/lib/Target/Foot/FootRegisterInfo.cpp @@ -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; } diff --git a/llvm/lib/Target/Foot/FootRegisterInfo.td b/llvm/lib/Target/Foot/FootRegisterInfo.td index c1063592b867..a588288e0ff5 100644 --- a/llvm/lib/Target/Foot/FootRegisterInfo.td +++ b/llvm/lib/Target/Foot/FootRegisterInfo.td @@ -8,37 +8,37 @@ class FootRegister 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)>; diff --git a/llvm/lib/Target/Foot/MCTargetDesc/FootAsmInfo.cpp b/llvm/lib/Target/Foot/MCTargetDesc/FootAsmInfo.cpp index b88861fc1bb7..ba2d0035da7a 100644 --- a/llvm/lib/Target/Foot/MCTargetDesc/FootAsmInfo.cpp +++ b/llvm/lib/Target/Foot/MCTargetDesc/FootAsmInfo.cpp @@ -4,4 +4,6 @@ using namespace llvm; FootMCAsmInfoELF::FootMCAsmInfoELF() : MCAsmInfoELF() { SupportsDebugInformation = true; + DwarfUsesRelocationsAcrossSections = true; + UsesCFIWithoutEH = true; }