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