//=- AArch64MachineFuctionInfo.h - AArch64 machine function info -*- C++ -*-==// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file declares AArch64-specific per-machine-function information. // //===----------------------------------------------------------------------===// #ifndef AARCH64MACHINEFUNCTIONINFO_H #define AARCH64MACHINEFUNCTIONINFO_H #include "llvm/CodeGen/MachineFunction.h" namespace llvm { /// This class is derived from MachineFunctionInfo and contains private AArch64 /// target-specific information for each MachineFunction. class AArch64MachineFunctionInfo : public MachineFunctionInfo { virtual void anchor(); /// Number of bytes of arguments this function has on the stack. If the callee /// is expected to restore the argument stack this should be a multiple of 16, /// all usable during a tail call. /// /// The alternative would forbid tail call optimisation in some cases: if we /// want to transfer control from a function with 8-bytes of stack-argument /// space to a function with 16-bytes then misalignment of this value would /// make a stack adjustment necessary, which could not be undone by the /// callee. unsigned BytesInStackArgArea; /// The number of bytes to restore to deallocate space for incoming /// arguments. Canonically 0 in the C calling convention, but non-zero when /// callee is expected to pop the args. unsigned ArgumentStackToRestore; /// If the stack needs to be adjusted on frame entry in two stages, this /// records the size of the first adjustment just prior to storing /// callee-saved registers. The callee-saved slots are addressed assuming /// SP == - InitialStackAdjust. unsigned InitialStackAdjust; /// Number of local-dynamic TLS accesses. unsigned NumLocalDynamics; /// @see AArch64 Procedure Call Standard, B.3 /// /// The Frame index of the area where LowerFormalArguments puts the /// general-purpose registers that might contain variadic parameters. int VariadicGPRIdx; /// @see AArch64 Procedure Call Standard, B.3 /// /// The size of the frame object used to store the general-purpose registers /// which might contain variadic arguments. This is the offset from /// VariadicGPRIdx to what's stored in __gr_top. unsigned VariadicGPRSize; /// @see AArch64 Procedure Call Standard, B.3 /// /// The Frame index of the area where LowerFormalArguments puts the /// floating-point registers that might contain variadic parameters. int VariadicFPRIdx; /// @see AArch64 Procedure Call Standard, B.3 /// /// The size of the frame object used to store the floating-point registers /// which might contain variadic arguments. This is the offset from /// VariadicFPRIdx to what's stored in __vr_top. unsigned VariadicFPRSize; /// @see AArch64 Procedure Call Standard, B.3 /// /// The Frame index of an object pointing just past the last known stacked /// argument on entry to a variadic function. This goes into the __stack field /// of the va_list type. int VariadicStackIdx; /// The offset of the frame pointer from the stack pointer on function /// entry. This is expected to be negative. int FramePointerOffset; public: AArch64MachineFunctionInfo() : BytesInStackArgArea(0), ArgumentStackToRestore(0), InitialStackAdjust(0), NumLocalDynamics(0), VariadicGPRIdx(0), VariadicGPRSize(0), VariadicFPRIdx(0), VariadicFPRSize(0), VariadicStackIdx(0), FramePointerOffset(0) {} explicit AArch64MachineFunctionInfo(MachineFunction &MF) : BytesInStackArgArea(0), ArgumentStackToRestore(0), InitialStackAdjust(0), NumLocalDynamics(0), VariadicGPRIdx(0), VariadicGPRSize(0), VariadicFPRIdx(0), VariadicFPRSize(0), VariadicStackIdx(0), FramePointerOffset(0) {} unsigned getBytesInStackArgArea() const { return BytesInStackArgArea; } void setBytesInStackArgArea (unsigned bytes) { BytesInStackArgArea = bytes;} unsigned getArgumentStackToRestore() const { return ArgumentStackToRestore; } void setArgumentStackToRestore(unsigned bytes) { ArgumentStackToRestore = bytes; } unsigned getInitialStackAdjust() const { return InitialStackAdjust; } void setInitialStackAdjust(unsigned bytes) { InitialStackAdjust = bytes; } unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; } void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; } int getVariadicGPRIdx() const { return VariadicGPRIdx; } void setVariadicGPRIdx(int Idx) { VariadicGPRIdx = Idx; } unsigned getVariadicGPRSize() const { return VariadicGPRSize; } void setVariadicGPRSize(unsigned Size) { VariadicGPRSize = Size; } int getVariadicFPRIdx() const { return VariadicFPRIdx; } void setVariadicFPRIdx(int Idx) { VariadicFPRIdx = Idx; } unsigned getVariadicFPRSize() const { return VariadicFPRSize; } void setVariadicFPRSize(unsigned Size) { VariadicFPRSize = Size; } int getVariadicStackIdx() const { return VariadicStackIdx; } void setVariadicStackIdx(int Idx) { VariadicStackIdx = Idx; } int getFramePointerOffset() const { return FramePointerOffset; } void setFramePointerOffset(int Idx) { FramePointerOffset = Idx; } }; } // End llvm namespace #endif