13d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick//===------------------- StackMaps.h - StackMaps ----------------*- C++ -*-===//
23d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick//
33d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick//                     The LLVM Compiler Infrastructure
43d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick//
53d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick// This file is distributed under the University of Illinois Open Source
63d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick// License. See LICENSE.TXT for details.
73d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick//
83d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick//===----------------------------------------------------------------------===//
93d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_CODEGEN_STACKMAPS_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_CODEGEN_STACKMAPS_H
123d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/MapVector.h"
143d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick#include "llvm/ADT/SmallVector.h"
153d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick#include "llvm/CodeGen/MachineInstr.h"
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/MCSymbol.h"
173d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick#include <vector>
183d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
193d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Tricknamespace llvm {
203d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
213d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trickclass AsmPrinter;
223d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trickclass MCExpr;
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCStreamer;
243d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
2572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling/// \brief MI-level patchpoint operands.
2672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling///
2772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling/// MI patchpoint operations take the form:
2872ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling/// [<def>], <id>, <numBytes>, <target>, <numArgs>, <cc>, ...
2972ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling///
30c00090b16b2b35f2d042d965945c4246d13321b5Bill Wendling/// IR patchpoint intrinsics do not have the <cc> operand because calling
31c00090b16b2b35f2d042d965945c4246d13321b5Bill Wendling/// convention is part of the subclass data.
32c00090b16b2b35f2d042d965945c4246d13321b5Bill Wendling///
33c00090b16b2b35f2d042d965945c4246d13321b5Bill Wendling/// SD patchpoint nodes do not have a def operand because it is part of the
34c00090b16b2b35f2d042d965945c4246d13321b5Bill Wendling/// SDValue.
3572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling///
3672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling/// Patchpoints following the anyregcc convention are handled specially. For
3772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling/// these, the stack map also records the location of the return value and
3872ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling/// arguments.
3972ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendlingclass PatchPointOpers {
4072ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendlingpublic:
4172ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// Enumerate the meta operands.
4272ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  enum { IDPos, NBytesPos, TargetPos, NArgPos, CCPos, MetaEnd };
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
4472ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendlingprivate:
4572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  const MachineInstr *MI;
4672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  bool HasDef;
4772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  bool IsAnyReg;
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
4972ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendlingpublic:
5072ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  explicit PatchPointOpers(const MachineInstr *MI);
5172ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
5272ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  bool isAnyReg() const { return IsAnyReg; }
5372ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  bool hasDef() const { return HasDef; }
5472ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
5572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  unsigned getMetaIdx(unsigned Pos = 0) const {
5672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling    assert(Pos < MetaEnd && "Meta operand index out of range.");
5772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling    return (HasDef ? 1 : 0) + Pos;
5872ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  }
5972ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
6072ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  const MachineOperand &getMetaOper(unsigned Pos) {
6172ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling    return MI->getOperand(getMetaIdx(Pos));
6272ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  }
6372ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
6472ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  unsigned getArgIdx() const { return getMetaIdx() + MetaEnd; }
6572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
6672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// Get the operand index of the variable list of non-argument operands.
6772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// These hold the "live state".
6872ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  unsigned getVarIdx() const {
69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return getMetaIdx() + MetaEnd +
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           MI->getOperand(getMetaIdx(NArgPos)).getImm();
7172ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  }
7272ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
7372ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// Get the index at which stack map locations will be recorded.
7472ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// Arguments are not recorded unless the anyregcc convention is used.
7572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  unsigned getStackMapStartIdx() const {
7672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling    if (IsAnyReg)
7772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling      return getArgIdx();
7872ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling    return getVarIdx();
7972ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  }
8072ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
8172ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// \brief Get the next scratch register operand index.
8272ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  unsigned getNextScratchIdx(unsigned StartIdx = 0) const;
8372ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling};
8472ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// MI-level Statepoint operands
86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///
87ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines/// Statepoint operands take the form:
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar///   <id>, <num patch bytes >, <num call arguments>, <call target>,
896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar///   [call arguments], <StackMaps::ConstantOp>, <calling convention>,
906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar///   <StackMaps::ConstantOp>, <statepoint flags>,
91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///   <StackMaps::ConstantOp>, <num other args>, [other args],
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines///   [gc values]
93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass StatepointOpers {
94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesprivate:
956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // These values are aboolute offsets into the operands of the statepoint
966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // instruction.
976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  enum { IDPos, NBytesPos, NCallArgsPos, CallTargetPos, MetaEnd };
986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // These values are relative offests from the start of the statepoint meta
1006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // arguments (i.e. the end of the call arguments).
101f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  enum { CCOffset = 1, FlagsOffset = 3, NumVMSArgsOffset = 5 };
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
103ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinespublic:
104f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  explicit StatepointOpers(const MachineInstr *MI) : MI(MI) {}
105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
106ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Get starting index of non call related arguments
1076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// (calling convention, statepoint flags, vm state and gc state).
108ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unsigned getVarIdx() const {
1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return MI->getOperand(NCallArgsPos).getImm() + MetaEnd;
110ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
111ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Return the ID for the given statepoint.
1136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  uint64_t getID() const { return MI->getOperand(IDPos).getImm(); }
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Return the number of patchable bytes the given statepoint should emit.
1166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  uint32_t getNumPatchBytes() const {
1176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return MI->getOperand(NBytesPos).getImm();
118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// Returns the target of the underlying call.
121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const MachineOperand &getCallTarget() const {
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return MI->getOperand(CallTargetPos);
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesprivate:
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  const MachineInstr *MI;
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines};
128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1293d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trickclass StackMaps {
1303d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trickpublic:
1313d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  struct Location {
132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    enum LocationType {
133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Unprocessed,
134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Register,
135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Direct,
136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Indirect,
137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Constant,
138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      ConstantIndex
139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    };
140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LocationType Type;
141bb756ca24401e190e3b704e5d92759c7a79cc6b7Andrew Trick    unsigned Size;
1423d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick    unsigned Reg;
1433d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick    int64_t Offset;
144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Location() : Type(Unprocessed), Size(0), Reg(0), Offset(0) {}
145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Location(LocationType Type, unsigned Size, unsigned Reg, int64_t Offset)
146f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        : Type(Type), Size(Size), Reg(Reg), Offset(Offset) {}
1473d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  };
1483d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  struct LiveOutReg {
15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned short Reg;
151f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    unsigned short DwarfRegNum;
15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned short Size;
15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
154f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LiveOutReg() : Reg(0), DwarfRegNum(0), Size(0) {}
155f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    LiveOutReg(unsigned short Reg, unsigned short DwarfRegNum,
156f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar               unsigned short Size)
157f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        : Reg(Reg), DwarfRegNum(DwarfRegNum), Size(Size) {}
15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  };
1593d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
1603d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  // OpTypes are used to encode information about the following logical
1613d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  // operand (which may consist of several MachineOperands) for the
1623d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  // OpParser.
1633d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  typedef enum { DirectMemRefOp, IndirectMemRefOp, ConstantOp } OpType;
1643d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  StackMaps(AsmPrinter &AP);
1663d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
16737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void reset() {
16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CSInfos.clear();
16937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    ConstPool.clear();
17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    FnStackSize.clear();
17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
17372ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// \brief Generate a stackmap record for a stackmap instruction.
17472ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  ///
17572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// MI must be a raw STACKMAP, not a PATCHPOINT.
17672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  void recordStackMap(const MachineInstr &MI);
17772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
17872ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// \brief Generate a stackmap record for a patchpoint instruction.
17972ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  void recordPatchPoint(const MachineInstr &MI);
1803d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
181ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  /// \brief Generate a stackmap record for a statepoint instruction.
182ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void recordStatepoint(const MachineInstr &MI);
183ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1843d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  /// If there is any stack map data, create a stack map section and serialize
1853d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  /// the map info into it. This clears the stack map data structures
1863d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  /// afterwards.
1873d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  void serializeToStackMapSection();
1883d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
1893d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trickprivate:
190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  static const char *WSMP;
1913d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  typedef SmallVector<Location, 8> LocationVec;
19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef SmallVector<LiveOutReg, 8> LiveOutVec;
19337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef MapVector<uint64_t, uint64_t> ConstantPool;
19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef MapVector<const MCSymbol *, uint64_t> FnStackSizeMap;
1953d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
1963d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  struct CallsiteInfo {
1973d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick    const MCExpr *CSOffsetExpr;
19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    uint64_t ID;
1993d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick    LocationVec Locations;
20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    LiveOutVec LiveOuts;
201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CallsiteInfo() : CSOffsetExpr(nullptr), ID(0) {}
20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    CallsiteInfo(const MCExpr *CSOffsetExpr, uint64_t ID,
20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                 LocationVec &&Locations, LiveOutVec &&LiveOuts)
204f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        : CSOffsetExpr(CSOffsetExpr), ID(ID), Locations(std::move(Locations)),
205f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          LiveOuts(std::move(LiveOuts)) {}
2063d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  };
2073d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
2083d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  typedef std::vector<CallsiteInfo> CallsiteInfoList;
2093d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
2103d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  AsmPrinter &AP;
2113d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  CallsiteInfoList CSInfos;
2123d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick  ConstantPool ConstPool;
21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  FnStackSizeMap FnStackSize;
21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MachineInstr::const_mop_iterator
21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  parseOperand(MachineInstr::const_mop_iterator MOI,
217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar               MachineInstr::const_mop_iterator MOE, LocationVec &Locs,
218f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar               LiveOutVec &LiveOuts) const;
21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// \brief Create a live-out register record for the given register @p Reg.
22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LiveOutReg createLiveOutReg(unsigned Reg,
22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                              const TargetRegisterInfo *TRI) const;
22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// \brief Parse the register live-out mask and return a vector of live-out
22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// registers that need to be recorded in the stackmap.
22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LiveOutVec parseRegisterLiveOutMask(const uint32_t *Mask) const;
22772ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling
22872ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// This should be called by the MC lowering code _immediately_ before
22972ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// lowering the MI to an MCInst. It records where the operands for the
23072ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// instruction are stored, and outputs a label to record the offset of
23172ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// the call from the start of the text section. In special cases (e.g. AnyReg
23272ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling  /// calling convention) the return register is also recorded if requested.
23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void recordStackMapOpers(const MachineInstr &MI, uint64_t ID,
23472ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling                           MachineInstr::const_mop_iterator MOI,
23572ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling                           MachineInstr::const_mop_iterator MOE,
23672ef53ad21cf2df7cdf6f2a0470b4eaa98d9e7edBill Wendling                           bool recordResult = false);
237dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit the stackmap header.
239dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitStackmapHeader(MCStreamer &OS);
240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit the function frame record for each function.
242dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitFunctionFrameRecords(MCStreamer &OS);
243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit the constant pool.
245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitConstantPoolEntries(MCStreamer &OS);
246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// \brief Emit the callsite info for each stackmap/patchpoint intrinsic call.
2484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void emitCallsiteEntries(MCStreamer &OS);
2494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void print(raw_ostream &OS);
2514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void debug() { print(dbgs()); }
2523d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick};
2533d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick}
2543d74dea4bddc84d1881efc21eb5eefbddbfa9aedAndrew Trick
25537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
256