LLVM 24.0.0git
MachineFunction.cpp
Go to the documentation of this file.
1//===- MachineFunction.cpp ------------------------------------------------===//
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 information for a function. This allows
10// target-specific information about the generated code to be stored with each
11// function.
12//
13//===----------------------------------------------------------------------===//
14
16#include "llvm/ADT/BitVector.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/Twine.h"
43#include "llvm/Config/llvm-config.h"
44#include "llvm/IR/Attributes.h"
45#include "llvm/IR/BasicBlock.h"
46#include "llvm/IR/Constant.h"
47#include "llvm/IR/DataLayout.h"
50#include "llvm/IR/Function.h"
51#include "llvm/IR/GlobalValue.h"
52#include "llvm/IR/Instruction.h"
54#include "llvm/IR/Metadata.h"
55#include "llvm/IR/Module.h"
57#include "llvm/IR/Value.h"
58#include "llvm/MC/MCContext.h"
59#include "llvm/MC/MCSymbol.h"
60#include "llvm/MC/SectionKind.h"
70#include <algorithm>
71#include <cassert>
72#include <cstddef>
73#include <cstdint>
74#include <iterator>
75#include <string>
76#include <utility>
77#include <vector>
78
80
81using namespace llvm;
82
83#define DEBUG_TYPE "codegen"
84
86 "align-all-functions",
87 cl::desc("Force the alignment of all functions in log2 format (e.g. 4 "
88 "means align on 16B boundaries)."),
90
93
94 // clang-format off
95 switch(Prop) {
96 case P::FailedISel: return "FailedISel";
97 case P::IsSSA: return "IsSSA";
98 case P::Legalized: return "Legalized";
99 case P::NoPHIs: return "NoPHIs";
100 case P::NoVRegs: return "NoVRegs";
101 case P::RegBankSelected: return "RegBankSelected";
102 case P::Selected: return "Selected";
103 case P::TracksLiveness: return "TracksLiveness";
104 case P::TiedOpsRewritten: return "TiedOpsRewritten";
105 case P::FailsVerification: return "FailsVerification";
106 case P::FailedRegAlloc: return "FailedRegAlloc";
107 case P::TracksDebugUserValues: return "TracksDebugUserValues";
108 }
109 // clang-format on
110 llvm_unreachable("Invalid machine function property");
111}
112
114 if (!F.hasFnAttribute(Attribute::SafeStack))
115 return;
116
117 auto *Existing =
118 dyn_cast_or_null<MDTuple>(F.getMetadata(LLVMContext::MD_annotation));
119
120 if (!Existing || Existing->getNumOperands() != 2)
121 return;
122
123 auto *MetadataName = "unsafe-stack-size";
124 if (auto &N = Existing->getOperand(0)) {
125 if (N.equalsStr(MetadataName)) {
126 if (auto &Op = Existing->getOperand(1)) {
127 auto Val = mdconst::extract<ConstantInt>(Op)->getZExtValue();
128 FrameInfo.setUnsafeStackSize(Val);
129 }
130 }
131 }
132}
133
134// Pin the vtable to this file.
135void MachineFunction::Delegate::anchor() {}
136
138 const char *Separator = "";
139 for (BitVector::size_type I = 0; I < Properties.size(); ++I) {
140 if (!Properties[I])
141 continue;
142 OS << Separator << getPropertyName(static_cast<Property>(I));
143 Separator = ", ";
144 }
145}
146
147//===----------------------------------------------------------------------===//
148// MachineFunction implementation
149//===----------------------------------------------------------------------===//
150
151// Out-of-line virtual method.
153
155 MBB->getParent()->deleteMachineBasicBlock(MBB);
156}
157
159 const Function &F) {
160 if (auto MA = F.getFnStackAlign())
161 return *MA;
162 return STI.getFrameLowering()->getStackAlign();
163}
164
166 Attribute FPAttr = F.getFnAttribute("frame-pointer");
167 if (!FPAttr.isValid())
169
170 StringRef FP = FPAttr.getValueAsString();
173 .Case("non-leaf", FramePointerKind::NonLeaf)
174 .Case("non-leaf-no-reserve", FramePointerKind::NonLeafNoReserve)
175 .Case("reserved", FramePointerKind::Reserved)
178}
179
181 const TargetSubtargetInfo &STI, MCContext &Ctx,
182 unsigned FunctionNum)
183 : F(F), Target(Target), STI(STI), Ctx(Ctx) {
184 FunctionNumber = FunctionNum;
185 init();
186}
187
188void MachineFunction::handleInsertion(MachineInstr &MI) {
189 if (TheDelegate)
190 TheDelegate->MF_HandleInsertion(MI);
191}
192
193void MachineFunction::handleRemoval(MachineInstr &MI) {
194 if (TheDelegate)
195 TheDelegate->MF_HandleRemoval(MI);
196}
197
199 const MCInstrDesc &TID) {
200 if (TheDelegate)
201 TheDelegate->MF_HandleChangeDesc(MI, TID);
202}
203
204void MachineFunction::init() {
205 // Assume the function starts in SSA form with correct liveness.
206 Properties.setIsSSA();
207 Properties.setTracksLiveness();
208 RegInfo = new (Allocator) MachineRegisterInfo(this);
209
210 MFInfo = nullptr;
211
212 // We can realign the stack if the target supports it and the user hasn't
213 // explicitly asked us not to.
214 bool CanRealignSP = STI.getFrameLowering()->isStackRealignable() &&
215 !F.hasFnAttribute("no-realign-stack");
216 bool ForceRealignSP = F.hasFnAttribute(Attribute::StackAlignment) ||
217 F.hasFnAttribute("stackrealign");
218 FrameInfo = new (Allocator) MachineFrameInfo(
219 getFnStackAlignment(STI, F), /*StackRealignable=*/CanRealignSP,
220 /*ForcedRealign=*/ForceRealignSP && CanRealignSP);
222
223 setUnsafeStackSize(F, *FrameInfo);
224
225 if (F.hasFnAttribute(Attribute::StackAlignment))
226 FrameInfo->ensureMaxAlignment(*F.getFnStackAlign());
227
229 Alignment = STI.getTargetLowering()->getMinFunctionAlignment();
230
231 // -fsanitize=function and -fsanitize=kcfi instrument indirect function calls
232 // to load a type hash before the function label. Ensure functions are aligned
233 // by a least 4 to avoid unaligned access, which is especially important for
234 // -mno-unaligned-access.
235 if (F.hasMetadata(LLVMContext::MD_func_sanitize) ||
236 F.getMetadata(LLVMContext::MD_kcfi_type))
237 Alignment = std::max(Alignment, Align(4));
238
240 Alignment = Align(1ULL << AlignAllFunctions);
241
242 JumpTableInfo = nullptr;
243
245 F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
246 WinEHInfo = new (Allocator) WinEHFuncInfo();
247 }
248
249 if (!Target.isCompatibleDataLayout(getDataLayout())) {
251 formatv("Can't create a MachineFunction using a Module with a "
252 "Target-incompatible DataLayout attached\n Target "
253 "DataLayout: {0}\n Module DataLayout: {1}\n",
254 Target.createDataLayout().getStringRepresentation(),
255 getDataLayout().getStringRepresentation()));
256 }
257
258 PSVManager = std::make_unique<PseudoSourceValueManager>(getTarget());
259}
260
262 const TargetSubtargetInfo &STI) {
263 assert(!MFInfo && "MachineFunctionInfo already set");
264 MFInfo = Target.createMachineFunctionInfo(Allocator, F, &STI);
265}
266
268 const MachineFunction &OrigMF,
270 assert(!MFInfo && "new function already has MachineFunctionInfo");
271 if (!OrigMF.MFInfo)
272 return nullptr;
273
274 MachineFunctionInfo *ClonedInfo =
275 OrigMF.MFInfo->clone(Allocator, *this, Src2DstMBB);
276 if (!ClonedInfo)
277 return nullptr;
278
279 RegInfo->copyPendingVirtRegMapEntriesFrom(OrigMF.getRegInfo());
280 return ClonedInfo;
281}
282
286
287void MachineFunction::clear() {
288 Properties.reset();
289
290 // Clear JumpTableInfo first. Otherwise, every MBB we delete would do a
291 // linear search over the jump table entries to find and erase itself.
292 if (JumpTableInfo) {
293 JumpTableInfo->~MachineJumpTableInfo();
294 Allocator.Deallocate(JumpTableInfo);
295 JumpTableInfo = nullptr;
296 }
297
298 // Don't call destructors on MachineInstr and MachineOperand. All of their
299 // memory comes from the BumpPtrAllocator which is about to be purged.
300 //
301 // Do call MachineBasicBlock destructors, it contains std::vectors.
302 for (iterator I = begin(), E = end(); I != E; I = BasicBlocks.erase(I))
303 I->Insts.clearAndLeakNodesUnsafely();
304 MBBNumbering.clear();
305
306 InstructionRecycler.clear(Allocator);
307 OperandRecycler.clear(Allocator);
308 BasicBlockRecycler.clear(Allocator);
309 CodeViewAnnotations.clear();
311 if (RegInfo) {
312 RegInfo->~MachineRegisterInfo();
313 Allocator.Deallocate(RegInfo);
314 }
315 if (MFInfo) {
316 MFInfo->~MachineFunctionInfo();
317 Allocator.Deallocate(MFInfo);
318 }
319
320 FrameInfo->~MachineFrameInfo();
321 Allocator.Deallocate(FrameInfo);
322
323 ConstantPool->~MachineConstantPool();
324 Allocator.Deallocate(ConstantPool);
325
326 if (WinEHInfo) {
327 WinEHInfo->~WinEHFuncInfo();
328 Allocator.Deallocate(WinEHInfo);
329 }
330}
331
333 return F.getDataLayout();
334}
335
336/// Get the JumpTableInfo for this function.
337/// If it does not already exist, allocate one.
339getOrCreateJumpTableInfo(unsigned EntryKind) {
340 if (JumpTableInfo) return JumpTableInfo;
341
342 JumpTableInfo = new (Allocator)
344 return JumpTableInfo;
345}
346
348 return F.getDenormalMode(FPType);
349}
350
351/// Should we be emitting segmented stack stuff for the function
353 return getFunction().hasFnAttribute("split-stack");
354}
355
357 Align PrefAlignment;
358
359 if (MaybeAlign A = F.getPreferredAlignment())
360 PrefAlignment = *A;
361 else if (!F.hasOptSize())
362 PrefAlignment = STI.getTargetLowering()->getPrefFunctionAlignment();
363 else
364 PrefAlignment = Align(1);
365
366 return std::max(PrefAlignment, getAlignment());
367}
368
369[[nodiscard]] unsigned
371 FrameInstructions.push_back(Inst);
372 return FrameInstructions.size() - 1;
373}
374
376 MCRegister ToReg) {
377 const MCRegisterInfo *MCRI = Ctx.getRegisterInfo();
378 unsigned DwarfFromReg = MCRI->getDwarfRegNum(FromReg, false);
379 unsigned DwarfToReg = MCRI->getDwarfRegNum(ToReg, false);
380
381 for (MCCFIInstruction &Inst : FrameInstructions)
382 Inst.replaceRegister(DwarfFromReg, DwarfToReg);
383}
384
385/// This discards all of the MachineBasicBlock numbers and recomputes them.
386/// This guarantees that the MBB numbers are sequential, dense, and match the
387/// ordering of the blocks within the function. If a specific MachineBasicBlock
388/// is specified, only that block and those after it are renumbered.
390 if (empty()) { MBBNumbering.clear(); return; }
392 if (MBB == nullptr)
393 MBBI = begin();
394 else
395 MBBI = MBB->getIterator();
396
397 // Figure out the block number this should have.
398 unsigned BlockNo = 0;
399 if (MBBI != begin())
400 BlockNo = std::prev(MBBI)->getNumber() + 1;
401
402 for (; MBBI != E; ++MBBI, ++BlockNo) {
403 if (MBBI->getNumber() != (int)BlockNo) {
404 // Remove use of the old number.
405 if (MBBI->getNumber() != -1) {
406 assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
407 "MBB number mismatch!");
408 MBBNumbering[MBBI->getNumber()] = nullptr;
409 }
410
411 // If BlockNo is already taken, set that block's number to -1.
412 if (MBBNumbering[BlockNo])
413 MBBNumbering[BlockNo]->setNumber(-1);
414
415 MBBNumbering[BlockNo] = &*MBBI;
416 MBBI->setNumber(BlockNo);
417 }
418 }
419
420 // Okay, all the blocks are renumbered. If we have compactified the block
421 // numbering, shrink MBBNumbering now.
422 assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
423 MBBNumbering.resize(BlockNo);
424}
425
428 const Align FunctionAlignment = getAlignment();
430 /// Offset - Distance from the beginning of the function to the end
431 /// of the basic block.
432 int64_t Offset = 0;
433
434 for (; MBBI != E; ++MBBI) {
435 const Align Alignment = MBBI->getAlignment();
436 int64_t BlockSize = 0;
437
438 for (auto &MI : *MBBI) {
439 BlockSize += TII.getInstSizeInBytes(MI);
440 }
441
442 int64_t OffsetBB;
443 if (Alignment <= FunctionAlignment) {
444 OffsetBB = alignTo(Offset, Alignment);
445 } else {
446 // The alignment of this MBB is larger than the function's alignment, so
447 // we can't tell whether or not it will insert nops. Assume that it will.
448 OffsetBB = alignTo(Offset, Alignment) + Alignment.value() -
449 FunctionAlignment.value();
450 }
451 Offset = OffsetBB + BlockSize;
452 }
453
454 return Offset;
455}
456
457/// This method iterates over the basic blocks and assigns their IsBeginSection
458/// and IsEndSection fields. This must be called after MBB layout is finalized
459/// and the SectionID's are assigned to MBBs.
462 auto CurrentSectionID = front().getSectionID();
463 for (auto MBBI = std::next(begin()), E = end(); MBBI != E; ++MBBI) {
464 if (MBBI->getSectionID() == CurrentSectionID)
465 continue;
466 MBBI->setIsBeginSection();
467 std::prev(MBBI)->setIsEndSection();
468 CurrentSectionID = MBBI->getSectionID();
469 }
471}
472
473/// Allocate a new MachineInstr. Use this instead of `new MachineInstr'.
474MachineInstr *MachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
475 DebugLoc DL,
476 bool NoImplicit) {
477 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
478 MachineInstr(*this, MCID, std::move(DL), NoImplicit);
479}
480
481/// Create a new MachineInstr which is a copy of the 'Orig' instruction,
482/// identical in all ways except the instruction has no parent, prev, or next.
484MachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
485 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
486 MachineInstr(*this, *Orig);
487}
488
489MachineInstr &MachineFunction::cloneMachineInstrBundle(
491 const MachineInstr &Orig) {
492 MachineInstr *FirstClone = nullptr;
494 while (true) {
495 MachineInstr *Cloned = CloneMachineInstr(&*I);
496 MBB.insert(InsertBefore, Cloned);
497 if (FirstClone == nullptr) {
498 FirstClone = Cloned;
499 } else {
500 Cloned->bundleWithPred();
501 }
502
503 if (!I->isBundledWithSucc())
504 break;
505 ++I;
506 }
507 // Copy over call info to the cloned instruction if needed. If Orig is in
508 // a bundle, copyAdditionalCallInfo takes care of finding the call instruction
509 // in the bundle.
511 copyAdditionalCallInfo(&Orig, FirstClone);
512 return *FirstClone;
513}
514
515/// Delete the given MachineInstr.
516///
517/// This function also serves as the MachineInstr destructor - the real
518/// ~MachineInstr() destructor must be empty.
519void MachineFunction::deleteMachineInstr(MachineInstr *MI) {
520 // Verify that a call site info is at valid state. This assertion should
521 // be triggered during the implementation of support for the
522 // call site info of a new architecture. If the assertion is triggered,
523 // back trace will tell where to insert a call to updateCallSiteInfo().
524 assert((!MI->isCandidateForAdditionalCallInfo() ||
525 !CallSitesInfo.contains(MI)) &&
526 "Call site info was not updated!");
527 // Verify that the "called globals" info is in a valid state.
528 assert((!MI->isCandidateForAdditionalCallInfo() ||
529 !CalledGlobalsInfo.contains(MI)) &&
530 "Called globals info was not updated!");
531 // Strip it for parts. The operand array and the MI object itself are
532 // independently recyclable.
533 if (MI->Operands)
534 deallocateOperandArray(MI->CapOperands, MI->Operands);
535 // Don't call ~MachineInstr() which must be trivial anyway because
536 // ~MachineFunction drops whole lists of MachineInstrs wihout calling their
537 // destructors.
538 InstructionRecycler.Deallocate(Allocator, MI);
539}
540
541/// Allocate a new MachineBasicBlock. Use this instead of
542/// `new MachineBasicBlock'.
545 std::optional<UniqueBBID> BBID) {
547 new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
548 MachineBasicBlock(*this, BB);
549 // Set BBID for `-basic-block-sections=list` and `-basic-block-address-map` to
550 // allow robust mapping of profiles to basic blocks.
551 if (Target.Options.BBAddrMap ||
552 Target.getBBSectionsType() == BasicBlockSection::List)
553 MBB->setBBID(BBID.has_value() ? *BBID : UniqueBBID{NextBBID++, 0});
554 return MBB;
555}
556
557/// Delete the given MachineBasicBlock.
559 assert(MBB->getParent() == this && "MBB parent mismatch!");
560 // Clean up any references to MBB in jump tables before deleting it.
561 if (JumpTableInfo)
562 JumpTableInfo->RemoveMBBFromJumpTables(MBB);
563 MBB->~MachineBasicBlock();
564 BasicBlockRecycler.Deallocate(Allocator, MBB);
565}
566
569 Align BaseAlignment, const MMOMetadata &Metadata, SyncScope::ID SSID,
570 AtomicOrdering Ordering, AtomicOrdering FailureOrdering) {
571 assert((!Size.hasValue() ||
572 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
573 "Unexpected an unknown size to be represented using "
574 "LocationSize::beforeOrAfter()");
575 return new (Allocator)
576 MachineMemOperand(PtrInfo, F, Size, BaseAlignment, Metadata, SSID,
577 Ordering, FailureOrdering);
578}
579
582 Align BaseAlignment, const MMOMetadata &Metadata, SyncScope::ID SSID,
583 AtomicOrdering Ordering, AtomicOrdering FailureOrdering) {
584 return new (Allocator)
585 MachineMemOperand(PtrInfo, F, MemTy, BaseAlignment, Metadata, SSID,
586 Ordering, FailureOrdering);
587}
588
591 const MachinePointerInfo &PtrInfo,
593 assert((!Size.hasValue() ||
594 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
595 "Unexpected an unknown size to be represented using "
596 "LocationSize::beforeOrAfter()");
597 return new (Allocator) MachineMemOperand(
598 PtrInfo, MMO->getFlags(), Size, MMO->getBaseAlign(),
599 MMOMetadata(AAMDNodes(), /*Ranges=*/nullptr, MMO->getMemCacheHint()),
600 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
601 MMO->getFailureOrdering());
602}
603
605 const MachineMemOperand *MMO, const MachinePointerInfo &PtrInfo, LLT Ty) {
606 return new (Allocator) MachineMemOperand(
607 PtrInfo, MMO->getFlags(), Ty, MMO->getBaseAlign(),
608 MMOMetadata(AAMDNodes(), /*Ranges=*/nullptr, MMO->getMemCacheHint()),
609 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
610 MMO->getFailureOrdering());
611}
612
615 int64_t Offset, LLT Ty) {
616 const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
617
618 // If there is no pointer value, the offset isn't tracked so we need to adjust
619 // the base alignment.
620 Align Alignment = PtrInfo.V.isNull()
622 : MMO->getBaseAlign();
623
624 // Do not preserve ranges, since we don't necessarily know what the high bits
625 // are anymore.
626 return new (Allocator) MachineMemOperand(
627 PtrInfo.getWithOffset(Offset), MMO->getFlags(), Ty, Alignment,
628 MMOMetadata(MMO->getAAInfo(), /*Ranges=*/nullptr, MMO->getMemCacheHint()),
629 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
630 MMO->getFailureOrdering());
631}
632
635 const AAMDNodes &AAInfo) {
636 MachinePointerInfo MPI = MMO->getValue() ?
637 MachinePointerInfo(MMO->getValue(), MMO->getOffset()) :
639
640 return new (Allocator) MachineMemOperand(
641 MPI, MMO->getFlags(), MMO->getSize(), MMO->getBaseAlign(),
642 MMOMetadata(AAInfo, MMO->getRanges(), MMO->getMemCacheHint()),
643 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
644 MMO->getFailureOrdering());
645}
646
650 return new (Allocator) MachineMemOperand(
651 MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlign(),
652 MMOMetadata(MMO->getAAInfo(), MMO->getRanges(), MMO->getMemCacheHint()),
653 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
654 MMO->getFailureOrdering());
655}
656
657MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
658 ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
659 MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker, MDNode *PCSections,
660 uint32_t CFIType, MDNode *MMRAs, Value *DS) {
661 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
662 PostInstrSymbol, HeapAllocMarker,
663 PCSections, CFIType, MMRAs, DS);
664}
665
667 char *Dest = Allocator.Allocate<char>(Name.size() + 1);
668 llvm::copy(Name, Dest);
669 Dest[Name.size()] = 0;
670 return Dest;
671}
672
674 unsigned NumRegs = getSubtarget().getRegisterInfo()->getNumRegs();
675 unsigned Size = MachineOperand::getRegMaskSize(NumRegs);
676 uint32_t *Mask = Allocator.Allocate<uint32_t>(Size);
677 memset(Mask, 0, Size * sizeof(Mask[0]));
678 return Mask;
679}
680
682 int* AllocMask = Allocator.Allocate<int>(Mask.size());
683 copy(Mask, AllocMask);
684 return {AllocMask, Mask.size()};
685}
686
687#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
691#endif
692
696
697void MachineFunction::print(raw_ostream &OS, const SlotIndexes *Indexes) const {
698 OS << "# Machine code for function " << getName() << ": ";
699 getProperties().print(OS);
700 OS << '\n';
701
702 // Print Frame Information
703 FrameInfo->print(*this, OS);
704
705 // Print JumpTable Information
706 if (JumpTableInfo)
707 JumpTableInfo->print(OS);
708
709 // Print Constant Pool
710 ConstantPool->print(OS);
711
713
714 if (RegInfo && !RegInfo->livein_empty()) {
715 OS << "Function Live Ins: ";
717 I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
718 OS << printReg(I->first, TRI);
719 if (I->second)
720 OS << " in " << printReg(I->second, TRI);
721 if (std::next(I) != E)
722 OS << ", ";
723 }
724 OS << '\n';
725 }
726
729 for (const auto &BB : *this) {
730 OS << '\n';
731 // If we print the whole function, print it at its most verbose level.
732 BB.print(OS, MST, Indexes, /*IsStandalone=*/true);
733 }
734
735 OS << "\n# End machine code for function " << getName() << ".\n\n";
736}
737
738/// True if this function needs frame moves for debug or exceptions.
740 // TODO: Ideally, what we'd like is to have a switch that allows emitting
741 // synchronous (precise at call-sites only) CFA into .eh_frame. However, even
742 // under this switch, we'd like .debug_frame to be precise when using -g. At
743 // this moment, there's no way to specify that some CFI directives go into
744 // .eh_frame only, while others go into .debug_frame only.
746 F.needsUnwindTableEntry() ||
747 !F.getParent()->debug_compile_units().empty();
748}
749
752 switch (FP) {
754 return true;
757 return getFrameInfo().hasCalls();
760 return false;
761 }
762 llvm_unreachable("unknown frame pointer flag");
763}
764
767 switch (FP) {
771 return true;
773 return getFrameInfo().hasCalls();
775 return false;
776 }
777 llvm_unreachable("unknown frame pointer flag");
778}
779
781 if (MDNode *Node = CB.getMetadata(llvm::LLVMContext::MD_call_target))
783
784 // Numeric callee_type ids are only for indirect calls.
785 if (!CB.isIndirectCall())
786 return;
787
788 MDNode *CalleeTypeList = CB.getMetadata(LLVMContext::MD_callee_type);
789 if (!CalleeTypeList)
790 return;
791
792 for (const MDOperand &Op : CalleeTypeList->operands()) {
793 MDNode *TypeMD = cast<MDNode>(Op);
794 MDString *TypeIdStr = cast<MDString>(TypeMD->getOperand(0));
795 // Compute numeric type id from type id string
796 uint64_t TypeIdVal = MD5Hash(TypeIdStr->getString());
797 IntegerType *Int64Ty = Type::getInt64Ty(CB.getContext());
798 CalleeTypeIds.push_back(
799 ConstantInt::get(Int64Ty, TypeIdVal, /*IsSigned=*/false));
800 }
801}
802
803template <>
805 : public DefaultDOTGraphTraits {
807
808 static std::string getGraphName(const MachineFunction *F) {
809 return ("CFG for '" + F->getName() + "' function").str();
810 }
811
813 const MachineFunction *Graph) {
814 std::string OutStr;
815 {
816 raw_string_ostream OSS(OutStr);
817
818 if (isSimple()) {
819 OSS << printMBBReference(*Node);
820 if (const BasicBlock *BB = Node->getBasicBlock())
821 OSS << ": " << BB->getName();
822 } else
823 Node->print(OSS);
824 }
825
826 if (OutStr[0] == '\n')
827 OutStr.erase(OutStr.begin());
828
829 // Process string output to make it nicer...
830 for (unsigned i = 0; i != OutStr.length(); ++i)
831 if (OutStr[i] == '\n') { // Left justify
832 OutStr[i] = '\\';
833 OutStr.insert(OutStr.begin() + i + 1, 'l');
834 }
835 return OutStr;
836 }
837};
838
840{
841#ifndef NDEBUG
842 ViewGraph(this, "mf" + getName());
843#else
844 errs() << "MachineFunction::viewCFG is only available in debug builds on "
845 << "systems with Graphviz or gv!\n";
846#endif // NDEBUG
847}
848
850{
851#ifndef NDEBUG
852 ViewGraph(this, "mf" + getName(), true);
853#else
854 errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
855 << "systems with Graphviz or gv!\n";
856#endif // NDEBUG
857}
858
859/// Add the specified physical register as a live-in value and
860/// create a corresponding virtual register for it.
862 const TargetRegisterClass *RC) {
864 Register VReg = MRI.getLiveInVirtReg(PReg);
865 if (VReg) {
866 const TargetRegisterClass *VRegRC = MRI.getRegClass(VReg);
867 (void)VRegRC;
868 // A physical register can be added several times.
869 // Between two calls, the register class of the related virtual register
870 // may have been constrained to match some operation constraints.
871 // In that case, check that the current register class includes the
872 // physical register and is a sub class of the specified RC.
873 assert((VRegRC == RC || (VRegRC->contains(PReg) &&
874 RC->hasSubClassEq(VRegRC))) &&
875 "Register class mismatch!");
876 return VReg;
877 }
878 VReg = MRI.createVirtualRegister(RC);
879 MRI.addLiveIn(PReg, VReg);
880 return VReg;
881}
882
883/// Return the MCSymbol for the specified non-empty jump table.
884/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
885/// normal 'L' label is returned.
887 bool isLinkerPrivate) const {
888 const DataLayout &DL = getDataLayout();
889 assert(JumpTableInfo && "No jump tables");
890 assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
891
892 StringRef Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
893 : DL.getInternalSymbolPrefix();
894 SmallString<60> Name;
896 << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
897 return Ctx.getOrCreateSymbol(Name);
898}
899
900/// Return a function-local symbol to represent the PIC base.
902 const DataLayout &DL = getDataLayout();
903 return Ctx.getOrCreateSymbol(Twine(DL.getInternalSymbolPrefix()) +
904 Twine(getFunctionNumber()) + "$pb");
905}
906
907/// \name Exception Handling
908/// \{
909
912 unsigned N = LandingPads.size();
913 for (unsigned i = 0; i < N; ++i) {
914 LandingPadInfo &LP = LandingPads[i];
915 if (LP.LandingPadBlock == LandingPad)
916 return LP;
917 }
918
919 LandingPads.push_back(LandingPadInfo(LandingPad));
920 return LandingPads[N];
921}
922
924 MCSymbol *BeginLabel, MCSymbol *EndLabel) {
926 LP.BeginLabels.push_back(BeginLabel);
927 LP.EndLabels.push_back(EndLabel);
928}
929
931 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
933 LP.LandingPadLabel = LandingPadLabel;
934
936 LandingPad->getBasicBlock()->getFirstNonPHIIt();
937 if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
938 // If there's no typeid list specified, then "cleanup" is implicit.
939 // Otherwise, id 0 is reserved for the cleanup action.
940 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
941 LP.TypeIds.push_back(0);
942
943 // FIXME: New EH - Add the clauses in reverse order. This isn't 100%
944 // correct, but we need to do it this way because of how the DWARF EH
945 // emitter processes the clauses.
946 for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
947 Value *Val = LPI->getClause(I - 1);
948 if (LPI->isCatch(I - 1)) {
949 LP.TypeIds.push_back(
951 } else {
952 // Add filters in a list.
953 auto *CVal = cast<Constant>(Val);
954 SmallVector<unsigned, 4> FilterList;
955 for (const Use &U : CVal->operands())
956 FilterList.push_back(
957 getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
958
959 LP.TypeIds.push_back(getFilterIDFor(FilterList));
960 }
961 }
962
963 } else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
964 for (unsigned I = CPI->arg_size(); I != 0; --I) {
965 auto *TypeInfo =
966 dyn_cast<GlobalValue>(CPI->getArgOperand(I - 1)->stripPointerCasts());
967 LP.TypeIds.push_back(getTypeIDFor(TypeInfo));
968 }
969
970 } else {
971 assert(isa<CleanupPadInst>(FirstI) && "Invalid landingpad!");
972 }
973
974 return LandingPadLabel;
975}
976
978 ArrayRef<unsigned> Sites) {
979 LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
980}
981
983 for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i)
984 if (TypeInfos[i] == TI) return i + 1;
985
986 TypeInfos.push_back(TI);
987 return TypeInfos.size();
988}
989
991 // If the new filter coincides with the tail of an existing filter, then
992 // re-use the existing filter. Folding filters more than this requires
993 // re-ordering filters and/or their elements - probably not worth it.
994 for (unsigned i : FilterEnds) {
995 unsigned j = TyIds.size();
996
997 while (i && j)
998 if (FilterIds[--i] != TyIds[--j])
999 goto try_next;
1000
1001 if (!j)
1002 // The new filter coincides with range [i, end) of the existing filter.
1003 return -(1 + i);
1004
1005try_next:;
1006 }
1007
1008 // Add the new filter.
1009 int FilterID = -(1 + FilterIds.size());
1010 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
1011 llvm::append_range(FilterIds, TyIds);
1012 FilterEnds.push_back(FilterIds.size());
1013 FilterIds.push_back(0); // terminator
1014 return FilterID;
1015}
1016
1018MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
1019 assert(MI->isCandidateForAdditionalCallInfo() &&
1020 "Call site info refers only to call (MI) candidates");
1021
1022 if (!Target.Options.EmitCallSiteInfo && !Target.Options.EmitCallGraphSection)
1023 return CallSitesInfo.end();
1024 return CallSitesInfo.find(MI);
1025}
1026
1027/// Return the call machine instruction or find a call within bundle.
1029 if (!MI->isBundle())
1030 return MI;
1031
1032 for (const auto &BMI : make_range(getBundleStart(MI->getIterator()),
1033 getBundleEnd(MI->getIterator())))
1034 if (BMI.isCandidateForAdditionalCallInfo())
1035 return &BMI;
1036
1037 llvm_unreachable("Unexpected bundle without a call site candidate");
1038}
1039
1041 assert(MI->shouldUpdateAdditionalCallInfo() &&
1042 "Call info refers only to call (MI) candidates or "
1043 "candidates inside bundles");
1044
1045 const MachineInstr *CallMI = getCallInstr(MI);
1046
1047 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI);
1048 if (CSIt != CallSitesInfo.end())
1049 CallSitesInfo.erase(CSIt);
1050
1051 CalledGlobalsInfo.erase(CallMI);
1052}
1053
1055 const MachineInstr *New) {
1057 "Call info refers only to call (MI) candidates or "
1058 "candidates inside bundles");
1059
1060 if (!New->isCandidateForAdditionalCallInfo())
1061 return eraseAdditionalCallInfo(Old);
1062
1063 const MachineInstr *OldCallMI = getCallInstr(Old);
1064 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1065 if (CSIt != CallSitesInfo.end()) {
1066 CallSiteInfo CSInfo = CSIt->second;
1067 CallSitesInfo[New] = std::move(CSInfo);
1068 }
1069
1070 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1071 if (CGIt != CalledGlobalsInfo.end()) {
1072 CalledGlobalInfo CGInfo = CGIt->second;
1073 CalledGlobalsInfo[New] = std::move(CGInfo);
1074 }
1075}
1076
1078 const MachineInstr *New) {
1080 "Call info refers only to call (MI) candidates or "
1081 "candidates inside bundles");
1082
1083 if (!New->isCandidateForAdditionalCallInfo())
1084 return eraseAdditionalCallInfo(Old);
1085
1086 const MachineInstr *OldCallMI = getCallInstr(Old);
1087 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1088 if (CSIt != CallSitesInfo.end()) {
1089 CallSiteInfo CSInfo = std::move(CSIt->second);
1090 CallSitesInfo.erase(CSIt);
1091 CallSitesInfo[New] = std::move(CSInfo);
1092 }
1093
1094 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1095 if (CGIt != CalledGlobalsInfo.end()) {
1096 CalledGlobalInfo CGInfo = std::move(CGIt->second);
1097 CalledGlobalsInfo.erase(CGIt);
1098 CalledGlobalsInfo[New] = std::move(CGInfo);
1099 }
1100}
1101
1105
1108 unsigned Subreg) {
1109 // Catch any accidental self-loops.
1110 assert(A.first != B.first);
1111 // Don't allow any substitutions _from_ the memory operand number.
1112 assert(A.second != DebugOperandMemNumber);
1113
1114 DebugValueSubstitutions.push_back({A, B, Subreg});
1115}
1116
1118 MachineInstr &New,
1119 unsigned MaxOperand) {
1120 // If the Old instruction wasn't tracked at all, there is no work to do.
1121 unsigned OldInstrNum = Old.peekDebugInstrNum();
1122 if (!OldInstrNum)
1123 return;
1124
1125 // Iterate over all operands looking for defs to create substitutions for.
1126 // Avoid creating new instr numbers unless we create a new substitution.
1127 // While this has no functional effect, it risks confusing someone reading
1128 // MIR output.
1129 // Examine all the operands, or the first N specified by the caller.
1130 MaxOperand = std::min(MaxOperand, Old.getNumOperands());
1131 for (unsigned int I = 0; I < MaxOperand; ++I) {
1132 const auto &OldMO = Old.getOperand(I);
1133 auto &NewMO = New.getOperand(I);
1134 (void)NewMO;
1135
1136 if (!OldMO.isReg() || !OldMO.isDef())
1137 continue;
1138 assert(NewMO.isDef());
1139
1140 unsigned NewInstrNum = New.getDebugInstrNum();
1141 makeDebugValueSubstitution(std::make_pair(OldInstrNum, I),
1142 std::make_pair(NewInstrNum, I));
1143 }
1144}
1145
1150
1151 // Check whether this copy-like instruction has already been salvaged into
1152 // an operand pair.
1153 Register Dest;
1154 if (auto CopyDstSrc = TII.isCopyLikeInstr(MI)) {
1155 Dest = CopyDstSrc->Destination->getReg();
1156 } else {
1157 assert(MI.isSubregToReg());
1158 Dest = MI.getOperand(0).getReg();
1159 }
1160
1161 auto CacheIt = DbgPHICache.find(Dest);
1162 if (CacheIt != DbgPHICache.end())
1163 return CacheIt->second;
1164
1165 // Calculate the instruction number to use, or install a DBG_PHI.
1166 auto OperandPair = salvageCopySSAImpl(MI);
1167 DbgPHICache.insert({Dest, OperandPair});
1168 return OperandPair;
1169}
1170
1176
1177 // Chase the value read by a copy-like instruction back to the instruction
1178 // that ultimately _defines_ that value. This may pass:
1179 // * Through multiple intermediate copies, including subregister moves /
1180 // copies,
1181 // * Copies from physical registers that must then be traced back to the
1182 // defining instruction,
1183 // * Or, physical registers may be live-in to (only) the entry block, which
1184 // requires a DBG_PHI to be created.
1185 // We can pursue this problem in that order: trace back through copies,
1186 // optionally through a physical register, to a defining instruction. We
1187 // should never move from physreg to vreg. As we're still in SSA form, no need
1188 // to worry about partial definitions of registers.
1189
1190 // Helper lambda to interpret a copy-like instruction. Takes instruction,
1191 // returns the register read and any subregister identifying which part is
1192 // read.
1193 auto GetRegAndSubreg =
1194 [&](const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1195 Register NewReg, OldReg;
1196 unsigned SubReg;
1197 if (Cpy.isCopy()) {
1198 OldReg = Cpy.getOperand(0).getReg();
1199 NewReg = Cpy.getOperand(1).getReg();
1200 SubReg = Cpy.getOperand(1).getSubReg();
1201 } else if (Cpy.isSubregToReg()) {
1202 OldReg = Cpy.getOperand(0).getReg();
1203 NewReg = Cpy.getOperand(1).getReg();
1204 SubReg = Cpy.getOperand(2).getImm();
1205 } else {
1206 auto CopyDetails = *TII.isCopyInstr(Cpy);
1207 const MachineOperand &Src = *CopyDetails.Source;
1208 const MachineOperand &Dest = *CopyDetails.Destination;
1209 OldReg = Dest.getReg();
1210 NewReg = Src.getReg();
1211 SubReg = Src.getSubReg();
1212 }
1213
1214 return {NewReg, SubReg};
1215 };
1216
1217 // First seek either the defining instruction, or a copy from a physreg.
1218 // During search, the current state is the current copy instruction, and which
1219 // register we've read. Accumulate qualifying subregisters into SubregsSeen;
1220 // deal with those later.
1221 auto State = GetRegAndSubreg(MI);
1222 auto CurInst = MI.getIterator();
1223 SmallVector<unsigned, 4> SubregsSeen;
1224 while (true) {
1225 // If we've found a copy from a physreg, first portion of search is over.
1226 if (!State.first.isVirtual())
1227 break;
1228
1229 // Record any subregister qualifier.
1230 if (State.second)
1231 SubregsSeen.push_back(State.second);
1232
1233 MachineInstr *Inst = MRI.getVRegDef(State.first);
1234 assert(Inst && "Virtual register has no def");
1235 CurInst = Inst->getIterator();
1236
1237 // Any non-copy instruction is the defining instruction we're seeking.
1238 if (!Inst->isCopyLike() && !TII.isCopyLikeInstr(*Inst))
1239 break;
1240 State = GetRegAndSubreg(*Inst);
1241 };
1242
1243 // Helper lambda to apply additional subregister substitutions to a known
1244 // instruction/operand pair. Adds new (fake) substitutions so that we can
1245 // record the subregister. FIXME: this isn't very space efficient if multiple
1246 // values are tracked back through the same copies; cache something later.
1247 auto ApplySubregisters =
1249 for (unsigned Subreg : reverse(SubregsSeen)) {
1250 // Fetch a new instruction number, not attached to an actual instruction.
1251 unsigned NewInstrNumber = getNewDebugInstrNum();
1252 // Add a substitution from the "new" number to the known one, with a
1253 // qualifying subreg.
1254 makeDebugValueSubstitution({NewInstrNumber, 0}, P, Subreg);
1255 // Return the new number; to find the underlying value, consumers need to
1256 // deal with the qualifying subreg.
1257 P = {NewInstrNumber, 0};
1258 }
1259 return P;
1260 };
1261
1262 // If we managed to find the defining instruction after COPYs, return an
1263 // instruction / operand pair after adding subregister qualifiers.
1264 if (State.first.isVirtual()) {
1265 // Virtual register def -- we can just look up where this happens.
1266 MachineInstr *Inst = MRI.getVRegDef(State.first);
1267 for (auto &MO : Inst->all_defs()) {
1268 if (MO.getReg() != State.first)
1269 continue;
1270 return ApplySubregisters({Inst->getDebugInstrNum(), MO.getOperandNo()});
1271 }
1272
1273 llvm_unreachable("Vreg def with no corresponding operand?");
1274 }
1275
1276 // Our search ended in a copy from a physreg: walk back up the function
1277 // looking for whatever defines the physreg.
1278 assert(CurInst->isCopyLike() || TII.isCopyInstr(*CurInst));
1279 State = GetRegAndSubreg(*CurInst);
1280 Register RegToSeek = State.first;
1281
1282 auto RMII = CurInst->getReverseIterator();
1283 auto PrevInstrs = make_range(RMII, CurInst->getParent()->instr_rend());
1284 for (auto &ToExamine : PrevInstrs) {
1285 for (auto &MO : ToExamine.all_defs()) {
1286 // Test for operand that defines something aliasing RegToSeek.
1287 if (!TRI.regsOverlap(RegToSeek, MO.getReg()))
1288 continue;
1289
1290 return ApplySubregisters(
1291 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1292 }
1293 }
1294
1295 MachineBasicBlock &InsertBB = *CurInst->getParent();
1296
1297 // We reached the start of the block before finding a defining instruction.
1298 // There are numerous scenarios where this can happen:
1299 // * Constant physical registers,
1300 // * Several intrinsics that allow LLVM-IR to read arbitary registers,
1301 // * Arguments in the entry block,
1302 // * Exception handling landing pads.
1303 // Validating all of them is too difficult, so just insert a DBG_PHI reading
1304 // the variable value at this position, rather than checking it makes sense.
1305
1306 // Create DBG_PHI for specified physreg.
1307 auto Builder = BuildMI(InsertBB, InsertBB.getFirstNonPHI(), DebugLoc(),
1308 TII.get(TargetOpcode::DBG_PHI));
1309 Builder.addReg(State.first);
1310 unsigned NewNum = getNewDebugInstrNum();
1311 Builder.addImm(NewNum);
1312 return ApplySubregisters({NewNum, 0u});
1313}
1314
1316 auto *TII = getSubtarget().getInstrInfo();
1317
1318 auto MakeUndefDbgValue = [&](MachineInstr &MI) {
1319 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_VALUE_LIST);
1320 MI.setDesc(RefII);
1321 MI.setDebugValueUndef();
1322 };
1323
1325 for (auto &MBB : *this) {
1326 for (auto &MI : MBB) {
1327 if (!MI.isDebugRef())
1328 continue;
1329
1330 bool IsValidRef = true;
1331
1332 for (MachineOperand &MO : MI.debug_operands()) {
1333 if (!MO.isReg())
1334 continue;
1335
1336 Register Reg = MO.getReg();
1337
1338 // Some vregs can be deleted as redundant in the meantime. Mark those
1339 // as DBG_VALUE $noreg. Additionally, some normal instructions are
1340 // quickly deleted, leaving dangling references to vregs with no def.
1341 if (Reg == 0 || !RegInfo->hasOneDef(Reg)) {
1342 IsValidRef = false;
1343 break;
1344 }
1345
1346 assert(Reg.isVirtual());
1347 MachineInstr &DefMI = *RegInfo->def_instr_begin(Reg);
1348
1349 // If we've found a copy-like instruction, follow it back to the
1350 // instruction that defines the source value, see salvageCopySSA docs
1351 // for why this is important.
1352 if (DefMI.isCopyLike() || TII->isCopyInstr(DefMI)) {
1353 auto Result = salvageCopySSA(DefMI, ArgDbgPHIs);
1354 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1355 } else {
1356 // Otherwise, identify the operand number that the VReg refers to.
1357 unsigned OperandIdx = 0;
1358 for (const auto &DefMO : DefMI.operands()) {
1359 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() == Reg)
1360 break;
1361 ++OperandIdx;
1362 }
1363 assert(OperandIdx < DefMI.getNumOperands());
1364
1365 // Morph this instr ref to point at the given instruction and operand.
1366 unsigned ID = DefMI.getDebugInstrNum();
1367 MO.ChangeToDbgInstrRef(ID, OperandIdx);
1368 }
1369 }
1370
1371 if (!IsValidRef)
1372 MakeUndefDbgValue(MI);
1373 }
1374 }
1375}
1376
1378 // Disable instr-ref at -O0: it's very slow (in compile time). We can still
1379 // have optimized code inlined into this unoptimized code, however with
1380 // fewer and less aggressive optimizations happening, coverage and accuracy
1381 // should not suffer.
1382 if (getTarget().getOptLevel() == CodeGenOptLevel::None)
1383 return false;
1384
1385 // Don't use instr-ref if this function is marked optnone.
1386 if (F.hasFnAttribute(Attribute::OptimizeNone))
1387 return false;
1388
1389 if (llvm::debuginfoShouldUseDebugInstrRef(getTarget().getTargetTriple()))
1390 return true;
1391
1392 return false;
1393}
1394
1396 return UseDebugInstrRef;
1397}
1398
1402
1403// Use one million as a high / reserved number.
1404const unsigned MachineFunction::DebugOperandMemNumber = 1000000;
1405
1406/// \}
1407
1408//===----------------------------------------------------------------------===//
1409// MachineJumpTableInfo implementation
1410//===----------------------------------------------------------------------===//
1411
1413 const std::vector<MachineBasicBlock *> &MBBs)
1415
1416/// Return the size of each entry in the jump table.
1418 // The size of a jump table entry is 4 bytes unless the entry is just the
1419 // address of a block, in which case it is the pointer size.
1420 switch (getEntryKind()) {
1422 return TD.getPointerSize();
1425 return 8;
1429 return 4;
1431 return 0;
1432 }
1433 llvm_unreachable("Unknown jump table encoding!");
1434}
1435
1436/// Return the alignment of each entry in the jump table.
1438 // The alignment of a jump table entry is the alignment of int32 unless the
1439 // entry is just the address of a block, in which case it is the pointer
1440 // alignment.
1441 switch (getEntryKind()) {
1443 return TD.getPointerABIAlignment(0).value();
1446 return TD.getABIIntegerTypeAlignment(64).value();
1450 return TD.getABIIntegerTypeAlignment(32).value();
1452 return 1;
1453 }
1454 llvm_unreachable("Unknown jump table encoding!");
1455}
1456
1457/// Create a new jump table entry in the jump table info.
1459 const std::vector<MachineBasicBlock*> &DestBBs) {
1460 assert(!DestBBs.empty() && "Cannot create an empty jump table!");
1461 JumpTables.push_back(MachineJumpTableEntry(DestBBs));
1462 return JumpTables.size()-1;
1463}
1464
1466 size_t JTI, MachineFunctionDataHotness Hotness) {
1467 assert(JTI < JumpTables.size() && "Invalid JTI!");
1468 // Record the largest hotness value.
1469 if (Hotness <= JumpTables[JTI].Hotness)
1470 return false;
1471
1472 JumpTables[JTI].Hotness = Hotness;
1473 return true;
1474}
1475
1476/// If Old is the target of any jump tables, update the jump tables to branch
1477/// to New instead.
1479 MachineBasicBlock *New) {
1480 assert(Old != New && "Not making a change?");
1481 bool MadeChange = false;
1482 for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
1483 ReplaceMBBInJumpTable(i, Old, New);
1484 return MadeChange;
1485}
1486
1487/// If MBB is present in any jump tables, remove it.
1489 bool MadeChange = false;
1490 for (MachineJumpTableEntry &JTE : JumpTables) {
1491 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(), MBB);
1492 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1493 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1494 }
1495 return MadeChange;
1496}
1497
1498/// If Old is a target of the jump tables, update the jump table to branch to
1499/// New instead.
1501 MachineBasicBlock *Old,
1502 MachineBasicBlock *New) {
1503 assert(Old != New && "Not making a change?");
1504 bool MadeChange = false;
1505 MachineJumpTableEntry &JTE = JumpTables[Idx];
1506 for (MachineBasicBlock *&MBB : JTE.MBBs)
1507 if (MBB == Old) {
1508 MBB = New;
1509 MadeChange = true;
1510 }
1511 return MadeChange;
1512}
1513
1515 if (JumpTables.empty()) return;
1516
1517 OS << "Jump Tables:\n";
1518
1519 for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1520 OS << printJumpTableEntryReference(i) << ':';
1521 for (const MachineBasicBlock *MBB : JumpTables[i].MBBs)
1522 OS << ' ' << printMBBReference(*MBB);
1523 OS << '\n';
1524 }
1525
1526 OS << '\n';
1527}
1528
1529#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1531#endif
1532
1534 return Printable([Idx](raw_ostream &OS) { OS << "%jump-table." << Idx; });
1535}
1536
1537//===----------------------------------------------------------------------===//
1538// MachineConstantPool implementation
1539//===----------------------------------------------------------------------===//
1540
1541void MachineConstantPoolValue::anchor() {}
1542
1544 return DL.getTypeAllocSize(Ty);
1545}
1546
1549 return Val.MachineCPVal->getSizeInBytes(DL);
1550 return DL.getTypeAllocSize(Val.ConstVal->getType());
1551}
1552
1555 return true;
1556 return Val.ConstVal->needsDynamicRelocation();
1557}
1558
1561 if (needsRelocation())
1563 switch (getSizeInBytes(*DL)) {
1564 case 4:
1566 case 8:
1568 case 16:
1570 case 32:
1572 default:
1573 return SectionKind::getReadOnly();
1574 }
1575}
1576
1578 // A constant may be a member of both Constants and MachineCPVsSharingEntries,
1579 // so keep track of which we've deleted to avoid double deletions.
1581 for (const MachineConstantPoolEntry &C : Constants)
1582 if (C.isMachineConstantPoolEntry()) {
1583 Deleted.insert(C.Val.MachineCPVal);
1584 delete C.Val.MachineCPVal;
1585 }
1586 for (MachineConstantPoolValue *CPV : MachineCPVsSharingEntries) {
1587 if (Deleted.count(CPV) == 0)
1588 delete CPV;
1589 }
1590}
1591
1592/// Test whether the given two constants can be allocated the same constant pool
1593/// entry referenced by \param A.
1594static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
1595 const DataLayout &DL) {
1596 // Handle the trivial case quickly.
1597 if (A == B) return true;
1598
1599 // If they have the same type but weren't the same constant, quickly
1600 // reject them.
1601 if (A->getType() == B->getType()) return false;
1602
1603 // We can't handle structs or arrays.
1604 if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
1605 isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
1606 return false;
1607
1608 // For now, only support constants with the same size.
1609 uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
1610 if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
1611 return false;
1612
1613 bool ContainsUndefOrPoisonA = A->containsUndefOrPoisonElement();
1614
1615 Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
1616
1617 // Try constant folding a bitcast of both instructions to an integer. If we
1618 // get two identical ConstantInt's, then we are good to share them. We use
1619 // the constant folding APIs to do this so that we get the benefit of
1620 // DataLayout.
1621 if (isa<PointerType>(A->getType()))
1622 A = ConstantFoldCastOperand(Instruction::PtrToInt,
1623 const_cast<Constant *>(A), IntTy, DL);
1624 else if (A->getType() != IntTy)
1625 A = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(A),
1626 IntTy, DL);
1627 if (isa<PointerType>(B->getType()))
1628 B = ConstantFoldCastOperand(Instruction::PtrToInt,
1629 const_cast<Constant *>(B), IntTy, DL);
1630 else if (B->getType() != IntTy)
1631 B = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(B),
1632 IntTy, DL);
1633
1634 if (A != B)
1635 return false;
1636
1637 // Constants only safely match if A doesn't contain undef/poison.
1638 // As we'll be reusing A, it doesn't matter if B contain undef/poison.
1639 // TODO: Handle cases where A and B have the same undef/poison elements.
1640 // TODO: Merge A and B with mismatching undef/poison elements.
1641 return !ContainsUndefOrPoisonA;
1642}
1643
1644/// Create a new entry in the constant pool or return an existing one.
1645/// User must specify the log2 of the minimum required alignment for the object.
1647 Align Alignment) {
1648 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1649
1650 // Check to see if we already have this constant.
1651 //
1652 // FIXME, this could be made much more efficient for large constant pools.
1653 for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1654 if (!Constants[i].isMachineConstantPoolEntry() &&
1655 CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
1656 if (Constants[i].getAlign() < Alignment)
1657 Constants[i].Alignment = Alignment;
1658 return i;
1659 }
1660
1661 Constants.push_back(MachineConstantPoolEntry(C, Alignment));
1662 return Constants.size()-1;
1663}
1664
1666 Align Alignment) {
1667 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1668
1669 // Check to see if we already have this constant.
1670 //
1671 // FIXME, this could be made much more efficient for large constant pools.
1672 int Idx = V->getExistingMachineCPValue(this, Alignment);
1673 if (Idx != -1) {
1674 MachineCPVsSharingEntries.insert(V);
1675 return (unsigned)Idx;
1676 }
1677
1678 Constants.push_back(MachineConstantPoolEntry(V, Alignment));
1679 return Constants.size()-1;
1680}
1681
1683 if (Constants.empty()) return;
1684
1685 OS << "Constant Pool:\n";
1686 for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
1687 OS << " cp#" << i << ": ";
1688 if (Constants[i].isMachineConstantPoolEntry())
1689 Constants[i].Val.MachineCPVal->print(OS);
1690 else
1691 Constants[i].Val.ConstVal->printAsOperand(OS);
1692 OS << ", align=" << Constants[i].getAlign().value();
1693 OS << "\n";
1694 }
1695}
1696
1697//===----------------------------------------------------------------------===//
1698// Template specialization for MachineFunction implementation of
1699// ProfileSummaryInfo::getEntryCount().
1700//===----------------------------------------------------------------------===//
1701template <>
1702std::optional<uint64_t>
1703ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1704 const llvm::MachineFunction *F) const {
1705 return F->getFunction().getEntryCount();
1706}
1707
1708#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1710#endif
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
unsigned uint64_t
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:678
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
static MaybeAlign getAlign(Value *Ptr)
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
static FramePointerKind getFramePointerPolicy(const Function &F)
static cl::opt< unsigned > AlignAllFunctions("align-all-functions", cl::desc("Force the alignment of all functions in log2 format (e.g. 4 " "means align on 16B boundaries)."), cl::init(0), cl::Hidden)
static const MachineInstr * getCallInstr(const MachineInstr *MI)
Return the call machine instruction or find a call within bundle.
static Align getFnStackAlignment(const TargetSubtargetInfo &STI, const Function &F)
static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B, const DataLayout &DL)
Test whether the given two constants can be allocated the same constant pool entry referenced by.
void setUnsafeStackSize(const Function &F, MachineFrameInfo &FrameInfo)
static const char * getPropertyName(MachineFunctionProperties::Property Prop)
Register const TargetRegisterInfo * TRI
This file contains the declarations for metadata subclasses.
#define P(N)
Basic Register Allocator
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallString class.
This file defines the SmallVector class.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static const int BlockSize
Definition TarWriter.cpp:33
This file describes how to lower LLVM code to machine code.
void print(OutputBuffer &OB) const
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:263
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
unsigned size_type
Definition BitVector.h:115
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Align getABIIntegerTypeAlignment(unsigned BitWidth) const
Returns the minimum ABI-required alignment for an integer type of the specified bitwidth.
Definition DataLayout.h:641
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
LLVM_ABI Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
A debug info location.
Definition DebugLoc.h:126
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:133
iterator end()
Definition DenseMap.h:141
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:730
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
Context object for machine code objects.
Definition MCContext.h:83
Describe properties that are true of each instruction in the target description file.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
bool hasSubClassEq(const MCRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
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:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1424
Tracking metadata reference owned by Metadata.
Definition Metadata.h:891
A single uniqued string.
Definition Metadata.h:722
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:633
void setIsEndSection(bool V=true)
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
LLVM_ABI iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Instructions::const_iterator const_instr_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsBeginSection(bool V=true)
This class is a data container for one entry in a MachineConstantPool.
union llvm::MachineConstantPoolEntry::@004270020304201266316354007027341142157160323045 Val
The constant itself.
LLVM_ABI bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
LLVM_ABI unsigned getSizeInBytes(const DataLayout &DL) const
LLVM_ABI SectionKind getSectionKind(const DataLayout *DL) const
Abstract base class for all machine specific constantpool value subclasses.
virtual unsigned getSizeInBytes(const DataLayout &DL) const
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
LLVM_ABI void dump() const
dump - Call print(cerr) to be called from the debugger.
LLVM_ABI void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects.
LLVM_ABI unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasCalls() const
Return true if the current function has any function calls.
FramePointerKind getFramePointerPolicy() const
void setFramePointerPolicy(FramePointerKind Kind)
LLVM_ABI void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
MachineFunctionProperties & reset(Property P)
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.
int getFilterIDFor(ArrayRef< unsigned > TyIds)
Return the id of the filter encoded by TyIds. This is function wide.
bool UseDebugInstrRef
Flag for whether this function contains DBG_VALUEs (false) or DBG_INSTR_REF (true).
void moveAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Move the call site info from Old to \New call site info.
std::pair< unsigned, unsigned > DebugInstrOperandPair
Pair of instruction number and operand number.
unsigned addFrameInst(const MCCFIInstruction &Inst)
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
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.
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
void viewCFGOnly() const
viewCFGOnly - This function is meant for use from the debugger.
ArrayRef< int > allocateShuffleMask(ArrayRef< int > Mask)
void substituteDebugValuesForInst(const MachineInstr &Old, MachineInstr &New, unsigned MaxOperand=UINT_MAX)
Create substitutions for any tracked values in Old, to point at New.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineJumpTableInfo * getOrCreateJumpTableInfo(unsigned JTEntryKind)
getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it does already exist,...
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
MachineFunction(Function &F, const TargetMachine &Target, const TargetSubtargetInfo &STI, MCContext &Ctx, unsigned FunctionNum)
LLVM_ABI bool framePointerIsReserved() const
Returns true if the frame pointer must always either point to a new frame record or be un-modified in...
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0, MDNode *MMRAs=nullptr, Value *DS=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
void finalizeDebugInstrRefs()
Finalise any partially emitted debug instructions.
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
void initTargetMachineFunctionInfo(const TargetSubtargetInfo &STI)
Initialize the target specific MachineFunctionInfo.
void replaceFrameInstRegister(MCRegister From, MCRegister To)
Replace all references to register.
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
uint32_t * allocateRegMask()
Allocate and initialize a register mask with NumRegister bits.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef< unsigned > Sites)
Map the landing pad's EH symbol to the call site indexes.
void setUseDebugInstrRef(bool UseInstrRef)
Set whether this function will use instruction referencing or not.
LandingPadInfo & getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad)
Find or create an LandingPadInfo for the specified MachineBasicBlock.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
MCSymbol * addLandingPad(MachineBasicBlock *LandingPad)
Add a new panding pad, and extract the exception handling information from the landingpad instruction...
unsigned DebugInstrNumberingCount
A count of how many instructions in the function have had numbers assigned to them.
void deleteMachineBasicBlock(MachineBasicBlock *MBB)
DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
Align getAlignment() const
getAlignment - Return the alignment of the function.
void handleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
static const unsigned int DebugOperandMemNumber
A reserved operand number representing the instructions memory operand, for instructions that have a ...
Function & getFunction()
Return the LLVM function that this machine code represents.
Align getPreferredAlignment() const
Returns the preferred alignment which comes from the function attributes (optsize,...
MachineFunctionInfo * cloneInfoFrom(const MachineFunction &OrigMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB)
DebugInstrOperandPair salvageCopySSAImpl(MachineInstr &MI)
const MachineBasicBlock & back() const
BasicBlockListType::iterator iterator
void setDebugInstrNumberingCount(unsigned Num)
Set value of DebugInstrNumberingCount field.
LLVM_ABI bool disableFramePointerElim() const
Returns true if frame pointer elimination should be disabled for this function.
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
void viewCFG() const
viewCFG - This function is meant for use from the debugger.
bool shouldUseDebugInstrRef() const
Determine whether, in the current machine configuration, we should use instruction referencing or not...
const MachineFunctionProperties & getProperties() const
Get the function properties.
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
const MachineBasicBlock & front() const
Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags F, LLT MemTy, Align BaseAlignment, const MMOMetadata &Metadata=MMOMetadata(), SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
int64_t estimateFunctionSizeInBytes()
Return an estimate of the function's code size, taking into account block and function alignment.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void copyAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Copy the call site info from Old to \ New.
VariableDbgInfoMapTy VariableDbgInfos
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
DebugInstrOperandPair salvageCopySSA(MachineInstr &MI, DenseMap< Register, DebugInstrOperandPair > &DbgPHICache)
Find the underlying defining instruction / operand for a COPY instruction while in SSA form.
Representation of each machine instruction.
LLVM_ABI void bundleWithPred()
Bundle this instruction with its predecessor.
bool isCopyLike() const
Return true if the instruction behaves like a copy.
filtered_mop_range all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
unsigned getNumOperands() const
Retuns the total number of operands.
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
LLVM_ABI unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI bool shouldUpdateAdditionalCallInfo() const
Return true if copying, moving, or erasing this instruction requires updating additional call info (s...
LLVM_ABI bool RemoveMBBFromJumpTables(MachineBasicBlock *MBB)
RemoveMBBFromJumpTables - If MBB is present in any jump tables, remove it.
LLVM_ABI bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTables - If Old is the target of any jump tables, update the jump tables to branch to...
LLVM_ABI void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about jump tables.
LLVM_ABI unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
LLVM_ABI unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
LLVM_ABI void dump() const
dump - Call to stderr.
LLVM_ABI bool ReplaceMBBInJumpTable(unsigned Idx, MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTable - If Old is a target of the jump tables, update the jump table to branch to New...
LLVM_ABI bool updateJumpTableEntryHotness(size_t JTI, MachineFunctionDataHotness Hotness)
JTEntryKind
JTEntryKind - This enum indicates how each entry of the jump table is represented and emitted.
@ EK_GPRel32BlockAddress
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_Custom32
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
@ EK_LabelDifference64
EK_LabelDifference64 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
@ EK_GPRel64BlockAddress
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
LLVM_ABI unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur.
const PseudoSourceValue * getPseudoValue() const
const MDNode * getRanges() const
Return the range tag for the memory reference.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
Flags
Flags values. These may be or'd together.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
const Value * getValue() const
Return the base address of the memory access.
Align getBaseAlign() const
Return the minimum known alignment in bytes of the base address, without the offset.
const MDNode * getMemCacheHint() const
Return the cache hint metadata for the memory reference.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI LLVM_READONLY MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
std::vector< std::pair< MCRegister, Register > >::const_iterator livein_iterator
LLVM_ABI Register getLiveInVirtReg(MCRegister PReg) const
getLiveInVirtReg - If PReg is a live-in physical register, return the corresponding live-in virtual r...
const TargetRegisterInfo * getTargetRegisterInfo() const
void addLiveIn(MCRegister Reg, Register vreg=Register())
addLiveIn - Add the specified register as a live-in.
Root of the metadata hierarchy.
Definition Metadata.h:64
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Simple wrapper around std::function<void(raw_ostream&)>.
Definition Printable.h:38
Wrapper class representing virtual and physical registers.
Definition Register.h:20
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition SectionKind.h:22
static SectionKind getMergeableConst4()
static SectionKind getReadOnlyWithRel()
static SectionKind getMergeableConst8()
static SectionKind getMergeableConst16()
static SectionKind getReadOnly()
static SectionKind getMergeableConst32()
SlotIndexes pass.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
bool isStackRealignable() const
isStackRealignable - This method returns whether the stack can be realigned.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
Primary interface to the complete machine description for the target machine.
TargetOptions Options
unsigned ForceDwarfFrameSection
Emit DWARF debug frame section.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:310
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
self_iterator getIterator()
Definition ilist_node.h:123
iterator erase(iterator where)
Definition ilist.h:204
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
uint64_t MD5Hash(const FunctionId &Obj)
Definition FunctionId.h:167
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
FramePointerKind
Definition CodeGen.h:185
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Unknown
Not known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
LLVM_ABI Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
MachineFunctionDataHotness
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
auto reverse(ContainerTy &&C)
Definition STLExtras.h:407
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
AtomicOrdering
Atomic ordering for LLVM's memory model.
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
DWARFExpression::Operation Op
void ViewGraph(const GraphType &G, const Twine &Name, bool ShortNames=false, const Twine &Title="", GraphProgram::Name Program=GraphProgram::DOT)
ViewGraph - Emit a dot graph, run 'dot', run gv on the postscript file, then cleanup.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
bool debuginfoShouldUseDebugInstrRef(const Triple &T)
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
std::string getNodeLabel(const MachineBasicBlock *Node, const MachineFunction *Graph)
static std::string getGraphName(const MachineFunction *F)
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
Represent subnormal handling kind for floating point instruction inputs and outputs.
This structure is used to retain landing pad info for the current function.
SmallVector< MCSymbol *, 1 > EndLabels
MachineBasicBlock * LandingPadBlock
SmallVector< MCSymbol *, 1 > BeginLabels
std::vector< int > TypeIds
LLVM IR metadata carried by a MachineMemOperand.
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
virtual MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB) const
Make a functionally equivalent copy of this MachineFunctionInfo in MF.
SmallVector< ConstantInt *, 4 > CalleeTypeIds
Callee type ids.
MDNode * CallTarget
'call_target' metadata for the DISubprogram.
MachineJumpTableEntry - One jump table in the jump table info.
LLVM_ABI MachineJumpTableEntry(const std::vector< MachineBasicBlock * > &M)
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
MachineFunctionDataHotness Hotness
The hotness of MJTE is inferred from the hotness of the source basic block(s) that reference it.
This class contains a discriminated union of information about pointers in memory operands,...
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
static void deleteNode(NodeTy *V)
Definition ilist.h:42