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