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