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