diff options
Diffstat (limited to 'llvm/lib/Target/AVR/AVRMachineFunctionInfo.h')
-rw-r--r-- | llvm/lib/Target/AVR/AVRMachineFunctionInfo.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/Target/AVR/AVRMachineFunctionInfo.h b/llvm/lib/Target/AVR/AVRMachineFunctionInfo.h index 5226e30491c35..5432fac122efb 100644 --- a/llvm/lib/Target/AVR/AVRMachineFunctionInfo.h +++ b/llvm/lib/Target/AVR/AVRMachineFunctionInfo.h @@ -31,6 +31,12 @@ class AVRMachineFunctionInfo : public MachineFunctionInfo { /// used inside the function. bool HasStackArgs; + /// Whether or not the function is an interrupt handler. + bool IsInterruptHandler; + + /// Whether or not the function is an non-blocking interrupt handler. + bool IsSignalHandler; + /// Size of the callee-saved register portion of the /// stack frame in bytes. unsigned CalleeSavedFrameSize; @@ -41,11 +47,17 @@ class AVRMachineFunctionInfo : public MachineFunctionInfo { public: AVRMachineFunctionInfo() : HasSpills(false), HasAllocas(false), HasStackArgs(false), + IsInterruptHandler(false), IsSignalHandler(false), CalleeSavedFrameSize(0), VarArgsFrameIndex(0) {} explicit AVRMachineFunctionInfo(MachineFunction &MF) : HasSpills(false), HasAllocas(false), HasStackArgs(false), - CalleeSavedFrameSize(0), VarArgsFrameIndex(0) {} + CalleeSavedFrameSize(0), VarArgsFrameIndex(0) { + unsigned CallConv = MF.getFunction().getCallingConv(); + + this->IsInterruptHandler = CallConv == CallingConv::AVR_INTR || MF.getFunction().hasFnAttribute("interrupt"); + this->IsSignalHandler = CallConv == CallingConv::AVR_SIGNAL || MF.getFunction().hasFnAttribute("signal"); + } bool getHasSpills() const { return HasSpills; } void setHasSpills(bool B) { HasSpills = B; } @@ -56,6 +68,12 @@ public: bool getHasStackArgs() const { return HasStackArgs; } void setHasStackArgs(bool B) { HasStackArgs = B; } + /// Checks if the function is some form of interrupt service routine. + bool isInterruptOrSignalHandler() const { return isInterruptHandler() || isSignalHandler(); } + + bool isInterruptHandler() const { return IsInterruptHandler; } + bool isSignalHandler() const { return IsSignalHandler; } + unsigned getCalleeSavedFrameSize() const { return CalleeSavedFrameSize; } void setCalleeSavedFrameSize(unsigned Bytes) { CalleeSavedFrameSize = Bytes; } |