diff options
author | Vasileios Kalintiris <Vasileios.Kalintiris@imgtec.com> | 2015-10-26 12:38:43 +0000 |
---|---|---|
committer | Vasileios Kalintiris <Vasileios.Kalintiris@imgtec.com> | 2015-10-26 12:38:43 +0000 |
commit | 43dff0c03324bd8aa2dfa93062db8597ea43f07b (patch) | |
tree | 5bdc1797d1b48276b6fd8a4278e35f5904fd7423 /llvm/lib/Target/Mips/MipsMachineFunction.h | |
parent | 684af8156c3612964abcdfa41003b3aece1cffeb (diff) | |
download | llvm-43dff0c03324bd8aa2dfa93062db8597ea43f07b.zip llvm-43dff0c03324bd8aa2dfa93062db8597ea43f07b.tar.gz llvm-43dff0c03324bd8aa2dfa93062db8597ea43f07b.tar.bz2 |
[mips] Interrupt attribute support for mips32r2+.
Summary:
This patch adds support for using the "interrupt" attribute on Mips
for interrupt handling functions. At this time only mips32r2+ with the
o32 ABI with the static relocation model is supported. Unsupported
configurations will be rejected
Patch by Simon Dardis (+ clang-format & some trivial changes to follow the
LLVM coding standards by me).
Reviewers: mpf, dsanders
Subscribers: dsanders, vkalintiris, llvm-commits
Differential Revision: http://reviews.llvm.org/D10768
llvm-svn: 251286
Diffstat (limited to 'llvm/lib/Target/Mips/MipsMachineFunction.h')
-rw-r--r-- | llvm/lib/Target/Mips/MipsMachineFunction.h | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/MipsMachineFunction.h b/llvm/lib/Target/Mips/MipsMachineFunction.h index a1b2e81..a2f6ee03 100644 --- a/llvm/lib/Target/Mips/MipsMachineFunction.h +++ b/llvm/lib/Target/Mips/MipsMachineFunction.h @@ -34,7 +34,7 @@ class MipsFunctionInfo : public MachineFunctionInfo { public: MipsFunctionInfo(MachineFunction &MF) : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0), - VarArgsFrameIndex(0), CallsEhReturn(false), SaveS2(false), + VarArgsFrameIndex(0), CallsEhReturn(false), IsISR(false), SaveS2(false), MoveF64ViaSpillFI(-1) {} ~MipsFunctionInfo(); @@ -70,6 +70,14 @@ public: /// object representing a GOT entry for an external function. MachinePointerInfo callPtrInfo(const char *ES); + // Functions with the "interrupt" attribute require special prologues, + // epilogues and additional spill slots. + bool isISR() const { return IsISR; } + void setISR() { IsISR = true; } + void createISRRegFI(); + int getISRRegFI(unsigned Reg) const { return ISRDataRegFI[Reg]; } + bool isISRRegFI(int FI) const; + /// Create a MachinePointerInfo that has a GlobalValuePseudoSourceValue object /// representing a GOT entry for a global function. MachinePointerInfo callPtrInfo(const GlobalValue *GV); @@ -116,6 +124,12 @@ private: /// Frame objects for spilling eh data registers. int EhDataRegFI[4]; + /// ISR - Whether the function is an Interrupt Service Routine. + bool IsISR; + + /// Frame objects for spilling C0_STATUS, C0_EPC + int ISRDataRegFI[2]; + // saveS2 bool SaveS2; |