1cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar//=- AArch64MachineFunctionInfo.h - AArch64 machine function info -*- C++ -*-=// 272062f5744557e270a38192554c3126ea5f97434Tim Northover// 372062f5744557e270a38192554c3126ea5f97434Tim Northover// The LLVM Compiler Infrastructure 472062f5744557e270a38192554c3126ea5f97434Tim Northover// 572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source 672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details. 772062f5744557e270a38192554c3126ea5f97434Tim Northover// 872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 972062f5744557e270a38192554c3126ea5f97434Tim Northover// 1072062f5744557e270a38192554c3126ea5f97434Tim Northover// This file declares AArch64-specific per-machine-function information. 1172062f5744557e270a38192554c3126ea5f97434Tim Northover// 1272062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 1372062f5744557e270a38192554c3126ea5f97434Tim Northover 1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64MACHINEFUNCTIONINFO_H 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_AARCH64_AARCH64MACHINEFUNCTIONINFO_H 1672062f5744557e270a38192554c3126ea5f97434Tim Northover 17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/SmallPtrSet.h" 18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/ADT/SmallVector.h" 1972062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/CodeGen/MachineFunction.h" 20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCLinkerOptimizationHint.h" 2172062f5744557e270a38192554c3126ea5f97434Tim Northover 2272062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm { 2372062f5744557e270a38192554c3126ea5f97434Tim Northover 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// AArch64FunctionInfo - This class is derived from MachineFunctionInfo and 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// contains private AArch64-specific information for each MachineFunction. 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass AArch64FunctionInfo : public MachineFunctionInfo { 2772062f5744557e270a38192554c3126ea5f97434Tim Northover 2872062f5744557e270a38192554c3126ea5f97434Tim Northover /// Number of bytes of arguments this function has on the stack. If the callee 2972062f5744557e270a38192554c3126ea5f97434Tim Northover /// is expected to restore the argument stack this should be a multiple of 16, 3072062f5744557e270a38192554c3126ea5f97434Tim Northover /// all usable during a tail call. 3172062f5744557e270a38192554c3126ea5f97434Tim Northover /// 3272062f5744557e270a38192554c3126ea5f97434Tim Northover /// The alternative would forbid tail call optimisation in some cases: if we 3372062f5744557e270a38192554c3126ea5f97434Tim Northover /// want to transfer control from a function with 8-bytes of stack-argument 3472062f5744557e270a38192554c3126ea5f97434Tim Northover /// space to a function with 16-bytes then misalignment of this value would 3572062f5744557e270a38192554c3126ea5f97434Tim Northover /// make a stack adjustment necessary, which could not be undone by the 3672062f5744557e270a38192554c3126ea5f97434Tim Northover /// callee. 3772062f5744557e270a38192554c3126ea5f97434Tim Northover unsigned BytesInStackArgArea; 3872062f5744557e270a38192554c3126ea5f97434Tim Northover 3972062f5744557e270a38192554c3126ea5f97434Tim Northover /// The number of bytes to restore to deallocate space for incoming 4072062f5744557e270a38192554c3126ea5f97434Tim Northover /// arguments. Canonically 0 in the C calling convention, but non-zero when 4172062f5744557e270a38192554c3126ea5f97434Tim Northover /// callee is expected to pop the args. 4272062f5744557e270a38192554c3126ea5f97434Tim Northover unsigned ArgumentStackToRestore; 4372062f5744557e270a38192554c3126ea5f97434Tim Northover 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// HasStackFrame - True if this function has a stack frame. Set by 45cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// determineCalleeSaves(). 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool HasStackFrame; 4772062f5744557e270a38192554c3126ea5f97434Tim Northover 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Amount of stack frame size, not including callee-saved registers. 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned LocalStackSize; 5072062f5744557e270a38192554c3126ea5f97434Tim Northover 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Number of TLS accesses using the special (combinable) 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// _TLS_MODULE_BASE_ symbol. 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned NumLocalDynamicTLSAccesses; 5472062f5744557e270a38192554c3126ea5f97434Tim Northover 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief FrameIndex for start of varargs area for arguments passed on the 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// stack. 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int VarArgsStackIndex; 5872062f5744557e270a38192554c3126ea5f97434Tim Northover 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief FrameIndex for start of varargs area for arguments passed in 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// general purpose registers. 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int VarArgsGPRIndex; 6272062f5744557e270a38192554c3126ea5f97434Tim Northover 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Size of the varargs area for arguments passed in general purpose 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// registers. 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned VarArgsGPRSize; 6672062f5744557e270a38192554c3126ea5f97434Tim Northover 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief FrameIndex for start of varargs area for arguments passed in 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// floating-point registers. 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int VarArgsFPRIndex; 7072062f5744557e270a38192554c3126ea5f97434Tim Northover 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Size of the varargs area for arguments passed in floating-point 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// registers. 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned VarArgsFPRSize; 7472062f5744557e270a38192554c3126ea5f97434Tim Northover 75cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// True if this function has a subset of CSRs that is handled explicitly via 76cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// copies. 77cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool IsSplitCSR; 78cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 7972062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic: 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64FunctionInfo() 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : BytesInStackArgArea(0), ArgumentStackToRestore(0), HasStackFrame(false), 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines NumLocalDynamicTLSAccesses(0), VarArgsStackIndex(0), VarArgsGPRIndex(0), 83cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar VarArgsGPRSize(0), VarArgsFPRIndex(0), VarArgsFPRSize(0), 84cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar IsSplitCSR(false) {} 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines explicit AArch64FunctionInfo(MachineFunction &MF) 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : BytesInStackArgArea(0), ArgumentStackToRestore(0), HasStackFrame(false), 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines NumLocalDynamicTLSAccesses(0), VarArgsStackIndex(0), VarArgsGPRIndex(0), 89cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar VarArgsGPRSize(0), VarArgsFPRIndex(0), VarArgsFPRSize(0), 90cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar IsSplitCSR(false) { 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines (void)MF; 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 9372062f5744557e270a38192554c3126ea5f97434Tim Northover 9472062f5744557e270a38192554c3126ea5f97434Tim Northover unsigned getBytesInStackArgArea() const { return BytesInStackArgArea; } 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setBytesInStackArgArea(unsigned bytes) { BytesInStackArgArea = bytes; } 9672062f5744557e270a38192554c3126ea5f97434Tim Northover 9772062f5744557e270a38192554c3126ea5f97434Tim Northover unsigned getArgumentStackToRestore() const { return ArgumentStackToRestore; } 98dfe076af9879eb68a7b8331f9c02eecf563d85beTim Northover void setArgumentStackToRestore(unsigned bytes) { 99dfe076af9879eb68a7b8331f9c02eecf563d85beTim Northover ArgumentStackToRestore = bytes; 100dfe076af9879eb68a7b8331f9c02eecf563d85beTim Northover } 10172062f5744557e270a38192554c3126ea5f97434Tim Northover 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasStackFrame() const { return HasStackFrame; } 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setHasStackFrame(bool s) { HasStackFrame = s; } 10472062f5744557e270a38192554c3126ea5f97434Tim Northover 105cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool isSplitCSR() const { return IsSplitCSR; } 106cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar void setIsSplitCSR(bool s) { IsSplitCSR = s; } 107cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setLocalStackSize(unsigned Size) { LocalStackSize = Size; } 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getLocalStackSize() const { return LocalStackSize; } 11072062f5744557e270a38192554c3126ea5f97434Tim Northover 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamicTLSAccesses; } 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getNumLocalDynamicTLSAccesses() const { 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return NumLocalDynamicTLSAccesses; 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 11572062f5744557e270a38192554c3126ea5f97434Tim Northover 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int getVarArgsStackIndex() const { return VarArgsStackIndex; } 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setVarArgsStackIndex(int Index) { VarArgsStackIndex = Index; } 11872062f5744557e270a38192554c3126ea5f97434Tim Northover 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int getVarArgsGPRIndex() const { return VarArgsGPRIndex; } 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setVarArgsGPRIndex(int Index) { VarArgsGPRIndex = Index; } 12172062f5744557e270a38192554c3126ea5f97434Tim Northover 122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getVarArgsGPRSize() const { return VarArgsGPRSize; } 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setVarArgsGPRSize(unsigned Size) { VarArgsGPRSize = Size; } 12472062f5744557e270a38192554c3126ea5f97434Tim Northover 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines int getVarArgsFPRIndex() const { return VarArgsFPRIndex; } 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setVarArgsFPRIndex(int Index) { VarArgsFPRIndex = Index; } 12772062f5744557e270a38192554c3126ea5f97434Tim Northover 128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getVarArgsFPRSize() const { return VarArgsFPRSize; } 129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setVarArgsFPRSize(unsigned Size) { VarArgsFPRSize = Size; } 13072062f5744557e270a38192554c3126ea5f97434Tim Northover 131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef SmallPtrSet<const MachineInstr *, 16> SetOfInstructions; 132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const SetOfInstructions &getLOHRelated() const { return LOHRelated; } 134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Shortcuts for LOH related types. 136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines class MILOHDirective { 137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCLOHType Kind; 13872062f5744557e270a38192554c3126ea5f97434Tim Northover 139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Arguments of this directive. Order matters. 140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SmallVector<const MachineInstr *, 3> Args; 141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines public: 143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef SmallVectorImpl<const MachineInstr *> LOHArgs; 144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MILOHDirective(MCLOHType Kind, const LOHArgs &Args) 146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : Kind(Kind), Args(Args.begin(), Args.end()) { 147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(isValidMCLOHType(Kind) && "Invalid LOH directive type!"); 148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCLOHType getKind() const { return Kind; } 151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const LOHArgs &getArgs() const { return Args; } 152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines }; 153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef MILOHDirective::LOHArgs MILOHArgs; 155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef SmallVector<MILOHDirective, 32> MILOHContainer; 156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MILOHContainer &getLOHContainer() const { return LOHContainerSet; } 158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// Add a LOH directive of this @p Kind and this @p Args. 160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLOHDirective(MCLOHType Kind, const MILOHArgs &Args) { 161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LOHContainerSet.push_back(MILOHDirective(Kind, Args)); 162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LOHRelated.insert(Args.begin(), Args.end()); 163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate: 166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Hold the lists of LOHs. 167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MILOHContainer LOHContainerSet; 168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SetOfInstructions LOHRelated; 169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 17072062f5744557e270a38192554c3126ea5f97434Tim Northover} // End llvm namespace 17172062f5744557e270a38192554c3126ea5f97434Tim Northover 17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif 173