1 //===- llvm/CodeGen/MachineFunction.h ---------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Collect native machine code for a function. This class contains a list of 10 // MachineBasicBlock instances that make up the current compiled function. 11 // 12 // This class also contains pointers to various classes which hold 13 // target-specific information about the generated code. 14 // 15 //===----------------------------------------------------------------------===// 16 17 #ifndef LLVM_CODEGEN_MACHINEFUNCTION_H 18 #define LLVM_CODEGEN_MACHINEFUNCTION_H 19 20 #include "llvm/ADT/ArrayRef.h" 21 #include "llvm/ADT/DenseMap.h" 22 #include "llvm/ADT/GraphTraits.h" 23 #include "llvm/ADT/SmallVector.h" 24 #include "llvm/ADT/ilist.h" 25 #include "llvm/ADT/iterator.h" 26 #include "llvm/CodeGen/MachineBasicBlock.h" 27 #include "llvm/CodeGen/MachineInstr.h" 28 #include "llvm/CodeGen/MachineMemOperand.h" 29 #include "llvm/IR/EHPersonalities.h" 30 #include "llvm/Support/Allocator.h" 31 #include "llvm/Support/ArrayRecycler.h" 32 #include "llvm/Support/AtomicOrdering.h" 33 #include "llvm/Support/Compiler.h" 34 #include "llvm/Support/Recycler.h" 35 #include "llvm/Target/TargetOptions.h" 36 #include <bitset> 37 #include <cassert> 38 #include <cstdint> 39 #include <memory> 40 #include <utility> 41 #include <variant> 42 #include <vector> 43 44 namespace llvm { 45 46 class BasicBlock; 47 class BlockAddress; 48 class DataLayout; 49 class DebugLoc; 50 struct DenormalMode; 51 class DIExpression; 52 class DILocalVariable; 53 class DILocation; 54 class Function; 55 class GISelChangeObserver; 56 class GlobalValue; 57 class TargetMachine; 58 class MachineConstantPool; 59 class MachineFrameInfo; 60 class MachineFunction; 61 class MachineJumpTableInfo; 62 class MachineRegisterInfo; 63 class MCContext; 64 class MCInstrDesc; 65 class MCSymbol; 66 class MCSection; 67 class Pass; 68 class PseudoSourceValueManager; 69 class raw_ostream; 70 class SlotIndexes; 71 class StringRef; 72 class TargetRegisterClass; 73 class TargetSubtargetInfo; 74 struct WasmEHFuncInfo; 75 struct WinEHFuncInfo; 76 77 template <> struct ilist_alloc_traits<MachineBasicBlock> { 78 void deleteNode(MachineBasicBlock *MBB); 79 }; 80 81 template <> struct ilist_callback_traits<MachineBasicBlock> { 82 void addNodeToList(MachineBasicBlock* N); 83 void removeNodeFromList(MachineBasicBlock* N); 84 85 template <class Iterator> 86 void transferNodesFromList(ilist_callback_traits &OldList, Iterator, Iterator) { 87 assert(this == &OldList && "never transfer MBBs between functions"); 88 } 89 }; 90 91 // The hotness of static data tracked by a MachineFunction and not represented 92 // as a global object in the module IR / MIR. Typical examples are 93 // MachineJumpTableInfo and MachineConstantPool. 94 enum class MachineFunctionDataHotness { 95 Unknown, 96 Cold, 97 Hot, 98 }; 99 100 /// MachineFunctionInfo - This class can be derived from and used by targets to 101 /// hold private target-specific information for each MachineFunction. Objects 102 /// of type are accessed/created with MF::getInfo and destroyed when the 103 /// MachineFunction is destroyed. 104 struct MachineFunctionInfo { 105 virtual ~MachineFunctionInfo(); 106 107 /// Factory function: default behavior is to call new using the 108 /// supplied allocator. 109 /// 110 /// This function can be overridden in a derive class. 111 template <typename FuncInfoTy, typename SubtargetTy = TargetSubtargetInfo> 112 static FuncInfoTy *create(BumpPtrAllocator &Allocator, const Function &F, 113 const SubtargetTy *STI) { 114 return new (Allocator.Allocate<FuncInfoTy>()) FuncInfoTy(F, STI); 115 } 116 117 template <typename Ty> 118 static Ty *create(BumpPtrAllocator &Allocator, const Ty &MFI) { 119 return new (Allocator.Allocate<Ty>()) Ty(MFI); 120 } 121 122 /// Make a functionally equivalent copy of this MachineFunctionInfo in \p MF. 123 /// This requires remapping MachineBasicBlock references from the original 124 /// parent to values in the new function. Targets may assume that virtual 125 /// register and frame index values are preserved in the new function. 126 virtual MachineFunctionInfo * 127 clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, 128 const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB) 129 const { 130 return nullptr; 131 } 132 }; 133 134 /// Properties which a MachineFunction may have at a given point in time. 135 /// Each of these has checking code in the MachineVerifier, and passes can 136 /// require that a property be set. 137 class MachineFunctionProperties { 138 // Possible TODO: Allow targets to extend this (perhaps by allowing the 139 // constructor to specify the size of the bit vector) 140 // Possible TODO: Allow requiring the negative (e.g. VRegsAllocated could be 141 // stated as the negative of "has vregs" 142 143 public: 144 // The properties are stated in "positive" form; i.e. a pass could require 145 // that the property hold, but not that it does not hold. 146 147 // Property descriptions: 148 // IsSSA: True when the machine function is in SSA form and virtual registers 149 // have a single def. 150 // NoPHIs: The machine function does not contain any PHI instruction. 151 // TracksLiveness: True when tracking register liveness accurately. 152 // While this property is set, register liveness information in basic block 153 // live-in lists and machine instruction operands (e.g. implicit defs) is 154 // accurate, kill flags are conservatively accurate (kill flag correctly 155 // indicates the last use of a register, an operand without kill flag may or 156 // may not be the last use of a register). This means it can be used to 157 // change the code in ways that affect the values in registers, for example 158 // by the register scavenger. 159 // When this property is cleared at a very late time, liveness is no longer 160 // reliable. 161 // NoVRegs: The machine function does not use any virtual registers. 162 // Legalized: In GlobalISel: the MachineLegalizer ran and all pre-isel generic 163 // instructions have been legalized; i.e., all instructions are now one of: 164 // - generic and always legal (e.g., COPY) 165 // - target-specific 166 // - legal pre-isel generic instructions. 167 // RegBankSelected: In GlobalISel: the RegBankSelect pass ran and all generic 168 // virtual registers have been assigned to a register bank. 169 // Selected: In GlobalISel: the InstructionSelect pass ran and all pre-isel 170 // generic instructions have been eliminated; i.e., all instructions are now 171 // target-specific or non-pre-isel generic instructions (e.g., COPY). 172 // Since only pre-isel generic instructions can have generic virtual register 173 // operands, this also means that all generic virtual registers have been 174 // constrained to virtual registers (assigned to register classes) and that 175 // all sizes attached to them have been eliminated. 176 // TiedOpsRewritten: The twoaddressinstruction pass will set this flag, it 177 // means that tied-def have been rewritten to meet the RegConstraint. 178 // FailsVerification: Means that the function is not expected to pass machine 179 // verification. This can be set by passes that introduce known problems that 180 // have not been fixed yet. 181 // TracksDebugUserValues: Without this property enabled, debug instructions 182 // such as DBG_VALUE are allowed to reference virtual registers even if those 183 // registers do not have a definition. With the property enabled virtual 184 // registers must only be used if they have a definition. This property 185 // allows earlier passes in the pipeline to skip updates of `DBG_VALUE` 186 // instructions to save compile time. 187 enum class Property : unsigned { 188 IsSSA, 189 NoPHIs, 190 TracksLiveness, 191 NoVRegs, 192 FailedISel, 193 Legalized, 194 RegBankSelected, 195 Selected, 196 TiedOpsRewritten, 197 FailsVerification, 198 FailedRegAlloc, 199 TracksDebugUserValues, 200 LastProperty = TracksDebugUserValues, 201 }; 202 203 bool hasProperty(Property P) const { 204 return Properties[static_cast<unsigned>(P)]; 205 } 206 207 MachineFunctionProperties &set(Property P) { 208 Properties.set(static_cast<unsigned>(P)); 209 return *this; 210 } 211 212 MachineFunctionProperties &reset(Property P) { 213 Properties.reset(static_cast<unsigned>(P)); 214 return *this; 215 } 216 217 /// Reset all the properties. 218 MachineFunctionProperties &reset() { 219 Properties.reset(); 220 return *this; 221 } 222 223 MachineFunctionProperties &set(const MachineFunctionProperties &MFP) { 224 Properties |= MFP.Properties; 225 return *this; 226 } 227 228 MachineFunctionProperties &reset(const MachineFunctionProperties &MFP) { 229 Properties &= ~MFP.Properties; 230 return *this; 231 } 232 233 // Returns true if all properties set in V (i.e. required by a pass) are set 234 // in this. 235 bool verifyRequiredProperties(const MachineFunctionProperties &V) const { 236 return (Properties | ~V.Properties).all(); 237 } 238 239 /// Print the MachineFunctionProperties in human-readable form. 240 void print(raw_ostream &OS) const; 241 242 private: 243 std::bitset<static_cast<unsigned>(Property::LastProperty) + 1> Properties; 244 }; 245 246 struct SEHHandler { 247 /// Filter or finally function. Null indicates a catch-all. 248 const Function *FilterOrFinally; 249 250 /// Address of block to recover at. Null for a finally handler. 251 const BlockAddress *RecoverBA; 252 }; 253 254 /// This structure is used to retain landing pad info for the current function. 255 struct LandingPadInfo { 256 MachineBasicBlock *LandingPadBlock; // Landing pad block. 257 SmallVector<MCSymbol *, 1> BeginLabels; // Labels prior to invoke. 258 SmallVector<MCSymbol *, 1> EndLabels; // Labels after invoke. 259 SmallVector<SEHHandler, 1> SEHHandlers; // SEH handlers active at this lpad. 260 MCSymbol *LandingPadLabel = nullptr; // Label at beginning of landing pad. 261 std::vector<int> TypeIds; // List of type ids (filters negative). 262 263 explicit LandingPadInfo(MachineBasicBlock *MBB) 264 : LandingPadBlock(MBB) {} 265 }; 266 267 class LLVM_ABI MachineFunction { 268 Function &F; 269 const TargetMachine &Target; 270 const TargetSubtargetInfo *STI; 271 MCContext &Ctx; 272 273 // RegInfo - Information about each register in use in the function. 274 MachineRegisterInfo *RegInfo; 275 276 // Used to keep track of target-specific per-machine-function information for 277 // the target implementation. 278 MachineFunctionInfo *MFInfo; 279 280 // Keep track of objects allocated on the stack. 281 MachineFrameInfo *FrameInfo; 282 283 // Keep track of constants which are spilled to memory 284 MachineConstantPool *ConstantPool; 285 286 // Keep track of jump tables for switch instructions 287 MachineJumpTableInfo *JumpTableInfo; 288 289 // Keep track of the function section. 290 MCSection *Section = nullptr; 291 292 // Catchpad unwind destination info for wasm EH. 293 // Keeps track of Wasm exception handling related data. This will be null for 294 // functions that aren't using a wasm EH personality. 295 WasmEHFuncInfo *WasmEHInfo = nullptr; 296 297 // Keeps track of Windows exception handling related data. This will be null 298 // for functions that aren't using a funclet-based EH personality. 299 WinEHFuncInfo *WinEHInfo = nullptr; 300 301 // Function-level unique numbering for MachineBasicBlocks. When a 302 // MachineBasicBlock is inserted into a MachineFunction is it automatically 303 // numbered and this vector keeps track of the mapping from ID's to MBB's. 304 std::vector<MachineBasicBlock*> MBBNumbering; 305 306 // MBBNumbering epoch, incremented after renumbering to detect use of old 307 // block numbers. 308 unsigned MBBNumberingEpoch = 0; 309 310 // Pool-allocate MachineFunction-lifetime and IR objects. 311 BumpPtrAllocator Allocator; 312 313 // Allocation management for instructions in function. 314 Recycler<MachineInstr> InstructionRecycler; 315 316 // Allocation management for operand arrays on instructions. 317 ArrayRecycler<MachineOperand> OperandRecycler; 318 319 // Allocation management for basic blocks in function. 320 Recycler<MachineBasicBlock> BasicBlockRecycler; 321 322 // List of machine basic blocks in function 323 using BasicBlockListType = ilist<MachineBasicBlock>; 324 BasicBlockListType BasicBlocks; 325 326 /// FunctionNumber - This provides a unique ID for each function emitted in 327 /// this translation unit. 328 /// 329 unsigned FunctionNumber; 330 331 /// Alignment - The alignment of the function. 332 Align Alignment; 333 334 /// ExposesReturnsTwice - True if the function calls setjmp or related 335 /// functions with attribute "returns twice", but doesn't have 336 /// the attribute itself. 337 /// This is used to limit optimizations which cannot reason 338 /// about the control flow of such functions. 339 bool ExposesReturnsTwice = false; 340 341 /// True if the function includes any inline assembly. 342 bool HasInlineAsm = false; 343 344 /// True if any WinCFI instruction have been emitted in this function. 345 bool HasWinCFI = false; 346 347 /// Current high-level properties of the IR of the function (e.g. is in SSA 348 /// form or whether registers have been allocated) 349 MachineFunctionProperties Properties; 350 351 // Allocation management for pseudo source values. 352 std::unique_ptr<PseudoSourceValueManager> PSVManager; 353 354 /// List of moves done by a function's prolog. Used to construct frame maps 355 /// by debug and exception handling consumers. 356 std::vector<MCCFIInstruction> FrameInstructions; 357 358 /// List of basic blocks immediately following calls to _setjmp. Used to 359 /// construct a table of valid longjmp targets for Windows Control Flow Guard. 360 std::vector<MCSymbol *> LongjmpTargets; 361 362 /// List of basic blocks that are the target of catchrets. Used to construct 363 /// a table of valid targets for Windows EHCont Guard. 364 std::vector<MCSymbol *> CatchretTargets; 365 366 /// \name Exception Handling 367 /// \{ 368 369 /// List of LandingPadInfo describing the landing pad information. 370 std::vector<LandingPadInfo> LandingPads; 371 372 /// Map a landing pad's EH symbol to the call site indexes. 373 DenseMap<MCSymbol*, SmallVector<unsigned, 4>> LPadToCallSiteMap; 374 375 /// Map a landing pad to its index. 376 DenseMap<const MachineBasicBlock *, unsigned> WasmLPadToIndexMap; 377 378 /// Map of invoke call site index values to associated begin EH_LABEL. 379 DenseMap<MCSymbol*, unsigned> CallSiteMap; 380 381 /// CodeView label annotations. 382 std::vector<std::pair<MCSymbol *, MDNode *>> CodeViewAnnotations; 383 384 bool CallsEHReturn = false; 385 bool CallsUnwindInit = false; 386 bool HasEHCatchret = false; 387 bool HasEHScopes = false; 388 bool HasEHFunclets = false; 389 bool HasFakeUses = false; 390 bool IsOutlined = false; 391 392 /// BBID to assign to the next basic block of this function. 393 unsigned NextBBID = 0; 394 395 /// Section Type for basic blocks, only relevant with basic block sections. 396 BasicBlockSection BBSectionsType = BasicBlockSection::None; 397 398 /// List of C++ TypeInfo used. 399 std::vector<const GlobalValue *> TypeInfos; 400 401 /// List of typeids encoding filters used. 402 std::vector<unsigned> FilterIds; 403 404 /// List of the indices in FilterIds corresponding to filter terminators. 405 std::vector<unsigned> FilterEnds; 406 407 EHPersonality PersonalityTypeCache = EHPersonality::Unknown; 408 409 /// \} 410 411 /// Clear all the members of this MachineFunction, but the ones used to 412 /// initialize again the MachineFunction. More specifically, this deallocates 413 /// all the dynamically allocated objects and get rids of all the XXXInfo data 414 /// structure, but keeps unchanged the references to Fn, Target, and 415 /// FunctionNumber. 416 void clear(); 417 /// Allocate and initialize the different members. 418 /// In particular, the XXXInfo data structure. 419 /// \pre Fn, Target, and FunctionNumber are properly set. 420 void init(); 421 422 public: 423 /// Description of the location of a variable whose Address is valid and 424 /// unchanging during function execution. The Address may be: 425 /// * A stack index, which can be negative for fixed stack objects. 426 /// * A MCRegister, whose entry value contains the address of the variable. 427 class VariableDbgInfo { 428 std::variant<int, MCRegister> Address; 429 430 public: 431 const DILocalVariable *Var; 432 const DIExpression *Expr; 433 const DILocation *Loc; 434 435 VariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, 436 int Slot, const DILocation *Loc) 437 : Address(Slot), Var(Var), Expr(Expr), Loc(Loc) {} 438 439 VariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, 440 MCRegister EntryValReg, const DILocation *Loc) 441 : Address(EntryValReg), Var(Var), Expr(Expr), Loc(Loc) {} 442 443 /// Return true if this variable is in a stack slot. 444 bool inStackSlot() const { return std::holds_alternative<int>(Address); } 445 446 /// Return true if this variable is in the entry value of a register. 447 bool inEntryValueRegister() const { 448 return std::holds_alternative<MCRegister>(Address); 449 } 450 451 /// Returns the stack slot of this variable, assuming `inStackSlot()` is 452 /// true. 453 int getStackSlot() const { return std::get<int>(Address); } 454 455 /// Returns the MCRegister of this variable, assuming 456 /// `inEntryValueRegister()` is true. 457 MCRegister getEntryValueRegister() const { 458 return std::get<MCRegister>(Address); 459 } 460 461 /// Updates the stack slot of this variable, assuming `inStackSlot()` is 462 /// true. 463 void updateStackSlot(int NewSlot) { 464 assert(inStackSlot()); 465 Address = NewSlot; 466 } 467 }; 468 469 class Delegate { 470 virtual void anchor(); 471 472 public: 473 virtual ~Delegate() = default; 474 /// Callback after an insertion. This should not modify the MI directly. 475 virtual void MF_HandleInsertion(MachineInstr &MI) = 0; 476 /// Callback before a removal. This should not modify the MI directly. 477 virtual void MF_HandleRemoval(MachineInstr &MI) = 0; 478 /// Callback before changing MCInstrDesc. This should not modify the MI 479 /// directly. 480 virtual void MF_HandleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID) { 481 } 482 }; 483 484 /// Structure used to represent pair of argument number after call lowering 485 /// and register used to transfer that argument. 486 /// For now we support only cases when argument is transferred through one 487 /// register. 488 struct ArgRegPair { 489 Register Reg; 490 uint16_t ArgNo; 491 ArgRegPair(Register R, unsigned Arg) : Reg(R), ArgNo(Arg) { 492 assert(Arg < (1 << 16) && "Arg out of range"); 493 } 494 }; 495 496 struct CallSiteInfo { 497 /// Vector of call argument and its forwarding register. 498 SmallVector<ArgRegPair, 1> ArgRegPairs; 499 }; 500 501 struct CalledGlobalInfo { 502 const GlobalValue *Callee; 503 unsigned TargetFlags; 504 }; 505 506 private: 507 Delegate *TheDelegate = nullptr; 508 GISelChangeObserver *Observer = nullptr; 509 510 using CallSiteInfoMap = DenseMap<const MachineInstr *, CallSiteInfo>; 511 /// Map a call instruction to call site arguments forwarding info. 512 CallSiteInfoMap CallSitesInfo; 513 514 /// A helper function that returns call site info for a give call 515 /// instruction if debug entry value support is enabled. 516 CallSiteInfoMap::iterator getCallSiteInfo(const MachineInstr *MI); 517 518 using CalledGlobalsMap = DenseMap<const MachineInstr *, CalledGlobalInfo>; 519 /// Mapping of call instruction to the global value and target flags that it 520 /// calls, if applicable. 521 CalledGlobalsMap CalledGlobalsInfo; 522 523 // Callbacks for insertion and removal. 524 void handleInsertion(MachineInstr &MI); 525 void handleRemoval(MachineInstr &MI); 526 friend struct ilist_traits<MachineInstr>; 527 528 public: 529 // Need to be accessed from MachineInstr::setDesc. 530 void handleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID); 531 532 using VariableDbgInfoMapTy = SmallVector<VariableDbgInfo, 4>; 533 VariableDbgInfoMapTy VariableDbgInfos; 534 535 /// A count of how many instructions in the function have had numbers 536 /// assigned to them. Used for debug value tracking, to determine the 537 /// next instruction number. 538 unsigned DebugInstrNumberingCount = 0; 539 540 /// Set value of DebugInstrNumberingCount field. Avoid using this unless 541 /// you're deserializing this data. 542 void setDebugInstrNumberingCount(unsigned Num); 543 544 /// Pair of instruction number and operand number. 545 using DebugInstrOperandPair = std::pair<unsigned, unsigned>; 546 547 /// Replacement definition for a debug instruction reference. Made up of a 548 /// source instruction / operand pair, destination pair, and a qualifying 549 /// subregister indicating what bits in the operand make up the substitution. 550 // For example, a debug user 551 /// of %1: 552 /// %0:gr32 = someinst, debug-instr-number 1 553 /// %1:gr16 = %0.some_16_bit_subreg, debug-instr-number 2 554 /// Would receive the substitution {{2, 0}, {1, 0}, $subreg}, where $subreg is 555 /// the subregister number for some_16_bit_subreg. 556 class DebugSubstitution { 557 public: 558 DebugInstrOperandPair Src; ///< Source instruction / operand pair. 559 DebugInstrOperandPair Dest; ///< Replacement instruction / operand pair. 560 unsigned Subreg; ///< Qualifier for which part of Dest is read. 561 562 DebugSubstitution(const DebugInstrOperandPair &Src, 563 const DebugInstrOperandPair &Dest, unsigned Subreg) 564 : Src(Src), Dest(Dest), Subreg(Subreg) {} 565 566 /// Order only by source instruction / operand pair: there should never 567 /// be duplicate entries for the same source in any collection. 568 bool operator<(const DebugSubstitution &Other) const { 569 return Src < Other.Src; 570 } 571 }; 572 573 /// Debug value substitutions: a collection of DebugSubstitution objects, 574 /// recording changes in where a value is defined. For example, when one 575 /// instruction is substituted for another. Keeping a record allows recovery 576 /// of variable locations after compilation finishes. 577 SmallVector<DebugSubstitution, 8> DebugValueSubstitutions; 578 579 /// Location of a PHI instruction that is also a debug-info variable value, 580 /// for the duration of register allocation. Loaded by the PHI-elimination 581 /// pass, and emitted as DBG_PHI instructions during VirtRegRewriter, with 582 /// maintenance applied by intermediate passes that edit registers (such as 583 /// coalescing and the allocator passes). 584 class DebugPHIRegallocPos { 585 public: 586 MachineBasicBlock *MBB; ///< Block where this PHI was originally located. 587 Register Reg; ///< VReg where the control-flow-merge happens. 588 unsigned SubReg; ///< Optional subreg qualifier within Reg. 589 DebugPHIRegallocPos(MachineBasicBlock *MBB, Register Reg, unsigned SubReg) 590 : MBB(MBB), Reg(Reg), SubReg(SubReg) {} 591 }; 592 593 /// Map of debug instruction numbers to the position of their PHI instructions 594 /// during register allocation. See DebugPHIRegallocPos. 595 DenseMap<unsigned, DebugPHIRegallocPos> DebugPHIPositions; 596 597 /// Flag for whether this function contains DBG_VALUEs (false) or 598 /// DBG_INSTR_REF (true). 599 bool UseDebugInstrRef = false; 600 601 /// Create a substitution between one <instr,operand> value to a different, 602 /// new value. 603 void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, 604 unsigned SubReg = 0); 605 606 /// Create substitutions for any tracked values in \p Old, to point at 607 /// \p New. Needed when we re-create an instruction during optimization, 608 /// which has the same signature (i.e., def operands in the same place) but 609 /// a modified instruction type, flags, or otherwise. An example: X86 moves 610 /// are sometimes transformed into equivalent LEAs. 611 /// If the two instructions are not the same opcode, limit which operands to 612 /// examine for substitutions to the first N operands by setting 613 /// \p MaxOperand. 614 void substituteDebugValuesForInst(const MachineInstr &Old, MachineInstr &New, 615 unsigned MaxOperand = UINT_MAX); 616 617 /// Find the underlying defining instruction / operand for a COPY instruction 618 /// while in SSA form. Copies do not actually define values -- they move them 619 /// between registers. Labelling a COPY-like instruction with an instruction 620 /// number is to be avoided as it makes value numbers non-unique later in 621 /// compilation. This method follows the definition chain for any sequence of 622 /// COPY-like instructions to find whatever non-COPY-like instruction defines 623 /// the copied value; or for parameters, creates a DBG_PHI on entry. 624 /// May insert instructions into the entry block! 625 /// \p MI The copy-like instruction to salvage. 626 /// \p DbgPHICache A container to cache already-solved COPYs. 627 /// \returns An instruction/operand pair identifying the defining value. 628 DebugInstrOperandPair 629 salvageCopySSA(MachineInstr &MI, 630 DenseMap<Register, DebugInstrOperandPair> &DbgPHICache); 631 632 DebugInstrOperandPair salvageCopySSAImpl(MachineInstr &MI); 633 634 /// Finalise any partially emitted debug instructions. These are DBG_INSTR_REF 635 /// instructions where we only knew the vreg of the value they use, not the 636 /// instruction that defines that vreg. Once isel finishes, we should have 637 /// enough information for every DBG_INSTR_REF to point at an instruction 638 /// (or DBG_PHI). 639 void finalizeDebugInstrRefs(); 640 641 /// Determine whether, in the current machine configuration, we should use 642 /// instruction referencing or not. 643 bool shouldUseDebugInstrRef() const; 644 645 /// Returns true if the function's variable locations are tracked with 646 /// instruction referencing. 647 bool useDebugInstrRef() const; 648 649 /// Set whether this function will use instruction referencing or not. 650 void setUseDebugInstrRef(bool UseInstrRef); 651 652 /// A reserved operand number representing the instructions memory operand, 653 /// for instructions that have a stack spill fused into them. 654 const static unsigned int DebugOperandMemNumber; 655 656 MachineFunction(Function &F, const TargetMachine &Target, 657 const TargetSubtargetInfo &STI, MCContext &Ctx, 658 unsigned FunctionNum); 659 MachineFunction(const MachineFunction &) = delete; 660 MachineFunction &operator=(const MachineFunction &) = delete; 661 ~MachineFunction(); 662 663 /// Reset the instance as if it was just created. 664 void reset() { 665 clear(); 666 init(); 667 } 668 669 /// Reset the currently registered delegate - otherwise assert. 670 void resetDelegate(Delegate *delegate) { 671 assert(TheDelegate == delegate && 672 "Only the current delegate can perform reset!"); 673 TheDelegate = nullptr; 674 } 675 676 /// Set the delegate. resetDelegate must be called before attempting 677 /// to set. 678 void setDelegate(Delegate *delegate) { 679 assert(delegate && !TheDelegate && 680 "Attempted to set delegate to null, or to change it without " 681 "first resetting it!"); 682 683 TheDelegate = delegate; 684 } 685 686 void setObserver(GISelChangeObserver *O) { Observer = O; } 687 688 GISelChangeObserver *getObserver() const { return Observer; } 689 690 MCContext &getContext() const { return Ctx; } 691 692 /// Returns the Section this function belongs to. 693 MCSection *getSection() const { return Section; } 694 695 /// Indicates the Section this function belongs to. 696 void setSection(MCSection *S) { Section = S; } 697 698 PseudoSourceValueManager &getPSVManager() const { return *PSVManager; } 699 700 /// Return the DataLayout attached to the Module associated to this MF. 701 const DataLayout &getDataLayout() const; 702 703 /// Return the LLVM function that this machine code represents 704 Function &getFunction() { return F; } 705 706 /// Return the LLVM function that this machine code represents 707 const Function &getFunction() const { return F; } 708 709 /// getName - Return the name of the corresponding LLVM function. 710 StringRef getName() const; 711 712 /// getFunctionNumber - Return a unique ID for the current function. 713 unsigned getFunctionNumber() const { return FunctionNumber; } 714 715 /// Returns true if this function has basic block sections enabled. 716 bool hasBBSections() const { 717 return (BBSectionsType == BasicBlockSection::All || 718 BBSectionsType == BasicBlockSection::List || 719 BBSectionsType == BasicBlockSection::Preset); 720 } 721 722 void setBBSectionsType(BasicBlockSection V) { BBSectionsType = V; } 723 724 /// Assign IsBeginSection IsEndSection fields for basic blocks in this 725 /// function. 726 void assignBeginEndSections(); 727 728 /// getTarget - Return the target machine this machine code is compiled with 729 const TargetMachine &getTarget() const { return Target; } 730 731 /// getSubtarget - Return the subtarget for which this machine code is being 732 /// compiled. 733 const TargetSubtargetInfo &getSubtarget() const { return *STI; } 734 735 /// getSubtarget - This method returns a pointer to the specified type of 736 /// TargetSubtargetInfo. In debug builds, it verifies that the object being 737 /// returned is of the correct type. 738 template<typename STC> const STC &getSubtarget() const { 739 return *static_cast<const STC *>(STI); 740 } 741 742 /// getRegInfo - Return information about the registers currently in use. 743 MachineRegisterInfo &getRegInfo() { return *RegInfo; } 744 const MachineRegisterInfo &getRegInfo() const { return *RegInfo; } 745 746 /// getFrameInfo - Return the frame info object for the current function. 747 /// This object contains information about objects allocated on the stack 748 /// frame of the current function in an abstract way. 749 MachineFrameInfo &getFrameInfo() { return *FrameInfo; } 750 const MachineFrameInfo &getFrameInfo() const { return *FrameInfo; } 751 752 /// getJumpTableInfo - Return the jump table info object for the current 753 /// function. This object contains information about jump tables in the 754 /// current function. If the current function has no jump tables, this will 755 /// return null. 756 const MachineJumpTableInfo *getJumpTableInfo() const { return JumpTableInfo; } 757 MachineJumpTableInfo *getJumpTableInfo() { return JumpTableInfo; } 758 759 /// getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it 760 /// does already exist, allocate one. 761 MachineJumpTableInfo *getOrCreateJumpTableInfo(unsigned JTEntryKind); 762 763 /// getConstantPool - Return the constant pool object for the current 764 /// function. 765 MachineConstantPool *getConstantPool() { return ConstantPool; } 766 const MachineConstantPool *getConstantPool() const { return ConstantPool; } 767 768 /// getWasmEHFuncInfo - Return information about how the current function uses 769 /// Wasm exception handling. Returns null for functions that don't use wasm 770 /// exception handling. 771 const WasmEHFuncInfo *getWasmEHFuncInfo() const { return WasmEHInfo; } 772 WasmEHFuncInfo *getWasmEHFuncInfo() { return WasmEHInfo; } 773 774 /// getWinEHFuncInfo - Return information about how the current function uses 775 /// Windows exception handling. Returns null for functions that don't use 776 /// funclets for exception handling. 777 const WinEHFuncInfo *getWinEHFuncInfo() const { return WinEHInfo; } 778 WinEHFuncInfo *getWinEHFuncInfo() { return WinEHInfo; } 779 780 /// getAlignment - Return the alignment of the function. 781 Align getAlignment() const { return Alignment; } 782 783 /// setAlignment - Set the alignment of the function. 784 void setAlignment(Align A) { Alignment = A; } 785 786 /// ensureAlignment - Make sure the function is at least A bytes aligned. 787 void ensureAlignment(Align A) { 788 if (Alignment < A) 789 Alignment = A; 790 } 791 792 /// exposesReturnsTwice - Returns true if the function calls setjmp or 793 /// any other similar functions with attribute "returns twice" without 794 /// having the attribute itself. 795 bool exposesReturnsTwice() const { 796 return ExposesReturnsTwice; 797 } 798 799 /// setCallsSetJmp - Set a flag that indicates if there's a call to 800 /// a "returns twice" function. 801 void setExposesReturnsTwice(bool B) { 802 ExposesReturnsTwice = B; 803 } 804 805 /// Returns true if the function contains any inline assembly. 806 bool hasInlineAsm() const { 807 return HasInlineAsm; 808 } 809 810 /// Set a flag that indicates that the function contains inline assembly. 811 void setHasInlineAsm(bool B) { 812 HasInlineAsm = B; 813 } 814 815 bool hasWinCFI() const { 816 return HasWinCFI; 817 } 818 void setHasWinCFI(bool v) { HasWinCFI = v; } 819 820 /// True if this function needs frame moves for debug or exceptions. 821 bool needsFrameMoves() const; 822 823 /// Get the function properties 824 const MachineFunctionProperties &getProperties() const { return Properties; } 825 MachineFunctionProperties &getProperties() { return Properties; } 826 827 /// getInfo - Keep track of various per-function pieces of information for 828 /// backends that would like to do so. 829 /// 830 template<typename Ty> 831 Ty *getInfo() { 832 return static_cast<Ty*>(MFInfo); 833 } 834 835 template<typename Ty> 836 const Ty *getInfo() const { 837 return static_cast<const Ty *>(MFInfo); 838 } 839 840 template <typename Ty> Ty *cloneInfo(const Ty &Old) { 841 assert(!MFInfo); 842 MFInfo = Ty::template create<Ty>(Allocator, Old); 843 return static_cast<Ty *>(MFInfo); 844 } 845 846 /// Initialize the target specific MachineFunctionInfo 847 void initTargetMachineFunctionInfo(const TargetSubtargetInfo &STI); 848 849 MachineFunctionInfo *cloneInfoFrom( 850 const MachineFunction &OrigMF, 851 const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB) { 852 assert(!MFInfo && "new function already has MachineFunctionInfo"); 853 if (!OrigMF.MFInfo) 854 return nullptr; 855 return OrigMF.MFInfo->clone(Allocator, *this, Src2DstMBB); 856 } 857 858 /// Returns the denormal handling type for the default rounding mode of the 859 /// function. 860 DenormalMode getDenormalMode(const fltSemantics &FPType) const; 861 862 /// getBlockNumbered - MachineBasicBlocks are automatically numbered when they 863 /// are inserted into the machine function. The block number for a machine 864 /// basic block can be found by using the MBB::getNumber method, this method 865 /// provides the inverse mapping. 866 MachineBasicBlock *getBlockNumbered(unsigned N) const { 867 assert(N < MBBNumbering.size() && "Illegal block number"); 868 assert(MBBNumbering[N] && "Block was removed from the machine function!"); 869 return MBBNumbering[N]; 870 } 871 872 /// Should we be emitting segmented stack stuff for the function 873 bool shouldSplitStack() const; 874 875 /// getNumBlockIDs - Return the number of MBB ID's allocated. 876 unsigned getNumBlockIDs() const { return (unsigned)MBBNumbering.size(); } 877 878 /// Return the numbering "epoch" of block numbers, incremented after each 879 /// numbering. Intended for asserting that no renumbering was performed when 880 /// used by, e.g., preserved analyses. 881 unsigned getBlockNumberEpoch() const { return MBBNumberingEpoch; } 882 883 /// RenumberBlocks - This discards all of the MachineBasicBlock numbers and 884 /// recomputes them. This guarantees that the MBB numbers are sequential, 885 /// dense, and match the ordering of the blocks within the function. If a 886 /// specific MachineBasicBlock is specified, only that block and those after 887 /// it are renumbered. 888 void RenumberBlocks(MachineBasicBlock *MBBFrom = nullptr); 889 890 /// Return an estimate of the function's code size, 891 /// taking into account block and function alignment 892 int64_t estimateFunctionSizeInBytes(); 893 894 /// print - Print out the MachineFunction in a format suitable for debugging 895 /// to the specified stream. 896 void print(raw_ostream &OS, const SlotIndexes* = nullptr) const; 897 898 /// viewCFG - This function is meant for use from the debugger. You can just 899 /// say 'call F->viewCFG()' and a ghostview window should pop up from the 900 /// program, displaying the CFG of the current function with the code for each 901 /// basic block inside. This depends on there being a 'dot' and 'gv' program 902 /// in your path. 903 void viewCFG() const; 904 905 /// viewCFGOnly - This function is meant for use from the debugger. It works 906 /// just like viewCFG, but it does not include the contents of basic blocks 907 /// into the nodes, just the label. If you are only interested in the CFG 908 /// this can make the graph smaller. 909 /// 910 void viewCFGOnly() const; 911 912 /// dump - Print the current MachineFunction to cerr, useful for debugger use. 913 void dump() const; 914 915 /// Run the current MachineFunction through the machine code verifier, useful 916 /// for debugger use. 917 /// \returns true if no problems were found. 918 bool verify(Pass *p = nullptr, const char *Banner = nullptr, 919 raw_ostream *OS = nullptr, bool AbortOnError = true) const; 920 921 /// Run the current MachineFunction through the machine code verifier, useful 922 /// for debugger use. 923 /// \returns true if no problems were found. 924 bool verify(LiveIntervals *LiveInts, SlotIndexes *Indexes, 925 const char *Banner = nullptr, raw_ostream *OS = nullptr, 926 bool AbortOnError = true) const; 927 928 // Provide accessors for the MachineBasicBlock list... 929 using iterator = BasicBlockListType::iterator; 930 using const_iterator = BasicBlockListType::const_iterator; 931 using const_reverse_iterator = BasicBlockListType::const_reverse_iterator; 932 using reverse_iterator = BasicBlockListType::reverse_iterator; 933 934 /// Support for MachineBasicBlock::getNextNode(). 935 static BasicBlockListType MachineFunction::* 936 getSublistAccess(MachineBasicBlock *) { 937 return &MachineFunction::BasicBlocks; 938 } 939 940 /// addLiveIn - Add the specified physical register as a live-in value and 941 /// create a corresponding virtual register for it. 942 Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC); 943 944 //===--------------------------------------------------------------------===// 945 // BasicBlock accessor functions. 946 // 947 iterator begin() { return BasicBlocks.begin(); } 948 const_iterator begin() const { return BasicBlocks.begin(); } 949 iterator end () { return BasicBlocks.end(); } 950 const_iterator end () const { return BasicBlocks.end(); } 951 952 reverse_iterator rbegin() { return BasicBlocks.rbegin(); } 953 const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); } 954 reverse_iterator rend () { return BasicBlocks.rend(); } 955 const_reverse_iterator rend () const { return BasicBlocks.rend(); } 956 957 unsigned size() const { return (unsigned)BasicBlocks.size();} 958 bool empty() const { return BasicBlocks.empty(); } 959 const MachineBasicBlock &front() const { return BasicBlocks.front(); } 960 MachineBasicBlock &front() { return BasicBlocks.front(); } 961 const MachineBasicBlock & back() const { return BasicBlocks.back(); } 962 MachineBasicBlock & back() { return BasicBlocks.back(); } 963 964 void push_back (MachineBasicBlock *MBB) { BasicBlocks.push_back (MBB); } 965 void push_front(MachineBasicBlock *MBB) { BasicBlocks.push_front(MBB); } 966 void insert(iterator MBBI, MachineBasicBlock *MBB) { 967 BasicBlocks.insert(MBBI, MBB); 968 } 969 void splice(iterator InsertPt, iterator MBBI) { 970 BasicBlocks.splice(InsertPt, BasicBlocks, MBBI); 971 } 972 void splice(iterator InsertPt, MachineBasicBlock *MBB) { 973 BasicBlocks.splice(InsertPt, BasicBlocks, MBB); 974 } 975 void splice(iterator InsertPt, iterator MBBI, iterator MBBE) { 976 BasicBlocks.splice(InsertPt, BasicBlocks, MBBI, MBBE); 977 } 978 979 void remove(iterator MBBI) { BasicBlocks.remove(MBBI); } 980 void remove(MachineBasicBlock *MBBI) { BasicBlocks.remove(MBBI); } 981 void erase(iterator MBBI) { BasicBlocks.erase(MBBI); } 982 void erase(MachineBasicBlock *MBBI) { BasicBlocks.erase(MBBI); } 983 984 template <typename Comp> 985 void sort(Comp comp) { 986 BasicBlocks.sort(comp); 987 } 988 989 /// Return the number of \p MachineInstrs in this \p MachineFunction. 990 unsigned getInstructionCount() const { 991 unsigned InstrCount = 0; 992 for (const MachineBasicBlock &MBB : BasicBlocks) 993 InstrCount += MBB.size(); 994 return InstrCount; 995 } 996 997 //===--------------------------------------------------------------------===// 998 // Internal functions used to automatically number MachineBasicBlocks 999 1000 /// Adds the MBB to the internal numbering. Returns the unique number 1001 /// assigned to the MBB. 1002 unsigned addToMBBNumbering(MachineBasicBlock *MBB) { 1003 MBBNumbering.push_back(MBB); 1004 return (unsigned)MBBNumbering.size()-1; 1005 } 1006 1007 /// removeFromMBBNumbering - Remove the specific machine basic block from our 1008 /// tracker, this is only really to be used by the MachineBasicBlock 1009 /// implementation. 1010 void removeFromMBBNumbering(unsigned N) { 1011 assert(N < MBBNumbering.size() && "Illegal basic block #"); 1012 MBBNumbering[N] = nullptr; 1013 } 1014 1015 /// CreateMachineInstr - Allocate a new MachineInstr. Use this instead 1016 /// of `new MachineInstr'. 1017 MachineInstr *CreateMachineInstr(const MCInstrDesc &MCID, DebugLoc DL, 1018 bool NoImplicit = false); 1019 1020 /// Create a new MachineInstr which is a copy of \p Orig, identical in all 1021 /// ways except the instruction has no parent, prev, or next. Bundling flags 1022 /// are reset. 1023 /// 1024 /// Note: Clones a single instruction, not whole instruction bundles. 1025 /// Does not perform target specific adjustments; consider using 1026 /// TargetInstrInfo::duplicate() instead. 1027 MachineInstr *CloneMachineInstr(const MachineInstr *Orig); 1028 1029 /// Clones instruction or the whole instruction bundle \p Orig and insert 1030 /// into \p MBB before \p InsertBefore. 1031 /// 1032 /// Note: Does not perform target specific adjustments; consider using 1033 /// TargetInstrInfo::duplicate() instead. 1034 MachineInstr & 1035 cloneMachineInstrBundle(MachineBasicBlock &MBB, 1036 MachineBasicBlock::iterator InsertBefore, 1037 const MachineInstr &Orig); 1038 1039 /// DeleteMachineInstr - Delete the given MachineInstr. 1040 void deleteMachineInstr(MachineInstr *MI); 1041 1042 /// CreateMachineBasicBlock - Allocate a new MachineBasicBlock. Use this 1043 /// instead of `new MachineBasicBlock'. Sets `MachineBasicBlock::BBID` if 1044 /// basic-block-sections is enabled for the function. 1045 MachineBasicBlock * 1046 CreateMachineBasicBlock(const BasicBlock *BB = nullptr, 1047 std::optional<UniqueBBID> BBID = std::nullopt); 1048 1049 /// DeleteMachineBasicBlock - Delete the given MachineBasicBlock. 1050 void deleteMachineBasicBlock(MachineBasicBlock *MBB); 1051 1052 /// getMachineMemOperand - Allocate a new MachineMemOperand. 1053 /// MachineMemOperands are owned by the MachineFunction and need not be 1054 /// explicitly deallocated. 1055 MachineMemOperand *getMachineMemOperand( 1056 MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, 1057 Align base_alignment, const AAMDNodes &AAInfo = AAMDNodes(), 1058 const MDNode *Ranges = nullptr, SyncScope::ID SSID = SyncScope::System, 1059 AtomicOrdering Ordering = AtomicOrdering::NotAtomic, 1060 AtomicOrdering FailureOrdering = AtomicOrdering::NotAtomic); 1061 MachineMemOperand *getMachineMemOperand( 1062 MachinePointerInfo PtrInfo, MachineMemOperand::Flags F, LocationSize Size, 1063 Align BaseAlignment, const AAMDNodes &AAInfo = AAMDNodes(), 1064 const MDNode *Ranges = nullptr, SyncScope::ID SSID = SyncScope::System, 1065 AtomicOrdering Ordering = AtomicOrdering::NotAtomic, 1066 AtomicOrdering FailureOrdering = AtomicOrdering::NotAtomic); 1067 MachineMemOperand *getMachineMemOperand( 1068 MachinePointerInfo PtrInfo, MachineMemOperand::Flags F, uint64_t Size, 1069 Align BaseAlignment, const AAMDNodes &AAInfo = AAMDNodes(), 1070 const MDNode *Ranges = nullptr, SyncScope::ID SSID = SyncScope::System, 1071 AtomicOrdering Ordering = AtomicOrdering::NotAtomic, 1072 AtomicOrdering FailureOrdering = AtomicOrdering::NotAtomic) { 1073 return getMachineMemOperand(PtrInfo, F, LocationSize::precise(Size), 1074 BaseAlignment, AAInfo, Ranges, SSID, Ordering, 1075 FailureOrdering); 1076 } 1077 1078 /// getMachineMemOperand - Allocate a new MachineMemOperand by copying 1079 /// an existing one, adjusting by an offset and using the given size. 1080 /// MachineMemOperands are owned by the MachineFunction and need not be 1081 /// explicitly deallocated. 1082 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1083 int64_t Offset, LLT Ty); 1084 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1085 int64_t Offset, LocationSize Size) { 1086 return getMachineMemOperand( 1087 MMO, Offset, 1088 !Size.hasValue() ? LLT() 1089 : Size.isScalable() 1090 ? LLT::scalable_vector(1, 8 * Size.getValue().getKnownMinValue()) 1091 : LLT::scalar(8 * Size.getValue().getKnownMinValue())); 1092 } 1093 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1094 int64_t Offset, uint64_t Size) { 1095 return getMachineMemOperand(MMO, Offset, LocationSize::precise(Size)); 1096 } 1097 1098 /// getMachineMemOperand - Allocate a new MachineMemOperand by copying 1099 /// an existing one, replacing only the MachinePointerInfo and size. 1100 /// MachineMemOperands are owned by the MachineFunction and need not be 1101 /// explicitly deallocated. 1102 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1103 const MachinePointerInfo &PtrInfo, 1104 LocationSize Size); 1105 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1106 const MachinePointerInfo &PtrInfo, 1107 LLT Ty); 1108 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1109 const MachinePointerInfo &PtrInfo, 1110 uint64_t Size) { 1111 return getMachineMemOperand(MMO, PtrInfo, LocationSize::precise(Size)); 1112 } 1113 1114 /// Allocate a new MachineMemOperand by copying an existing one, 1115 /// replacing only AliasAnalysis information. MachineMemOperands are owned 1116 /// by the MachineFunction and need not be explicitly deallocated. 1117 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1118 const AAMDNodes &AAInfo); 1119 1120 /// Allocate a new MachineMemOperand by copying an existing one, 1121 /// replacing the flags. MachineMemOperands are owned 1122 /// by the MachineFunction and need not be explicitly deallocated. 1123 MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO, 1124 MachineMemOperand::Flags Flags); 1125 1126 using OperandCapacity = ArrayRecycler<MachineOperand>::Capacity; 1127 1128 /// Allocate an array of MachineOperands. This is only intended for use by 1129 /// internal MachineInstr functions. 1130 MachineOperand *allocateOperandArray(OperandCapacity Cap) { 1131 return OperandRecycler.allocate(Cap, Allocator); 1132 } 1133 1134 /// Dellocate an array of MachineOperands and recycle the memory. This is 1135 /// only intended for use by internal MachineInstr functions. 1136 /// Cap must be the same capacity that was used to allocate the array. 1137 void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array) { 1138 OperandRecycler.deallocate(Cap, Array); 1139 } 1140 1141 /// Allocate and initialize a register mask with @p NumRegister bits. 1142 uint32_t *allocateRegMask(); 1143 1144 ArrayRef<int> allocateShuffleMask(ArrayRef<int> Mask); 1145 1146 /// Allocate and construct an extra info structure for a `MachineInstr`. 1147 /// 1148 /// This is allocated on the function's allocator and so lives the life of 1149 /// the function. 1150 MachineInstr::ExtraInfo *createMIExtraInfo( 1151 ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol = nullptr, 1152 MCSymbol *PostInstrSymbol = nullptr, MDNode *HeapAllocMarker = nullptr, 1153 MDNode *PCSections = nullptr, uint32_t CFIType = 0, 1154 MDNode *MMRAs = nullptr); 1155 1156 /// Allocate a string and populate it with the given external symbol name. 1157 const char *createExternalSymbolName(StringRef Name); 1158 1159 //===--------------------------------------------------------------------===// 1160 // Label Manipulation. 1161 1162 /// getJTISymbol - Return the MCSymbol for the specified non-empty jump table. 1163 /// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a 1164 /// normal 'L' label is returned. 1165 MCSymbol *getJTISymbol(unsigned JTI, MCContext &Ctx, 1166 bool isLinkerPrivate = false) const; 1167 1168 /// getPICBaseSymbol - Return a function-local symbol to represent the PIC 1169 /// base. 1170 MCSymbol *getPICBaseSymbol() const; 1171 1172 /// Returns a reference to a list of cfi instructions in the function's 1173 /// prologue. Used to construct frame maps for debug and exception handling 1174 /// comsumers. 1175 const std::vector<MCCFIInstruction> &getFrameInstructions() const { 1176 return FrameInstructions; 1177 } 1178 1179 [[nodiscard]] unsigned addFrameInst(const MCCFIInstruction &Inst); 1180 1181 /// Returns a reference to a list of symbols immediately following calls to 1182 /// _setjmp in the function. Used to construct the longjmp target table used 1183 /// by Windows Control Flow Guard. 1184 const std::vector<MCSymbol *> &getLongjmpTargets() const { 1185 return LongjmpTargets; 1186 } 1187 1188 /// Add the specified symbol to the list of valid longjmp targets for Windows 1189 /// Control Flow Guard. 1190 void addLongjmpTarget(MCSymbol *Target) { LongjmpTargets.push_back(Target); } 1191 1192 /// Returns a reference to a list of symbols that we have catchrets. 1193 /// Used to construct the catchret target table used by Windows EHCont Guard. 1194 const std::vector<MCSymbol *> &getCatchretTargets() const { 1195 return CatchretTargets; 1196 } 1197 1198 /// Add the specified symbol to the list of valid catchret targets for Windows 1199 /// EHCont Guard. 1200 void addCatchretTarget(MCSymbol *Target) { 1201 CatchretTargets.push_back(Target); 1202 } 1203 1204 /// Tries to get the global and target flags for a call site, if the 1205 /// instruction is a call to a global. 1206 CalledGlobalInfo tryGetCalledGlobal(const MachineInstr *MI) const { 1207 return CalledGlobalsInfo.lookup(MI); 1208 } 1209 1210 /// Notes the global and target flags for a call site. 1211 void addCalledGlobal(const MachineInstr *MI, CalledGlobalInfo Details) { 1212 assert(MI && "MI must not be null"); 1213 assert(Details.Callee && "Global must not be null"); 1214 CalledGlobalsInfo.insert({MI, Details}); 1215 } 1216 1217 /// Iterates over the full set of call sites and their associated globals. 1218 auto getCalledGlobals() const { 1219 return llvm::make_range(CalledGlobalsInfo.begin(), CalledGlobalsInfo.end()); 1220 } 1221 1222 /// \name Exception Handling 1223 /// \{ 1224 1225 bool callsEHReturn() const { return CallsEHReturn; } 1226 void setCallsEHReturn(bool b) { CallsEHReturn = b; } 1227 1228 bool callsUnwindInit() const { return CallsUnwindInit; } 1229 void setCallsUnwindInit(bool b) { CallsUnwindInit = b; } 1230 1231 bool hasEHCatchret() const { return HasEHCatchret; } 1232 void setHasEHCatchret(bool V) { HasEHCatchret = V; } 1233 1234 bool hasEHScopes() const { return HasEHScopes; } 1235 void setHasEHScopes(bool V) { HasEHScopes = V; } 1236 1237 bool hasEHFunclets() const { return HasEHFunclets; } 1238 void setHasEHFunclets(bool V) { HasEHFunclets = V; } 1239 1240 bool hasFakeUses() const { return HasFakeUses; } 1241 void setHasFakeUses(bool V) { HasFakeUses = V; } 1242 1243 bool isOutlined() const { return IsOutlined; } 1244 void setIsOutlined(bool V) { IsOutlined = V; } 1245 1246 /// Find or create an LandingPadInfo for the specified MachineBasicBlock. 1247 LandingPadInfo &getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad); 1248 1249 /// Return a reference to the landing pad info for the current function. 1250 const std::vector<LandingPadInfo> &getLandingPads() const { 1251 return LandingPads; 1252 } 1253 1254 /// Provide the begin and end labels of an invoke style call and associate it 1255 /// with a try landing pad block. 1256 void addInvoke(MachineBasicBlock *LandingPad, 1257 MCSymbol *BeginLabel, MCSymbol *EndLabel); 1258 1259 /// Add a new panding pad, and extract the exception handling information from 1260 /// the landingpad instruction. Returns the label ID for the landing pad 1261 /// entry. 1262 MCSymbol *addLandingPad(MachineBasicBlock *LandingPad); 1263 1264 /// Return the type id for the specified typeinfo. This is function wide. 1265 unsigned getTypeIDFor(const GlobalValue *TI); 1266 1267 /// Return the id of the filter encoded by TyIds. This is function wide. 1268 int getFilterIDFor(ArrayRef<unsigned> TyIds); 1269 1270 /// Map the landing pad's EH symbol to the call site indexes. 1271 void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef<unsigned> Sites); 1272 1273 /// Return if there is any wasm exception handling. 1274 bool hasAnyWasmLandingPadIndex() const { 1275 return !WasmLPadToIndexMap.empty(); 1276 } 1277 1278 /// Map the landing pad to its index. Used for Wasm exception handling. 1279 void setWasmLandingPadIndex(const MachineBasicBlock *LPad, unsigned Index) { 1280 WasmLPadToIndexMap[LPad] = Index; 1281 } 1282 1283 /// Returns true if the landing pad has an associate index in wasm EH. 1284 bool hasWasmLandingPadIndex(const MachineBasicBlock *LPad) const { 1285 return WasmLPadToIndexMap.count(LPad); 1286 } 1287 1288 /// Get the index in wasm EH for a given landing pad. 1289 unsigned getWasmLandingPadIndex(const MachineBasicBlock *LPad) const { 1290 assert(hasWasmLandingPadIndex(LPad)); 1291 return WasmLPadToIndexMap.lookup(LPad); 1292 } 1293 1294 bool hasAnyCallSiteLandingPad() const { 1295 return !LPadToCallSiteMap.empty(); 1296 } 1297 1298 /// Get the call site indexes for a landing pad EH symbol. 1299 SmallVectorImpl<unsigned> &getCallSiteLandingPad(MCSymbol *Sym) { 1300 assert(hasCallSiteLandingPad(Sym) && 1301 "missing call site number for landing pad!"); 1302 return LPadToCallSiteMap[Sym]; 1303 } 1304 1305 /// Return true if the landing pad Eh symbol has an associated call site. 1306 bool hasCallSiteLandingPad(MCSymbol *Sym) { 1307 return !LPadToCallSiteMap[Sym].empty(); 1308 } 1309 1310 bool hasAnyCallSiteLabel() const { 1311 return !CallSiteMap.empty(); 1312 } 1313 1314 /// Map the begin label for a call site. 1315 void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site) { 1316 CallSiteMap[BeginLabel] = Site; 1317 } 1318 1319 /// Get the call site number for a begin label. 1320 unsigned getCallSiteBeginLabel(MCSymbol *BeginLabel) const { 1321 assert(hasCallSiteBeginLabel(BeginLabel) && 1322 "Missing call site number for EH_LABEL!"); 1323 return CallSiteMap.lookup(BeginLabel); 1324 } 1325 1326 /// Return true if the begin label has a call site number associated with it. 1327 bool hasCallSiteBeginLabel(MCSymbol *BeginLabel) const { 1328 return CallSiteMap.count(BeginLabel); 1329 } 1330 1331 /// Record annotations associated with a particular label. 1332 void addCodeViewAnnotation(MCSymbol *Label, MDNode *MD) { 1333 CodeViewAnnotations.push_back({Label, MD}); 1334 } 1335 1336 ArrayRef<std::pair<MCSymbol *, MDNode *>> getCodeViewAnnotations() const { 1337 return CodeViewAnnotations; 1338 } 1339 1340 /// Return a reference to the C++ typeinfo for the current function. 1341 const std::vector<const GlobalValue *> &getTypeInfos() const { 1342 return TypeInfos; 1343 } 1344 1345 /// Return a reference to the typeids encoding filters used in the current 1346 /// function. 1347 const std::vector<unsigned> &getFilterIds() const { 1348 return FilterIds; 1349 } 1350 1351 /// \} 1352 1353 /// Collect information used to emit debugging information of a variable in a 1354 /// stack slot. 1355 void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, 1356 int Slot, const DILocation *Loc) { 1357 VariableDbgInfos.emplace_back(Var, Expr, Slot, Loc); 1358 } 1359 1360 /// Collect information used to emit debugging information of a variable in 1361 /// the entry value of a register. 1362 void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, 1363 MCRegister Reg, const DILocation *Loc) { 1364 VariableDbgInfos.emplace_back(Var, Expr, Reg, Loc); 1365 } 1366 1367 VariableDbgInfoMapTy &getVariableDbgInfo() { return VariableDbgInfos; } 1368 const VariableDbgInfoMapTy &getVariableDbgInfo() const { 1369 return VariableDbgInfos; 1370 } 1371 1372 /// Returns the collection of variables for which we have debug info and that 1373 /// have been assigned a stack slot. 1374 auto getInStackSlotVariableDbgInfo() { 1375 return make_filter_range(getVariableDbgInfo(), [](auto &VarInfo) { 1376 return VarInfo.inStackSlot(); 1377 }); 1378 } 1379 1380 /// Returns the collection of variables for which we have debug info and that 1381 /// have been assigned a stack slot. 1382 auto getInStackSlotVariableDbgInfo() const { 1383 return make_filter_range(getVariableDbgInfo(), [](const auto &VarInfo) { 1384 return VarInfo.inStackSlot(); 1385 }); 1386 } 1387 1388 /// Returns the collection of variables for which we have debug info and that 1389 /// have been assigned an entry value register. 1390 auto getEntryValueVariableDbgInfo() const { 1391 return make_filter_range(getVariableDbgInfo(), [](const auto &VarInfo) { 1392 return VarInfo.inEntryValueRegister(); 1393 }); 1394 } 1395 1396 /// Start tracking the arguments passed to the call \p CallI. 1397 void addCallSiteInfo(const MachineInstr *CallI, CallSiteInfo &&CallInfo) { 1398 assert(CallI->isCandidateForAdditionalCallInfo()); 1399 bool Inserted = 1400 CallSitesInfo.try_emplace(CallI, std::move(CallInfo)).second; 1401 (void)Inserted; 1402 assert(Inserted && "Call site info not unique"); 1403 } 1404 1405 const CallSiteInfoMap &getCallSitesInfo() const { 1406 return CallSitesInfo; 1407 } 1408 1409 /// Following functions update call site info. They should be called before 1410 /// removing, replacing or copying call instruction. 1411 1412 /// Erase the call site info for \p MI. It is used to remove a call 1413 /// instruction from the instruction stream. 1414 void eraseAdditionalCallInfo(const MachineInstr *MI); 1415 /// Copy the call site info from \p Old to \ New. Its usage is when we are 1416 /// making a copy of the instruction that will be inserted at different point 1417 /// of the instruction stream. 1418 void copyAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New); 1419 1420 /// Move the call site info from \p Old to \New call site info. This function 1421 /// is used when we are replacing one call instruction with another one to 1422 /// the same callee. 1423 void moveAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New); 1424 1425 unsigned getNewDebugInstrNum() { 1426 return ++DebugInstrNumberingCount; 1427 } 1428 }; 1429 1430 //===--------------------------------------------------------------------===// 1431 // GraphTraits specializations for function basic block graphs (CFGs) 1432 //===--------------------------------------------------------------------===// 1433 1434 // Provide specializations of GraphTraits to be able to treat a 1435 // machine function as a graph of machine basic blocks... these are 1436 // the same as the machine basic block iterators, except that the root 1437 // node is implicitly the first node of the function. 1438 // 1439 template <> struct GraphTraits<MachineFunction*> : 1440 public GraphTraits<MachineBasicBlock*> { 1441 static NodeRef getEntryNode(MachineFunction *F) { return &F->front(); } 1442 1443 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph 1444 using nodes_iterator = pointer_iterator<MachineFunction::iterator>; 1445 1446 static nodes_iterator nodes_begin(MachineFunction *F) { 1447 return nodes_iterator(F->begin()); 1448 } 1449 1450 static nodes_iterator nodes_end(MachineFunction *F) { 1451 return nodes_iterator(F->end()); 1452 } 1453 1454 static unsigned size (MachineFunction *F) { return F->size(); } 1455 1456 static unsigned getMaxNumber(MachineFunction *F) { 1457 return F->getNumBlockIDs(); 1458 } 1459 static unsigned getNumberEpoch(MachineFunction *F) { 1460 return F->getBlockNumberEpoch(); 1461 } 1462 }; 1463 template <> struct GraphTraits<const MachineFunction*> : 1464 public GraphTraits<const MachineBasicBlock*> { 1465 static NodeRef getEntryNode(const MachineFunction *F) { return &F->front(); } 1466 1467 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph 1468 using nodes_iterator = pointer_iterator<MachineFunction::const_iterator>; 1469 1470 static nodes_iterator nodes_begin(const MachineFunction *F) { 1471 return nodes_iterator(F->begin()); 1472 } 1473 1474 static nodes_iterator nodes_end (const MachineFunction *F) { 1475 return nodes_iterator(F->end()); 1476 } 1477 1478 static unsigned size (const MachineFunction *F) { 1479 return F->size(); 1480 } 1481 1482 static unsigned getMaxNumber(const MachineFunction *F) { 1483 return F->getNumBlockIDs(); 1484 } 1485 static unsigned getNumberEpoch(const MachineFunction *F) { 1486 return F->getBlockNumberEpoch(); 1487 } 1488 }; 1489 1490 // Provide specializations of GraphTraits to be able to treat a function as a 1491 // graph of basic blocks... and to walk it in inverse order. Inverse order for 1492 // a function is considered to be when traversing the predecessor edges of a BB 1493 // instead of the successor edges. 1494 // 1495 template <> struct GraphTraits<Inverse<MachineFunction*>> : 1496 public GraphTraits<Inverse<MachineBasicBlock*>> { 1497 static NodeRef getEntryNode(Inverse<MachineFunction *> G) { 1498 return &G.Graph->front(); 1499 } 1500 1501 static unsigned getMaxNumber(MachineFunction *F) { 1502 return F->getNumBlockIDs(); 1503 } 1504 static unsigned getNumberEpoch(MachineFunction *F) { 1505 return F->getBlockNumberEpoch(); 1506 } 1507 }; 1508 template <> struct GraphTraits<Inverse<const MachineFunction*>> : 1509 public GraphTraits<Inverse<const MachineBasicBlock*>> { 1510 static NodeRef getEntryNode(Inverse<const MachineFunction *> G) { 1511 return &G.Graph->front(); 1512 } 1513 1514 static unsigned getMaxNumber(const MachineFunction *F) { 1515 return F->getNumBlockIDs(); 1516 } 1517 static unsigned getNumberEpoch(const MachineFunction *F) { 1518 return F->getBlockNumberEpoch(); 1519 } 1520 }; 1521 1522 void verifyMachineFunction(const std::string &Banner, 1523 const MachineFunction &MF); 1524 1525 } // end namespace llvm 1526 1527 #endif // LLVM_CODEGEN_MACHINEFUNCTION_H 1528