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/MCAsmInfo.h"
59#include "llvm/MC/MCContext.h"
60#include "llvm/MC/MCSymbol.h"
61#include "llvm/MC/SectionKind.h"
71#include <algorithm>
72#include <cassert>
73#include <cstddef>
74#include <cstdint>
75#include <iterator>
76#include <string>
77#include <utility>
78#include <vector>
79
81
82using namespace llvm;
83
84#define DEBUG_TYPE "codegen"
85
87 "align-all-functions",
88 cl::desc("Force the alignment of all functions in log2 format (e.g. 4 "
89 "means align on 16B boundaries)."),
91
94
95 // clang-format off
96 switch(Prop) {
97 case P::FailedISel: return "FailedISel";
98 case P::IsSSA: return "IsSSA";
99 case P::Legalized: return "Legalized";
100 case P::NoPHIs: return "NoPHIs";
101 case P::NoVRegs: return "NoVRegs";
102 case P::RegBankSelected: return "RegBankSelected";
103 case P::Selected: return "Selected";
104 case P::TracksLiveness: return "TracksLiveness";
105 case P::TiedOpsRewritten: return "TiedOpsRewritten";
106 case P::FailsVerification: return "FailsVerification";
107 case P::FailedRegAlloc: return "FailedRegAlloc";
108 case P::TracksDebugUserValues: return "TracksDebugUserValues";
109 }
110 // clang-format on
111 llvm_unreachable("Invalid machine function property");
112}
113
115 if (!F.hasFnAttribute(Attribute::SafeStack))
116 return;
117
118 auto *Existing =
119 dyn_cast_or_null<MDTuple>(F.getMetadata(LLVMContext::MD_annotation));
120
121 if (!Existing || Existing->getNumOperands() != 2)
122 return;
123
124 auto *MetadataName = "unsafe-stack-size";
125 if (auto &N = Existing->getOperand(0)) {
126 if (N.equalsStr(MetadataName)) {
127 if (auto &Op = Existing->getOperand(1)) {
128 auto Val = mdconst::extract<ConstantInt>(Op)->getZExtValue();
129 FrameInfo.setUnsafeStackSize(Val);
130 }
131 }
132 }
133}
134
135// Pin the vtable to this file.
136void MachineFunction::Delegate::anchor() {}
137
139 const char *Separator = "";
140 for (BitVector::size_type I = 0; I < Properties.size(); ++I) {
141 if (!Properties[I])
142 continue;
143 OS << Separator << getPropertyName(static_cast<Property>(I));
144 Separator = ", ";
145 }
146}
147
148//===----------------------------------------------------------------------===//
149// MachineFunction implementation
150//===----------------------------------------------------------------------===//
151
152// Out-of-line virtual method.
154
156 MBB->getParent()->deleteMachineBasicBlock(MBB);
157}
158
160 const Function &F) {
161 if (auto MA = F.getFnStackAlign())
162 return *MA;
163 return STI.getFrameLowering()->getStackAlign();
164}
165
167 Attribute FPAttr = F.getFnAttribute("frame-pointer");
168 if (!FPAttr.isValid())
170
171 StringRef FP = FPAttr.getValueAsString();
174 .Case("non-leaf", FramePointerKind::NonLeaf)
175 .Case("non-leaf-no-reserve", FramePointerKind::NonLeafNoReserve)
176 .Case("reserved", FramePointerKind::Reserved)
179}
180
182 const TargetSubtargetInfo &STI, MCContext &Ctx,
183 unsigned FunctionNum)
184 : F(F), Target(Target), STI(STI), Ctx(Ctx) {
185 FunctionNumber = FunctionNum;
186 init();
187}
188
189void MachineFunction::handleInsertion(MachineInstr &MI) {
190 if (TheDelegate)
191 TheDelegate->MF_HandleInsertion(MI);
192}
193
194void MachineFunction::handleRemoval(MachineInstr &MI) {
195 if (TheDelegate)
196 TheDelegate->MF_HandleRemoval(MI);
197}
198
200 const MCInstrDesc &TID) {
201 if (TheDelegate)
202 TheDelegate->MF_HandleChangeDesc(MI, TID);
203}
204
205void MachineFunction::init() {
206 // Assume the function starts in SSA form with correct liveness.
207 Properties.setIsSSA();
208 Properties.setTracksLiveness();
209 RegInfo = new (Allocator) MachineRegisterInfo(this);
210
211 MFInfo = nullptr;
212
213 // We can realign the stack if the target supports it and the user hasn't
214 // explicitly asked us not to.
215 bool CanRealignSP = STI.getFrameLowering()->isStackRealignable() &&
216 !F.hasFnAttribute("no-realign-stack");
217 bool ForceRealignSP = F.hasFnAttribute(Attribute::StackAlignment) ||
218 F.hasFnAttribute("stackrealign");
219 FrameInfo = new (Allocator) MachineFrameInfo(
220 getFnStackAlignment(STI, F), /*StackRealignable=*/CanRealignSP,
221 /*ForcedRealign=*/ForceRealignSP && CanRealignSP);
223
224 setUnsafeStackSize(F, *FrameInfo);
225
226 if (F.hasFnAttribute(Attribute::StackAlignment))
227 FrameInfo->ensureMaxAlignment(*F.getFnStackAlign());
228
230 Alignment = STI.getTargetLowering()->getMinFunctionAlignment();
231
232 // -fsanitize=function and -fsanitize=kcfi instrument indirect function calls
233 // to load a type hash before the function label. Ensure functions are aligned
234 // by a least 4 to avoid unaligned access, which is especially important for
235 // -mno-unaligned-access.
236 if (F.hasMetadata(LLVMContext::MD_func_sanitize) ||
237 F.getMetadata(LLVMContext::MD_kcfi_type))
238 Alignment = std::max(Alignment, Align(4));
239
242
243 JumpTableInfo = nullptr;
244
246 F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
247 WinEHInfo = new (Allocator) WinEHFuncInfo();
248 }
249
250 if (!Target.isCompatibleDataLayout(getDataLayout())) {
252 formatv("Can't create a MachineFunction using a Module with a "
253 "Target-incompatible DataLayout attached\n Target "
254 "DataLayout: {0}\n Module DataLayout: {1}\n",
255 Target.createDataLayout().getStringRepresentation(),
256 getDataLayout().getStringRepresentation()));
257 }
258
259 PSVManager = std::make_unique<PseudoSourceValueManager>(getTarget());
260}
261
263 const TargetSubtargetInfo &STI) {
264 assert(!MFInfo && "MachineFunctionInfo already set");
265 MFInfo = Target.createMachineFunctionInfo(Allocator, F, &STI);
266}
267
269 const MachineFunction &OrigMF,
271 assert(!MFInfo && "new function already has MachineFunctionInfo");
272 if (!OrigMF.MFInfo)
273 return nullptr;
274
275 MachineFunctionInfo *ClonedInfo =
276 OrigMF.MFInfo->clone(Allocator, *this, Src2DstMBB);
277 if (!ClonedInfo)
278 return nullptr;
279
280 RegInfo->copyPendingVirtRegMapEntriesFrom(OrigMF.getRegInfo());
281 return ClonedInfo;
282}
283
287
288void MachineFunction::clear() {
289 Properties.reset();
290
291 // Clear JumpTableInfo first. Otherwise, every MBB we delete would do a
292 // linear search over the jump table entries to find and erase itself.
293 if (JumpTableInfo) {
294 JumpTableInfo->~MachineJumpTableInfo();
295 Allocator.Deallocate(JumpTableInfo);
296 JumpTableInfo = nullptr;
297 }
298
299 // Don't call destructors on MachineInstr and MachineOperand. All of their
300 // memory comes from the BumpPtrAllocator which is about to be purged.
301 //
302 // Do call MachineBasicBlock destructors, it contains std::vectors.
303 for (iterator I = begin(), E = end(); I != E; I = BasicBlocks.erase(I))
304 I->Insts.clearAndLeakNodesUnsafely();
305 MBBNumbering.clear();
306
307 InstructionRecycler.clear(Allocator);
308 OperandRecycler.clear(Allocator);
309 BasicBlockRecycler.clear(Allocator);
310 CodeViewAnnotations.clear();
312 CallSitesInfo.clear();
313 CalledGlobalsInfo.clear();
314 if (RegInfo) {
315 RegInfo->~MachineRegisterInfo();
316 Allocator.Deallocate(RegInfo);
317 }
318 if (MFInfo) {
319 MFInfo->~MachineFunctionInfo();
320 Allocator.Deallocate(MFInfo);
321 }
322
323 FrameInfo->~MachineFrameInfo();
324 Allocator.Deallocate(FrameInfo);
325
326 ConstantPool->~MachineConstantPool();
327 Allocator.Deallocate(ConstantPool);
328
329 if (WinEHInfo) {
330 WinEHInfo->~WinEHFuncInfo();
331 Allocator.Deallocate(WinEHInfo);
332 }
333}
334
336 return F.getDataLayout();
337}
338
339/// Get the JumpTableInfo for this function.
340/// If it does not already exist, allocate one.
342getOrCreateJumpTableInfo(unsigned EntryKind) {
343 if (JumpTableInfo) return JumpTableInfo;
344
345 JumpTableInfo = new (Allocator)
347 return JumpTableInfo;
348}
349
351 return F.getDenormalMode(FPType);
352}
353
354/// Should we be emitting segmented stack stuff for the function
356 return getFunction().hasFnAttribute("split-stack");
357}
358
360 Align PrefAlignment;
361
362 if (MaybeAlign A = F.getPreferredAlignment())
363 PrefAlignment = *A;
364 else if (!F.hasOptSize())
365 PrefAlignment = STI.getTargetLowering()->getPrefFunctionAlignment();
366 else
367 PrefAlignment = Align(1);
368
369 return std::max(PrefAlignment, getAlignment());
370}
371
372[[nodiscard]] unsigned
374 FrameInstructions.push_back(Inst);
375 return FrameInstructions.size() - 1;
376}
377
379 MCRegister ToReg) {
380 const MCRegisterInfo *MCRI = Ctx.getRegisterInfo();
381 unsigned DwarfFromReg = MCRI->getDwarfRegNum(FromReg, false);
382 unsigned DwarfToReg = MCRI->getDwarfRegNum(ToReg, false);
383
384 for (MCCFIInstruction &Inst : FrameInstructions)
385 Inst.replaceRegister(DwarfFromReg, DwarfToReg);
386}
387
388/// This discards all of the MachineBasicBlock numbers and recomputes them.
389/// This guarantees that the MBB numbers are sequential, dense, and match the
390/// ordering of the blocks within the function. If a specific MachineBasicBlock
391/// is specified, only that block and those after it are renumbered.
393 if (empty()) { MBBNumbering.clear(); return; }
395 if (MBB == nullptr)
396 MBBI = begin();
397 else
398 MBBI = MBB->getIterator();
399
400 // Figure out the block number this should have.
401 unsigned BlockNo = 0;
402 if (MBBI != begin())
403 BlockNo = std::prev(MBBI)->getNumber() + 1;
404
405 for (; MBBI != E; ++MBBI, ++BlockNo) {
406 if (MBBI->getNumber() != (int)BlockNo) {
407 // Remove use of the old number.
408 if (MBBI->getNumber() != -1) {
409 assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
410 "MBB number mismatch!");
411 MBBNumbering[MBBI->getNumber()] = nullptr;
412 }
413
414 // If BlockNo is already taken, set that block's number to -1.
415 if (MBBNumbering[BlockNo])
416 MBBNumbering[BlockNo]->setNumber(-1);
417
418 MBBNumbering[BlockNo] = &*MBBI;
419 MBBI->setNumber(BlockNo);
420 }
421 }
422
423 // Okay, all the blocks are renumbered. If we have compactified the block
424 // numbering, shrink MBBNumbering now.
425 assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
426 MBBNumbering.resize(BlockNo);
427}
428
431 const Align FunctionAlignment = getAlignment();
433 /// Offset - Distance from the beginning of the function to the end
434 /// of the basic block.
435 int64_t Offset = 0;
436
437 for (; MBBI != E; ++MBBI) {
438 const Align Alignment = MBBI->getAlignment();
439 int64_t BlockSize = 0;
440
441 for (auto &MI : *MBBI) {
442 BlockSize += TII.getInstSizeInBytes(MI);
443 }
444
445 int64_t OffsetBB;
446 if (Alignment <= FunctionAlignment) {
447 OffsetBB = alignTo(Offset, Alignment);
448 } else {
449 // The alignment of this MBB is larger than the function's alignment, so
450 // we can't tell whether or not it will insert nops. Assume that it will.
451 OffsetBB = alignTo(Offset, Alignment) + Alignment.value() -
452 FunctionAlignment.value();
453 }
454 Offset = OffsetBB + BlockSize;
455 }
456
457 return Offset;
458}
459
460/// This method iterates over the basic blocks and assigns their IsBeginSection
461/// and IsEndSection fields. This must be called after MBB layout is finalized
462/// and the SectionID's are assigned to MBBs.
465 auto CurrentSectionID = front().getSectionID();
466 for (auto MBBI = std::next(begin()), E = end(); MBBI != E; ++MBBI) {
467 if (MBBI->getSectionID() == CurrentSectionID)
468 continue;
469 MBBI->setIsBeginSection();
470 std::prev(MBBI)->setIsEndSection();
471 CurrentSectionID = MBBI->getSectionID();
472 }
474}
475
476/// Allocate a new MachineInstr. Use this instead of `new MachineInstr'.
477MachineInstr *MachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
478 DebugLoc DL,
479 bool NoImplicit) {
480 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
481 MachineInstr(*this, MCID, std::move(DL), NoImplicit);
482}
483
484/// Create a new MachineInstr which is a copy of the 'Orig' instruction,
485/// identical in all ways except the instruction has no parent, prev, or next.
487MachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
488 return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
489 MachineInstr(*this, *Orig);
490}
491
492MachineInstr &MachineFunction::cloneMachineInstrBundle(
494 const MachineInstr &Orig) {
495 MachineInstr *FirstClone = nullptr;
497 while (true) {
498 MachineInstr *Cloned = CloneMachineInstr(&*I);
499 MBB.insert(InsertBefore, Cloned);
500 if (FirstClone == nullptr) {
501 FirstClone = Cloned;
502 } else {
503 Cloned->bundleWithPred();
504 }
505
506 if (!I->isBundledWithSucc())
507 break;
508 ++I;
509 }
510 // Copy over call info to the cloned instruction if needed. If Orig is in
511 // a bundle, copyAdditionalCallInfo takes care of finding the call instruction
512 // in the bundle.
514 copyAdditionalCallInfo(&Orig, FirstClone);
515 return *FirstClone;
516}
517
518/// Delete the given MachineInstr.
519///
520/// This function also serves as the MachineInstr destructor - the real
521/// ~MachineInstr() destructor must be empty.
522void MachineFunction::deleteMachineInstr(MachineInstr *MI) {
523 // Verify that a call site info is at valid state. This assertion should
524 // be triggered during the implementation of support for the
525 // call site info of a new architecture. If the assertion is triggered,
526 // back trace will tell where to insert a call to updateCallSiteInfo().
527 assert((!MI->isCandidateForAdditionalCallInfo() ||
528 !CallSitesInfo.contains(MI)) &&
529 "Call site info was not updated!");
530 // Verify that the "called globals" info is in a valid state.
531 assert((!MI->isCandidateForAdditionalCallInfo() ||
532 !CalledGlobalsInfo.contains(MI)) &&
533 "Called globals info was not updated!");
534 // Strip it for parts. The operand array and the MI object itself are
535 // independently recyclable.
536 if (MI->Operands)
537 deallocateOperandArray(MI->CapOperands, MI->Operands);
538 // Don't call ~MachineInstr() which must be trivial anyway because
539 // ~MachineFunction drops whole lists of MachineInstrs wihout calling their
540 // destructors.
541 InstructionRecycler.Deallocate(Allocator, MI);
542}
543
544/// Allocate a new MachineBasicBlock. Use this instead of
545/// `new MachineBasicBlock'.
548 std::optional<UniqueBBID> BBID) {
550 new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
551 MachineBasicBlock(*this, BB);
552 // Set BBID for `-basic-block-sections=list` and `-basic-block-address-map` to
553 // allow robust mapping of profiles to basic blocks.
554 if (Target.Options.BBAddrMap ||
555 Target.getBBSectionsType() == BasicBlockSection::List)
556 MBB->setBBID(BBID.has_value() ? *BBID : UniqueBBID{NextBBID++, 0});
557 return MBB;
558}
559
560/// Delete the given MachineBasicBlock.
562 assert(MBB->getParent() == this && "MBB parent mismatch!");
563 // Clean up any references to MBB in jump tables before deleting it.
564 if (JumpTableInfo)
565 JumpTableInfo->RemoveMBBFromJumpTables(MBB);
566 MBB->~MachineBasicBlock();
567 BasicBlockRecycler.Deallocate(Allocator, MBB);
568}
569
572 Align BaseAlignment, const MMOMetadata &Metadata, SyncScope::ID SSID,
573 AtomicOrdering Ordering, AtomicOrdering FailureOrdering) {
574 assert((!Size.hasValue() ||
575 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
576 "Unexpected an unknown size to be represented using "
577 "LocationSize::beforeOrAfter()");
578 return new (Allocator)
579 MachineMemOperand(PtrInfo, F, Size, BaseAlignment, Metadata, SSID,
580 Ordering, FailureOrdering);
581}
582
585 Align BaseAlignment, const MMOMetadata &Metadata, SyncScope::ID SSID,
586 AtomicOrdering Ordering, AtomicOrdering FailureOrdering) {
587 return new (Allocator)
588 MachineMemOperand(PtrInfo, F, MemTy, BaseAlignment, Metadata, SSID,
589 Ordering, FailureOrdering);
590}
591
594 const MachinePointerInfo &PtrInfo,
596 assert((!Size.hasValue() ||
597 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
598 "Unexpected an unknown size to be represented using "
599 "LocationSize::beforeOrAfter()");
600 return new (Allocator) MachineMemOperand(
601 PtrInfo, MMO->getFlags(), Size, MMO->getBaseAlign(),
602 MMOMetadata(AAMDNodes(), /*Ranges=*/nullptr, MMO->getMemCacheHint()),
603 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
604 MMO->getFailureOrdering());
605}
606
608 const MachineMemOperand *MMO, const MachinePointerInfo &PtrInfo, LLT Ty) {
609 return new (Allocator) MachineMemOperand(
610 PtrInfo, MMO->getFlags(), Ty, MMO->getBaseAlign(),
611 MMOMetadata(AAMDNodes(), /*Ranges=*/nullptr, MMO->getMemCacheHint()),
612 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
613 MMO->getFailureOrdering());
614}
615
618 int64_t Offset, LLT Ty) {
619 const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
620
621 // If there is no pointer value, the offset isn't tracked so we need to adjust
622 // the base alignment.
623 Align Alignment = PtrInfo.V.isNull()
625 : MMO->getBaseAlign();
626
627 // Do not preserve ranges, since we don't necessarily know what the high bits
628 // are anymore.
629 return new (Allocator) MachineMemOperand(
630 PtrInfo.getWithOffset(Offset), MMO->getFlags(), Ty, Alignment,
631 MMOMetadata(MMO->getAAInfo(), /*Ranges=*/nullptr, MMO->getMemCacheHint()),
632 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
633 MMO->getFailureOrdering());
634}
635
638 const AAMDNodes &AAInfo) {
639 MachinePointerInfo MPI = MMO->getValue() ?
640 MachinePointerInfo(MMO->getValue(), MMO->getOffset()) :
642
643 return new (Allocator) MachineMemOperand(
644 MPI, MMO->getFlags(), MMO->getSize(), MMO->getBaseAlign(),
645 MMOMetadata(AAInfo, MMO->getRanges(), MMO->getMemCacheHint()),
646 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
647 MMO->getFailureOrdering());
648}
649
653 return new (Allocator) MachineMemOperand(
654 MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlign(),
655 MMOMetadata(MMO->getAAInfo(), MMO->getRanges(), MMO->getMemCacheHint()),
656 MMO->getSyncScopeID(), MMO->getSuccessOrdering(),
657 MMO->getFailureOrdering());
658}
659
660MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
661 ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
662 MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker, MDNode *PCSections,
663 uint32_t CFIType, MDNode *MMRAs, Value *DS) {
664 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
665 PostInstrSymbol, HeapAllocMarker,
666 PCSections, CFIType, MMRAs, DS);
667}
668
670 char *Dest = Allocator.Allocate<char>(Name.size() + 1);
671 llvm::copy(Name, Dest);
672 Dest[Name.size()] = 0;
673 return Dest;
674}
675
677 unsigned NumRegs = getSubtarget().getRegisterInfo()->getNumRegs();
678 unsigned Size = MachineOperand::getRegMaskSize(NumRegs);
679 uint32_t *Mask = Allocator.Allocate<uint32_t>(Size);
680 memset(Mask, 0, Size * sizeof(Mask[0]));
681 return Mask;
682}
683
685 int* AllocMask = Allocator.Allocate<int>(Mask.size());
686 copy(Mask, AllocMask);
687 return {AllocMask, Mask.size()};
688}
689
690#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
694#endif
695
699
700void MachineFunction::print(raw_ostream &OS, const SlotIndexes *Indexes) const {
701 OS << "# Machine code for function " << getName() << ": ";
702 getProperties().print(OS);
703 OS << '\n';
704
705 // Print Frame Information
706 FrameInfo->print(*this, OS);
707
708 // Print JumpTable Information
709 if (JumpTableInfo)
710 JumpTableInfo->print(OS);
711
712 // Print Constant Pool
713 ConstantPool->print(OS);
714
716
717 if (RegInfo && !RegInfo->livein_empty()) {
718 OS << "Function Live Ins: ";
720 I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
721 OS << printReg(I->first, TRI);
722 if (I->second)
723 OS << " in " << printReg(I->second, TRI);
724 if (std::next(I) != E)
725 OS << ", ";
726 }
727 OS << '\n';
728 }
729
732 for (const auto &BB : *this) {
733 OS << '\n';
734 // If we print the whole function, print it at its most verbose level.
735 BB.print(OS, MST, Indexes, /*IsStandalone=*/true);
736 }
737
738 OS << "\n# End machine code for function " << getName() << ".\n\n";
739}
740
741/// True if this function needs frame moves for debug or exceptions.
743 // TODO: Ideally, what we'd like is to have a switch that allows emitting
744 // synchronous (precise at call-sites only) CFA into .eh_frame. However, even
745 // under this switch, we'd like .debug_frame to be precise when using -g. At
746 // this moment, there's no way to specify that some CFI directives go into
747 // .eh_frame only, while others go into .debug_frame only.
749 F.needsUnwindTableEntry() ||
750 !F.getParent()->debug_compile_units().empty();
751}
752
755 F.getParent()->getExceptionModel() == ExceptionHandling::WinEH;
756}
757
761
764 switch (FP) {
766 return true;
769 return getFrameInfo().hasCalls();
772 return false;
773 }
774 llvm_unreachable("unknown frame pointer flag");
775}
776
779 switch (FP) {
783 return true;
785 return getFrameInfo().hasCalls();
787 return false;
788 }
789 llvm_unreachable("unknown frame pointer flag");
790}
791
793 if (MDNode *Node = CB.getMetadata(llvm::LLVMContext::MD_call_target))
795
796 // Numeric callee_type ids are only for indirect calls.
797 if (!CB.isIndirectCall())
798 return;
799
800 MDNode *CalleeTypeList = CB.getMetadata(LLVMContext::MD_callee_type);
801 if (!CalleeTypeList)
802 return;
803
804 for (const MDOperand &Op : CalleeTypeList->operands()) {
805 MDNode *TypeMD = cast<MDNode>(Op);
806 MDString *TypeIdStr = cast<MDString>(TypeMD->getOperand(0));
807 // Compute numeric type id from type id string
808 uint64_t TypeIdVal = MD5Hash(TypeIdStr->getString());
809 IntegerType *Int64Ty = Type::getInt64Ty(CB.getContext());
810 CalleeTypeIds.push_back(
811 ConstantInt::get(Int64Ty, TypeIdVal, /*IsSigned=*/false));
812 }
813}
814
815template <>
817 : public DefaultDOTGraphTraits {
819
820 static std::string getGraphName(const MachineFunction *F) {
821 return ("CFG for '" + F->getName() + "' function").str();
822 }
823
825 const MachineFunction *Graph) {
826 std::string OutStr;
827 {
828 raw_string_ostream OSS(OutStr);
829
830 if (isSimple()) {
831 OSS << printMBBReference(*Node);
832 if (const BasicBlock *BB = Node->getBasicBlock())
833 OSS << ": " << BB->getName();
834 } else
835 Node->print(OSS);
836 }
837
838 if (OutStr[0] == '\n')
839 OutStr.erase(OutStr.begin());
840
841 // Process string output to make it nicer...
842 for (unsigned i = 0; i != OutStr.length(); ++i)
843 if (OutStr[i] == '\n') { // Left justify
844 OutStr[i] = '\\';
845 OutStr.insert(OutStr.begin() + i + 1, 'l');
846 }
847 return OutStr;
848 }
849};
850
852{
853#ifndef NDEBUG
854 ViewGraph(this, "mf" + getName());
855#else
856 errs() << "MachineFunction::viewCFG is only available in debug builds on "
857 << "systems with Graphviz or gv!\n";
858#endif // NDEBUG
859}
860
862{
863#ifndef NDEBUG
864 ViewGraph(this, "mf" + getName(), true);
865#else
866 errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
867 << "systems with Graphviz or gv!\n";
868#endif // NDEBUG
869}
870
871/// Add the specified physical register as a live-in value and
872/// create a corresponding virtual register for it.
874 const TargetRegisterClass *RC) {
876 Register VReg = MRI.getLiveInVirtReg(PReg);
877 if (VReg) {
878 const TargetRegisterClass *VRegRC = MRI.getRegClass(VReg);
879 (void)VRegRC;
880 // A physical register can be added several times.
881 // Between two calls, the register class of the related virtual register
882 // may have been constrained to match some operation constraints.
883 // In that case, check that the current register class includes the
884 // physical register and is a sub class of the specified RC.
885 assert((VRegRC == RC || (VRegRC->contains(PReg) &&
886 RC->hasSubClassEq(VRegRC))) &&
887 "Register class mismatch!");
888 return VReg;
889 }
890 VReg = MRI.createVirtualRegister(RC);
891 MRI.addLiveIn(PReg, VReg);
892 return VReg;
893}
894
895/// Return the MCSymbol for the specified non-empty jump table.
896/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
897/// normal 'L' label is returned.
899 bool isLinkerPrivate) const {
900 const DataLayout &DL = getDataLayout();
901 assert(JumpTableInfo && "No jump tables");
902 assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
903
904 StringRef Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
905 : DL.getInternalSymbolPrefix();
906 SmallString<60> Name;
908 << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
909 return Ctx.getOrCreateSymbol(Name);
910}
911
912/// Return a function-local symbol to represent the PIC base.
914 const DataLayout &DL = getDataLayout();
915 return Ctx.getOrCreateSymbol(Twine(DL.getInternalSymbolPrefix()) +
916 Twine(getFunctionNumber()) + "$pb");
917}
918
919/// \name Exception Handling
920/// \{
921
924 unsigned N = LandingPads.size();
925 for (unsigned i = 0; i < N; ++i) {
926 LandingPadInfo &LP = LandingPads[i];
927 if (LP.LandingPadBlock == LandingPad)
928 return LP;
929 }
930
931 LandingPads.push_back(LandingPadInfo(LandingPad));
932 return LandingPads[N];
933}
934
936 MCSymbol *BeginLabel, MCSymbol *EndLabel) {
938 LP.BeginLabels.push_back(BeginLabel);
939 LP.EndLabels.push_back(EndLabel);
940}
941
943 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
945 LP.LandingPadLabel = LandingPadLabel;
946
948 LandingPad->getBasicBlock()->getFirstNonPHIIt();
949 if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
950 // If there's no typeid list specified, then "cleanup" is implicit.
951 // Otherwise, id 0 is reserved for the cleanup action.
952 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
953 LP.TypeIds.push_back(0);
954
955 // FIXME: New EH - Add the clauses in reverse order. This isn't 100%
956 // correct, but we need to do it this way because of how the DWARF EH
957 // emitter processes the clauses.
958 for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
959 Value *Val = LPI->getClause(I - 1);
960 if (LPI->isCatch(I - 1)) {
961 LP.TypeIds.push_back(
963 } else {
964 // Add filters in a list.
965 auto *CVal = cast<Constant>(Val);
966 SmallVector<unsigned, 4> FilterList;
967 for (const Use &U : CVal->operands())
968 FilterList.push_back(
969 getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
970
971 LP.TypeIds.push_back(getFilterIDFor(FilterList));
972 }
973 }
974
975 } else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
976 for (unsigned I = CPI->arg_size(); I != 0; --I) {
977 auto *TypeInfo =
978 dyn_cast<GlobalValue>(CPI->getArgOperand(I - 1)->stripPointerCasts());
979 LP.TypeIds.push_back(getTypeIDFor(TypeInfo));
980 }
981
982 } else {
983 assert(isa<CleanupPadInst>(FirstI) && "Invalid landingpad!");
984 }
985
986 return LandingPadLabel;
987}
988
990 ArrayRef<unsigned> Sites) {
991 LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
992}
993
995 for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i)
996 if (TypeInfos[i] == TI) return i + 1;
997
998 TypeInfos.push_back(TI);
999 return TypeInfos.size();
1000}
1001
1003 // If the new filter coincides with the tail of an existing filter, then
1004 // re-use the existing filter. Folding filters more than this requires
1005 // re-ordering filters and/or their elements - probably not worth it.
1006 for (unsigned i : FilterEnds) {
1007 unsigned j = TyIds.size();
1008
1009 while (i && j)
1010 if (FilterIds[--i] != TyIds[--j])
1011 goto try_next;
1012
1013 if (!j)
1014 // The new filter coincides with range [i, end) of the existing filter.
1015 return -(1 + i);
1016
1017try_next:;
1018 }
1019
1020 // Add the new filter.
1021 int FilterID = -(1 + FilterIds.size());
1022 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
1023 llvm::append_range(FilterIds, TyIds);
1024 FilterEnds.push_back(FilterIds.size());
1025 FilterIds.push_back(0); // terminator
1026 return FilterID;
1027}
1028
1030MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
1031 assert(MI->isCandidateForAdditionalCallInfo() &&
1032 "Call site info refers only to call (MI) candidates");
1033
1034 if (!Target.Options.EmitCallSiteInfo && !Target.Options.EmitCallGraphSection)
1035 return CallSitesInfo.end();
1036 return CallSitesInfo.find(MI);
1037}
1038
1039/// Return the call machine instruction or find a call within bundle.
1041 if (!MI->isBundle())
1042 return MI;
1043
1044 for (const auto &BMI : make_range(getBundleStart(MI->getIterator()),
1045 getBundleEnd(MI->getIterator())))
1046 if (BMI.isCandidateForAdditionalCallInfo())
1047 return &BMI;
1048
1049 llvm_unreachable("Unexpected bundle without a call site candidate");
1050}
1051
1053 assert(MI->shouldUpdateAdditionalCallInfo() &&
1054 "Call info refers only to call (MI) candidates or "
1055 "candidates inside bundles");
1056
1057 const MachineInstr *CallMI = getCallInstr(MI);
1058
1059 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI);
1060 if (CSIt != CallSitesInfo.end())
1061 CallSitesInfo.erase(CSIt);
1062
1063 CalledGlobalsInfo.erase(CallMI);
1064}
1065
1067 const MachineInstr *New) {
1069 "Call info refers only to call (MI) candidates or "
1070 "candidates inside bundles");
1071
1072 if (!New->isCandidateForAdditionalCallInfo())
1073 return eraseAdditionalCallInfo(Old);
1074
1075 const MachineInstr *OldCallMI = getCallInstr(Old);
1076 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1077 if (CSIt != CallSitesInfo.end()) {
1078 CallSiteInfo CSInfo = CSIt->second;
1079 CallSitesInfo[New] = std::move(CSInfo);
1080 }
1081
1082 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1083 if (CGIt != CalledGlobalsInfo.end()) {
1084 CalledGlobalInfo CGInfo = CGIt->second;
1085 CalledGlobalsInfo[New] = std::move(CGInfo);
1086 }
1087}
1088
1090 const MachineInstr *New) {
1092 "Call info refers only to call (MI) candidates or "
1093 "candidates inside bundles");
1094
1095 if (!New->isCandidateForAdditionalCallInfo())
1096 return eraseAdditionalCallInfo(Old);
1097
1098 const MachineInstr *OldCallMI = getCallInstr(Old);
1099 CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI);
1100 if (CSIt != CallSitesInfo.end()) {
1101 CallSiteInfo CSInfo = std::move(CSIt->second);
1102 CallSitesInfo.erase(CSIt);
1103 CallSitesInfo[New] = std::move(CSInfo);
1104 }
1105
1106 CalledGlobalsMap::iterator CGIt = CalledGlobalsInfo.find(OldCallMI);
1107 if (CGIt != CalledGlobalsInfo.end()) {
1108 CalledGlobalInfo CGInfo = std::move(CGIt->second);
1109 CalledGlobalsInfo.erase(CGIt);
1110 CalledGlobalsInfo[New] = std::move(CGInfo);
1111 }
1112}
1113
1117
1120 unsigned Subreg) {
1121 // Catch any accidental self-loops.
1122 assert(A.first != B.first);
1123 // Don't allow any substitutions _from_ the memory operand number.
1124 assert(A.second != DebugOperandMemNumber);
1125
1126 DebugValueSubstitutions.push_back({A, B, Subreg});
1127}
1128
1130 MachineInstr &New,
1131 unsigned MaxOperand) {
1132 // If the Old instruction wasn't tracked at all, there is no work to do.
1133 unsigned OldInstrNum = Old.peekDebugInstrNum();
1134 if (!OldInstrNum)
1135 return;
1136
1137 // Iterate over all operands looking for defs to create substitutions for.
1138 // Avoid creating new instr numbers unless we create a new substitution.
1139 // While this has no functional effect, it risks confusing someone reading
1140 // MIR output.
1141 // Examine all the operands, or the first N specified by the caller.
1142 MaxOperand = std::min(MaxOperand, Old.getNumOperands());
1143 for (unsigned int I = 0; I < MaxOperand; ++I) {
1144 const auto &OldMO = Old.getOperand(I);
1145 auto &NewMO = New.getOperand(I);
1146 (void)NewMO;
1147
1148 if (!OldMO.isReg() || !OldMO.isDef())
1149 continue;
1150 assert(NewMO.isDef());
1151
1152 unsigned NewInstrNum = New.getDebugInstrNum();
1153 makeDebugValueSubstitution(std::make_pair(OldInstrNum, I),
1154 std::make_pair(NewInstrNum, I));
1155 }
1156}
1157
1162
1163 // Check whether this copy-like instruction has already been salvaged into
1164 // an operand pair.
1165 Register Dest;
1166 if (auto CopyDstSrc = TII.isCopyLikeInstr(MI)) {
1167 Dest = CopyDstSrc->Destination->getReg();
1168 } else {
1169 assert(MI.isSubregToReg());
1170 Dest = MI.getOperand(0).getReg();
1171 }
1172
1173 auto CacheIt = DbgPHICache.find(Dest);
1174 if (CacheIt != DbgPHICache.end())
1175 return CacheIt->second;
1176
1177 // Calculate the instruction number to use, or install a DBG_PHI.
1178 auto OperandPair = salvageCopySSAImpl(MI);
1179 DbgPHICache.insert({Dest, OperandPair});
1180 return OperandPair;
1181}
1182
1188
1189 // Chase the value read by a copy-like instruction back to the instruction
1190 // that ultimately _defines_ that value. This may pass:
1191 // * Through multiple intermediate copies, including subregister moves /
1192 // copies,
1193 // * Copies from physical registers that must then be traced back to the
1194 // defining instruction,
1195 // * Or, physical registers may be live-in to (only) the entry block, which
1196 // requires a DBG_PHI to be created.
1197 // We can pursue this problem in that order: trace back through copies,
1198 // optionally through a physical register, to a defining instruction. We
1199 // should never move from physreg to vreg. As we're still in SSA form, no need
1200 // to worry about partial definitions of registers.
1201
1202 // Helper lambda to interpret a copy-like instruction. Takes instruction,
1203 // returns the register read and any subregister identifying which part is
1204 // read.
1205 auto GetRegAndSubreg =
1206 [&](const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1207 Register NewReg, OldReg;
1208 unsigned SubReg;
1209 if (Cpy.isCopy()) {
1210 OldReg = Cpy.getOperand(0).getReg();
1211 NewReg = Cpy.getOperand(1).getReg();
1212 SubReg = Cpy.getOperand(1).getSubReg();
1213 } else if (Cpy.isSubregToReg()) {
1214 OldReg = Cpy.getOperand(0).getReg();
1215 NewReg = Cpy.getOperand(1).getReg();
1216 SubReg = Cpy.getOperand(2).getImm();
1217 } else {
1218 auto CopyDetails = *TII.isCopyInstr(Cpy);
1219 const MachineOperand &Src = *CopyDetails.Source;
1220 const MachineOperand &Dest = *CopyDetails.Destination;
1221 OldReg = Dest.getReg();
1222 NewReg = Src.getReg();
1223 SubReg = Src.getSubReg();
1224 }
1225
1226 return {NewReg, SubReg};
1227 };
1228
1229 // First seek either the defining instruction, or a copy from a physreg.
1230 // During search, the current state is the current copy instruction, and which
1231 // register we've read. Accumulate qualifying subregisters into SubregsSeen;
1232 // deal with those later.
1233 auto State = GetRegAndSubreg(MI);
1234 auto CurInst = MI.getIterator();
1235 SmallVector<unsigned, 4> SubregsSeen;
1236 while (true) {
1237 // If we've found a copy from a physreg, first portion of search is over.
1238 if (!State.first.isVirtual())
1239 break;
1240
1241 // Record any subregister qualifier.
1242 if (State.second)
1243 SubregsSeen.push_back(State.second);
1244
1245 MachineInstr *Inst = MRI.getVRegDef(State.first);
1246 assert(Inst && "Virtual register has no def");
1247 CurInst = Inst->getIterator();
1248
1249 // Any non-copy instruction is the defining instruction we're seeking.
1250 if (!Inst->isCopyLike() && !TII.isCopyLikeInstr(*Inst))
1251 break;
1252 State = GetRegAndSubreg(*Inst);
1253 };
1254
1255 // Helper lambda to apply additional subregister substitutions to a known
1256 // instruction/operand pair. Adds new (fake) substitutions so that we can
1257 // record the subregister. FIXME: this isn't very space efficient if multiple
1258 // values are tracked back through the same copies; cache something later.
1259 auto ApplySubregisters =
1261 for (unsigned Subreg : reverse(SubregsSeen)) {
1262 // Fetch a new instruction number, not attached to an actual instruction.
1263 unsigned NewInstrNumber = getNewDebugInstrNum();
1264 // Add a substitution from the "new" number to the known one, with a
1265 // qualifying subreg.
1266 makeDebugValueSubstitution({NewInstrNumber, 0}, P, Subreg);
1267 // Return the new number; to find the underlying value, consumers need to
1268 // deal with the qualifying subreg.
1269 P = {NewInstrNumber, 0};
1270 }
1271 return P;
1272 };
1273
1274 // If we managed to find the defining instruction after COPYs, return an
1275 // instruction / operand pair after adding subregister qualifiers.
1276 if (State.first.isVirtual()) {
1277 // Virtual register def -- we can just look up where this happens.
1278 MachineInstr *Inst = MRI.getVRegDef(State.first);
1279 for (auto &MO : Inst->all_defs()) {
1280 if (MO.getReg() != State.first)
1281 continue;
1282 return ApplySubregisters({Inst->getDebugInstrNum(), MO.getOperandNo()});
1283 }
1284
1285 llvm_unreachable("Vreg def with no corresponding operand?");
1286 }
1287
1288 // Our search ended in a copy from a physreg: walk back up the function
1289 // looking for whatever defines the physreg.
1290 assert(CurInst->isCopyLike() || TII.isCopyInstr(*CurInst));
1291 State = GetRegAndSubreg(*CurInst);
1292 Register RegToSeek = State.first;
1293
1294 auto RMII = CurInst->getReverseIterator();
1295 auto PrevInstrs = make_range(RMII, CurInst->getParent()->instr_rend());
1296 for (auto &ToExamine : PrevInstrs) {
1297 for (auto &MO : ToExamine.all_defs()) {
1298 // Test for operand that defines something aliasing RegToSeek.
1299 if (!TRI.regsOverlap(RegToSeek, MO.getReg()))
1300 continue;
1301
1302 return ApplySubregisters(
1303 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1304 }
1305 }
1306
1307 MachineBasicBlock &InsertBB = *CurInst->getParent();
1308
1309 // We reached the start of the block before finding a defining instruction.
1310 // There are numerous scenarios where this can happen:
1311 // * Constant physical registers,
1312 // * Several intrinsics that allow LLVM-IR to read arbitary registers,
1313 // * Arguments in the entry block,
1314 // * Exception handling landing pads.
1315 // Validating all of them is too difficult, so just insert a DBG_PHI reading
1316 // the variable value at this position, rather than checking it makes sense.
1317
1318 // Create DBG_PHI for specified physreg.
1319 auto Builder = BuildMI(InsertBB, InsertBB.getFirstNonPHI(), DebugLoc(),
1320 TII.get(TargetOpcode::DBG_PHI));
1321 Builder.addReg(State.first);
1322 unsigned NewNum = getNewDebugInstrNum();
1323 Builder.addImm(NewNum);
1324 return ApplySubregisters({NewNum, 0u});
1325}
1326
1328 auto *TII = getSubtarget().getInstrInfo();
1329
1330 auto MakeUndefDbgValue = [&](MachineInstr &MI) {
1331 const MCInstrDesc &RefII = TII->get(TargetOpcode::DBG_VALUE_LIST);
1332 MI.setDesc(RefII);
1333 MI.setDebugValueUndef();
1334 };
1335
1337 for (auto &MBB : *this) {
1338 for (auto &MI : MBB) {
1339 if (!MI.isDebugRef())
1340 continue;
1341
1342 bool IsValidRef = true;
1343
1344 for (MachineOperand &MO : MI.debug_operands()) {
1345 if (!MO.isReg())
1346 continue;
1347
1348 Register Reg = MO.getReg();
1349
1350 // Some vregs can be deleted as redundant in the meantime. Mark those
1351 // as DBG_VALUE $noreg. Additionally, some normal instructions are
1352 // quickly deleted, leaving dangling references to vregs with no def.
1353 if (Reg == 0 || !RegInfo->hasOneDef(Reg)) {
1354 IsValidRef = false;
1355 break;
1356 }
1357
1358 assert(Reg.isVirtual());
1359 MachineInstr &DefMI = *RegInfo->def_instr_begin(Reg);
1360
1361 // If we've found a copy-like instruction, follow it back to the
1362 // instruction that defines the source value, see salvageCopySSA docs
1363 // for why this is important.
1364 if (DefMI.isCopyLike() || TII->isCopyInstr(DefMI)) {
1365 auto Result = salvageCopySSA(DefMI, ArgDbgPHIs);
1366 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1367 } else {
1368 // Otherwise, identify the operand number that the VReg refers to.
1369 unsigned OperandIdx = 0;
1370 for (const auto &DefMO : DefMI.operands()) {
1371 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() == Reg)
1372 break;
1373 ++OperandIdx;
1374 }
1375 assert(OperandIdx < DefMI.getNumOperands());
1376
1377 // Morph this instr ref to point at the given instruction and operand.
1378 unsigned ID = DefMI.getDebugInstrNum();
1379 MO.ChangeToDbgInstrRef(ID, OperandIdx);
1380 }
1381 }
1382
1383 if (!IsValidRef)
1384 MakeUndefDbgValue(MI);
1385 }
1386 }
1387}
1388
1390 // Disable instr-ref at -O0: it's very slow (in compile time). We can still
1391 // have optimized code inlined into this unoptimized code, however with
1392 // fewer and less aggressive optimizations happening, coverage and accuracy
1393 // should not suffer.
1394 if (getTarget().getOptLevel() == CodeGenOptLevel::None)
1395 return false;
1396
1397 // Don't use instr-ref if this function is marked optnone.
1398 if (F.hasFnAttribute(Attribute::OptimizeNone))
1399 return false;
1400
1401 if (llvm::debuginfoShouldUseDebugInstrRef(getTarget().getTargetTriple()))
1402 return true;
1403
1404 return false;
1405}
1406
1408 return UseDebugInstrRef;
1409}
1410
1414
1415// Use one million as a high / reserved number.
1416const unsigned MachineFunction::DebugOperandMemNumber = 1000000;
1417
1418/// \}
1419
1420//===----------------------------------------------------------------------===//
1421// MachineJumpTableInfo implementation
1422//===----------------------------------------------------------------------===//
1423
1425 const std::vector<MachineBasicBlock *> &MBBs)
1427
1428/// Return the size of each entry in the jump table.
1430 // The size of a jump table entry is 4 bytes unless the entry is just the
1431 // address of a block, in which case it is the pointer size.
1432 switch (getEntryKind()) {
1434 return TD.getPointerSize();
1437 return 8;
1441 return 4;
1443 return 0;
1444 }
1445 llvm_unreachable("Unknown jump table encoding!");
1446}
1447
1448/// Return the alignment of each entry in the jump table.
1450 // The alignment of a jump table entry is the alignment of int32 unless the
1451 // entry is just the address of a block, in which case it is the pointer
1452 // alignment.
1453 switch (getEntryKind()) {
1455 return TD.getPointerABIAlignment(0).value();
1458 return TD.getABIIntegerTypeAlignment(64).value();
1462 return TD.getABIIntegerTypeAlignment(32).value();
1464 return 1;
1465 }
1466 llvm_unreachable("Unknown jump table encoding!");
1467}
1468
1469/// Create a new jump table entry in the jump table info.
1471 const std::vector<MachineBasicBlock*> &DestBBs) {
1472 assert(!DestBBs.empty() && "Cannot create an empty jump table!");
1473 JumpTables.push_back(MachineJumpTableEntry(DestBBs));
1474 return JumpTables.size()-1;
1475}
1476
1478 size_t JTI, MachineFunctionDataHotness Hotness) {
1479 assert(JTI < JumpTables.size() && "Invalid JTI!");
1480 // Record the largest hotness value.
1481 if (Hotness <= JumpTables[JTI].Hotness)
1482 return false;
1483
1484 JumpTables[JTI].Hotness = Hotness;
1485 return true;
1486}
1487
1488/// If Old is the target of any jump tables, update the jump tables to branch
1489/// to New instead.
1491 MachineBasicBlock *New) {
1492 assert(Old != New && "Not making a change?");
1493 bool MadeChange = false;
1494 for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
1495 ReplaceMBBInJumpTable(i, Old, New);
1496 return MadeChange;
1497}
1498
1499/// If MBB is present in any jump tables, remove it.
1501 bool MadeChange = false;
1502 for (MachineJumpTableEntry &JTE : JumpTables) {
1503 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(), MBB);
1504 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1505 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1506 }
1507 return MadeChange;
1508}
1509
1510/// If Old is a target of the jump tables, update the jump table to branch to
1511/// New instead.
1513 MachineBasicBlock *Old,
1514 MachineBasicBlock *New) {
1515 assert(Old != New && "Not making a change?");
1516 bool MadeChange = false;
1517 MachineJumpTableEntry &JTE = JumpTables[Idx];
1518 for (MachineBasicBlock *&MBB : JTE.MBBs)
1519 if (MBB == Old) {
1520 MBB = New;
1521 MadeChange = true;
1522 }
1523 return MadeChange;
1524}
1525
1527 if (JumpTables.empty()) return;
1528
1529 OS << "Jump Tables:\n";
1530
1531 for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1532 OS << printJumpTableEntryReference(i) << ':';
1533 for (const MachineBasicBlock *MBB : JumpTables[i].MBBs)
1534 OS << ' ' << printMBBReference(*MBB);
1535 OS << '\n';
1536 }
1537
1538 OS << '\n';
1539}
1540
1541#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1543#endif
1544
1546 return Printable([Idx](raw_ostream &OS) { OS << "%jump-table." << Idx; });
1547}
1548
1549//===----------------------------------------------------------------------===//
1550// MachineConstantPool implementation
1551//===----------------------------------------------------------------------===//
1552
1553void MachineConstantPoolValue::anchor() {}
1554
1556 return DL.getTypeAllocSize(Ty);
1557}
1558
1561 return Val.MachineCPVal->getSizeInBytes(DL);
1562 return DL.getTypeAllocSize(Val.ConstVal->getType());
1563}
1564
1567 return true;
1568 return Val.ConstVal->needsDynamicRelocation();
1569}
1570
1573 if (needsRelocation())
1575 switch (getSizeInBytes(*DL)) {
1576 case 4:
1578 case 8:
1580 case 16:
1582 case 32:
1584 default:
1585 return SectionKind::getReadOnly();
1586 }
1587}
1588
1590 // A constant may be a member of both Constants and MachineCPVsSharingEntries,
1591 // so keep track of which we've deleted to avoid double deletions.
1593 for (const MachineConstantPoolEntry &C : Constants)
1594 if (C.isMachineConstantPoolEntry()) {
1595 Deleted.insert(C.Val.MachineCPVal);
1596 delete C.Val.MachineCPVal;
1597 }
1598 for (MachineConstantPoolValue *CPV : MachineCPVsSharingEntries) {
1599 if (Deleted.count(CPV) == 0)
1600 delete CPV;
1601 }
1602}
1603
1604/// Test whether the given two constants can be allocated the same constant pool
1605/// entry referenced by \param A.
1606static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
1607 const DataLayout &DL) {
1608 // Handle the trivial case quickly.
1609 if (A == B) return true;
1610
1611 // If they have the same type but weren't the same constant, quickly
1612 // reject them.
1613 if (A->getType() == B->getType()) return false;
1614
1615 // We can't handle structs or arrays.
1616 if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
1617 isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
1618 return false;
1619
1620 // For now, only support constants with the same size.
1621 uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
1622 if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
1623 return false;
1624
1625 bool ContainsUndefOrPoisonA = A->containsUndefOrPoisonElement();
1626
1627 Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
1628
1629 // Try constant folding a bitcast of both instructions to an integer. If we
1630 // get two identical ConstantInt's, then we are good to share them. We use
1631 // the constant folding APIs to do this so that we get the benefit of
1632 // DataLayout.
1633 if (isa<PointerType>(A->getType()))
1634 A = ConstantFoldCastOperand(Instruction::PtrToInt,
1635 const_cast<Constant *>(A), IntTy, DL);
1636 else if (A->getType() != IntTy)
1637 A = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(A),
1638 IntTy, DL);
1639 if (isa<PointerType>(B->getType()))
1640 B = ConstantFoldCastOperand(Instruction::PtrToInt,
1641 const_cast<Constant *>(B), IntTy, DL);
1642 else if (B->getType() != IntTy)
1643 B = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(B),
1644 IntTy, DL);
1645
1646 if (A != B)
1647 return false;
1648
1649 // Constants only safely match if A doesn't contain undef/poison.
1650 // As we'll be reusing A, it doesn't matter if B contain undef/poison.
1651 // TODO: Handle cases where A and B have the same undef/poison elements.
1652 // TODO: Merge A and B with mismatching undef/poison elements.
1653 return !ContainsUndefOrPoisonA;
1654}
1655
1656/// Create a new entry in the constant pool or return an existing one.
1657/// User must specify the log2 of the minimum required alignment for the object.
1659 Align Alignment) {
1660 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1661
1662 // Check to see if we already have this constant.
1663 //
1664 // FIXME, this could be made much more efficient for large constant pools.
1665 for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1666 if (!Constants[i].isMachineConstantPoolEntry() &&
1667 CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
1668 if (Constants[i].getAlign() < Alignment)
1669 Constants[i].Alignment = Alignment;
1670 return i;
1671 }
1672
1673 Constants.push_back(MachineConstantPoolEntry(C, Alignment));
1674 return Constants.size()-1;
1675}
1676
1678 Align Alignment) {
1679 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1680
1681 // Check to see if we already have this constant.
1682 //
1683 // FIXME, this could be made much more efficient for large constant pools.
1684 int Idx = V->getExistingMachineCPValue(this, Alignment);
1685 if (Idx != -1) {
1686 MachineCPVsSharingEntries.insert(V);
1687 return (unsigned)Idx;
1688 }
1689
1690 Constants.push_back(MachineConstantPoolEntry(V, Alignment));
1691 return Constants.size()-1;
1692}
1693
1695 if (Constants.empty()) return;
1696
1697 OS << "Constant Pool:\n";
1698 for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
1699 OS << " cp#" << i << ": ";
1700 if (Constants[i].isMachineConstantPoolEntry())
1701 Constants[i].Val.MachineCPVal->print(OS);
1702 else
1703 Constants[i].Val.ConstVal->printAsOperand(OS);
1704 OS << ", align=" << Constants[i].getAlign().value();
1705 OS << "\n";
1706 }
1707}
1708
1709//===----------------------------------------------------------------------===//
1710// Template specializations for MachineFunction implementations of
1711// ProfileSummaryInfo::getEntryCount() and ProfileSummaryInfo::hasHotAttr().
1712//===----------------------------------------------------------------------===//
1713template <>
1714std::optional<uint64_t>
1715ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1716 const llvm::MachineFunction *F) const {
1717 return F->getFunction().getEntryCount();
1718}
1719
1720template <>
1721bool ProfileSummaryInfo::hasHotAttr<llvm::MachineFunction>(
1722 const llvm::MachineFunction *F) const {
1723 return F->getFunction().hasFnAttribute(Attribute::Hot);
1724}
1725
1726#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1728#endif
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
uint64_t 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:682
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:262
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:44
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:766
iterator end()
Definition DenseMap.h:686
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:678
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
Definition Function.h:667
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:731
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:338
bool usesWindowsCFI() const
Returns true if the object format describes unwind information with Windows SEH unwind opcodes (....
Definition MCAsmInfo.h:672
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:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1435
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
A single uniqued string.
Definition Metadata.h:733
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:615
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)
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 ...
bool needsWinCFI() const
True if this function uses SEH unwind opcodes and needs an unwind table entry.
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,...
bool usesWindowsUnwindInfo() const
True if this function describes its unwind information with Windows SEH unwind opcodes (....
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.
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.
const MCAsmInfo & getMCAsmInfo() const
Return target specific asm information.
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:300
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:260
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:708
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
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:679
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:273
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:2224
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:408
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:149
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:1901
@ WinEH
Windows Exception Handling.
Definition CodeGen.h:60
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:206
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:774
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:82
static constexpr Align fromLog2(unsigned Log2Value)
Returns an alignment of 1 << Log2Value bytes.
Definition Alignment.h:73
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:111
static void deleteNode(NodeTy *V)
Definition ilist.h:42