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