aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/Mips/MipsMachineFunction.h
diff options
context:
space:
mode:
authorVasileios Kalintiris <Vasileios.Kalintiris@imgtec.com>2015-10-26 12:38:43 +0000
committerVasileios Kalintiris <Vasileios.Kalintiris@imgtec.com>2015-10-26 12:38:43 +0000
commit43dff0c03324bd8aa2dfa93062db8597ea43f07b (patch)
tree5bdc1797d1b48276b6fd8a4278e35f5904fd7423 /llvm/lib/Target/Mips/MipsMachineFunction.h
parent684af8156c3612964abcdfa41003b3aece1cffeb (diff)
downloadllvm-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.h16
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;