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