LLVM 20.0.0git
MIRPrinter.cpp
Go to the documentation of this file.
1//===- MIRPrinter.cpp - MIR serialization format printer ------------------===//
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// This file implements the class that prints out the LLVM IR and machine
10// functions using the MIR serialization format.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/DenseMap.h"
16#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/StringRef.h"
38#include "llvm/IR/DebugLoc.h"
39#include "llvm/IR/Function.h"
42#include "llvm/IR/Module.h"
44#include "llvm/IR/Value.h"
45#include "llvm/MC/LaneBitmask.h"
50#include "llvm/Support/Format.h"
54#include <algorithm>
55#include <cassert>
56#include <cinttypes>
57#include <cstdint>
58#include <iterator>
59#include <string>
60#include <utility>
61#include <vector>
62
63using namespace llvm;
64
66 "simplify-mir", cl::Hidden,
67 cl::desc("Leave out unnecessary information when printing MIR"));
68
69static cl::opt<bool> PrintLocations("mir-debug-loc", cl::Hidden, cl::init(true),
70 cl::desc("Print MIR debug-locations"));
71
73
74namespace {
75
76/// This structure describes how to print out stack object references.
77struct FrameIndexOperand {
78 std::string Name;
79 unsigned ID;
80 bool IsFixed;
81
82 FrameIndexOperand(StringRef Name, unsigned ID, bool IsFixed)
83 : Name(Name.str()), ID(ID), IsFixed(IsFixed) {}
84
85 /// Return an ordinary stack object reference.
86 static FrameIndexOperand create(StringRef Name, unsigned ID) {
87 return FrameIndexOperand(Name, ID, /*IsFixed=*/false);
88 }
89
90 /// Return a fixed stack object reference.
91 static FrameIndexOperand createFixed(unsigned ID) {
92 return FrameIndexOperand("", ID, /*IsFixed=*/true);
93 }
94};
95
96} // end anonymous namespace
97
98namespace llvm {
99
100/// This class prints out the machine functions using the MIR serialization
101/// format.
103 raw_ostream &OS;
104 const MachineModuleInfo &MMI;
106 /// Maps from stack object indices to operand indices which will be used when
107 /// printing frame index machine operands.
108 DenseMap<int, FrameIndexOperand> StackObjectOperandMapping;
109
110public:
112 : OS(OS), MMI(MMI) {}
113
114 void print(const MachineFunction &MF);
115
116 void convert(yaml::MachineFunction &MF, const MachineRegisterInfo &RegInfo,
117 const TargetRegisterInfo *TRI);
119 const MachineFrameInfo &MFI);
123 const MachineJumpTableInfo &JTI);
125 const MachineFunction &MF, ModuleSlotTracker &MST);
127 const MachineFunction &MF,
128 ModuleSlotTracker &MST);
130 const MachineFunction &MF,
131 ModuleSlotTracker &MST);
133 const MachineFunction &MF,
135
136private:
137 void initRegisterMaskIds(const MachineFunction &MF);
138};
139
140/// This class prints out the machine instructions using the MIR serialization
141/// format.
143 raw_ostream &OS;
145 const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds;
146 const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping;
147 /// Synchronization scope names registered with LLVMContext.
149
150 bool canPredictBranchProbabilities(const MachineBasicBlock &MBB) const;
151 bool canPredictSuccessors(const MachineBasicBlock &MBB) const;
152
153public:
155 const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds,
156 const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping)
157 : OS(OS), MST(MST), RegisterMaskIds(RegisterMaskIds),
158 StackObjectOperandMapping(StackObjectOperandMapping) {}
159
160 void print(const MachineBasicBlock &MBB);
161
162 void print(const MachineInstr &MI);
163 void printStackObjectReference(int FrameIndex);
164 void print(const MachineInstr &MI, unsigned OpIdx,
166 bool ShouldPrintRegisterTies, LLT TypeToPrint,
167 bool PrintDef = true);
168};
169
170} // end namespace llvm
171
172namespace llvm {
173namespace yaml {
174
175/// This struct serializes the LLVM IR module.
176template <> struct BlockScalarTraits<Module> {
177 static void output(const Module &Mod, void *Ctxt, raw_ostream &OS) {
178 Mod.print(OS, nullptr);
179 }
180
181 static StringRef input(StringRef Str, void *Ctxt, Module &Mod) {
182 llvm_unreachable("LLVM Module is supposed to be parsed separately");
183 return "";
184 }
185};
186
187} // end namespace yaml
188} // end namespace llvm
189
190static void printRegMIR(unsigned Reg, yaml::StringValue &Dest,
191 const TargetRegisterInfo *TRI) {
193 OS << printReg(Reg, TRI);
194}
195
197 initRegisterMaskIds(MF);
198
200 YamlMF.Name = MF.getName();
201 YamlMF.Alignment = MF.getAlignment();
203 YamlMF.HasWinCFI = MF.hasWinCFI();
204
205 YamlMF.CallsEHReturn = MF.callsEHReturn();
206 YamlMF.CallsUnwindInit = MF.callsUnwindInit();
207 YamlMF.HasEHCatchret = MF.hasEHCatchret();
208 YamlMF.HasEHScopes = MF.hasEHScopes();
209 YamlMF.HasEHFunclets = MF.hasEHFunclets();
210 YamlMF.IsOutlined = MF.isOutlined();
212
213 YamlMF.Legalized = MF.getProperties().hasProperty(
217 YamlMF.Selected = MF.getProperties().hasProperty(
225
226 convert(YamlMF, MF.getRegInfo(), MF.getSubtarget().getRegisterInfo());
227 MachineModuleSlotTracker MST(MMI, &MF);
229 convert(MST, YamlMF.FrameInfo, MF.getFrameInfo());
230 convertStackObjects(YamlMF, MF, MST);
231 convertEntryValueObjects(YamlMF, MF, MST);
232 convertCallSiteObjects(YamlMF, MF, MST);
233 for (const auto &Sub : MF.DebugValueSubstitutions) {
234 const auto &SubSrc = Sub.Src;
235 const auto &SubDest = Sub.Dest;
236 YamlMF.DebugValueSubstitutions.push_back({SubSrc.first, SubSrc.second,
237 SubDest.first,
238 SubDest.second,
239 Sub.Subreg});
240 }
241 if (const auto *ConstantPool = MF.getConstantPool())
242 convert(YamlMF, *ConstantPool);
243 if (const auto *JumpTableInfo = MF.getJumpTableInfo())
244 convert(MST, YamlMF.JumpTableInfo, *JumpTableInfo);
245
246 const TargetMachine &TM = MF.getTarget();
247 YamlMF.MachineFuncInfo =
248 std::unique_ptr<yaml::MachineFunctionInfo>(TM.convertFuncInfoToYAML(MF));
249
250 raw_string_ostream StrOS(YamlMF.Body.Value.Value);
251 bool IsNewlineNeeded = false;
252 for (const auto &MBB : MF) {
253 if (IsNewlineNeeded)
254 StrOS << "\n";
255 MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
256 .print(MBB);
257 IsNewlineNeeded = true;
258 }
259 StrOS.flush();
260 // Convert machine metadata collected during the print of the machine
261 // function.
262 convertMachineMetadataNodes(YamlMF, MF, MST);
263
264 yaml::Output Out(OS);
265 if (!SimplifyMIR)
266 Out.setWriteDefaultValues(true);
267 Out << YamlMF;
268}
269
270static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS,
271 const TargetRegisterInfo *TRI) {
272 assert(RegMask && "Can't print an empty register mask");
273 OS << StringRef("CustomRegMask(");
274
275 bool IsRegInRegMaskFound = false;
276 for (int I = 0, E = TRI->getNumRegs(); I < E; I++) {
277 // Check whether the register is asserted in regmask.
278 if (RegMask[I / 32] & (1u << (I % 32))) {
279 if (IsRegInRegMaskFound)
280 OS << ',';
281 OS << printReg(I, TRI);
282 IsRegInRegMaskFound = true;
283 }
284 }
285
286 OS << ')';
287}
288
289static void printRegClassOrBank(unsigned Reg, yaml::StringValue &Dest,
291 const TargetRegisterInfo *TRI) {
294}
295
296template <typename T>
297static void
299 T &Object, ModuleSlotTracker &MST) {
300 std::array<std::string *, 3> Outputs{{&Object.DebugVar.Value,
301 &Object.DebugExpr.Value,
302 &Object.DebugLoc.Value}};
303 std::array<const Metadata *, 3> Metas{{DebugVar.Var,
304 DebugVar.Expr,
305 DebugVar.Loc}};
306 for (unsigned i = 0; i < 3; ++i) {
307 raw_string_ostream StrOS(*Outputs[i]);
308 Metas[i]->printAsOperand(StrOS, MST);
309 }
310}
311
313 const MachineRegisterInfo &RegInfo,
314 const TargetRegisterInfo *TRI) {
315 MF.TracksRegLiveness = RegInfo.tracksLiveness();
316
317 // Print the virtual register definitions.
318 for (unsigned I = 0, E = RegInfo.getNumVirtRegs(); I < E; ++I) {
321 VReg.ID = I;
322 if (RegInfo.getVRegName(Reg) != "")
323 continue;
324 ::printRegClassOrBank(Reg, VReg.Class, RegInfo, TRI);
325 Register PreferredReg = RegInfo.getSimpleHint(Reg);
326 if (PreferredReg)
327 printRegMIR(PreferredReg, VReg.PreferredRegister, TRI);
328 MF.VirtualRegisters.push_back(VReg);
329 }
330
331 // Print the live ins.
332 for (std::pair<unsigned, unsigned> LI : RegInfo.liveins()) {
334 printRegMIR(LI.first, LiveIn.Register, TRI);
335 if (LI.second)
336 printRegMIR(LI.second, LiveIn.VirtualRegister, TRI);
337 MF.LiveIns.push_back(LiveIn);
338 }
339
340 // Prints the callee saved registers.
341 if (RegInfo.isUpdatedCSRsInitialized()) {
342 const MCPhysReg *CalleeSavedRegs = RegInfo.getCalleeSavedRegs();
343 std::vector<yaml::FlowStringValue> CalleeSavedRegisters;
344 for (const MCPhysReg *I = CalleeSavedRegs; *I; ++I) {
346 printRegMIR(*I, Reg, TRI);
347 CalleeSavedRegisters.push_back(Reg);
348 }
349 MF.CalleeSavedRegisters = CalleeSavedRegisters;
350 }
351}
352
354 yaml::MachineFrameInfo &YamlMFI,
355 const MachineFrameInfo &MFI) {
358 YamlMFI.HasStackMap = MFI.hasStackMap();
359 YamlMFI.HasPatchPoint = MFI.hasPatchPoint();
360 YamlMFI.StackSize = MFI.getStackSize();
362 YamlMFI.MaxAlignment = MFI.getMaxAlign().value();
363 YamlMFI.AdjustsStack = MFI.adjustsStack();
364 YamlMFI.HasCalls = MFI.hasCalls();
366 ? MFI.getMaxCallFrameSize() : ~0u;
370 YamlMFI.HasVAStart = MFI.hasVAStart();
372 YamlMFI.HasTailCall = MFI.hasTailCall();
374 YamlMFI.LocalFrameSize = MFI.getLocalFrameSize();
375 if (MFI.getSavePoint()) {
376 raw_string_ostream StrOS(YamlMFI.SavePoint.Value);
377 StrOS << printMBBReference(*MFI.getSavePoint());
378 }
379 if (MFI.getRestorePoint()) {
381 StrOS << printMBBReference(*MFI.getRestorePoint());
382 }
383}
384
386 const MachineFunction &MF,
387 ModuleSlotTracker &MST) {
389 for (const MachineFunction::VariableDbgInfo &DebugVar :
391 yaml::EntryValueObject &Obj = YMF.EntryValueObjects.emplace_back();
392 printStackObjectDbgInfo(DebugVar, Obj, MST);
393 MCRegister EntryValReg = DebugVar.getEntryValueRegister();
394 printRegMIR(EntryValReg, Obj.EntryValueRegister, TRI);
395 }
396}
397
399 const MachineFunction &MF,
400 ModuleSlotTracker &MST) {
401 const MachineFrameInfo &MFI = MF.getFrameInfo();
403
404 // Process fixed stack objects.
405 assert(YMF.FixedStackObjects.empty());
406 SmallVector<int, 32> FixedStackObjectsIdx;
407 const int BeginIdx = MFI.getObjectIndexBegin();
408 if (BeginIdx < 0)
409 FixedStackObjectsIdx.reserve(-BeginIdx);
410
411 unsigned ID = 0;
412 for (int I = BeginIdx; I < 0; ++I, ++ID) {
413 FixedStackObjectsIdx.push_back(-1); // Fill index for possible dead.
414 if (MFI.isDeadObjectIndex(I))
415 continue;
416
418 YamlObject.ID = ID;
419 YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
422 YamlObject.Offset = MFI.getObjectOffset(I);
423 YamlObject.Size = MFI.getObjectSize(I);
424 YamlObject.Alignment = MFI.getObjectAlign(I);
425 YamlObject.StackID = (TargetStackID::Value)MFI.getStackID(I);
426 YamlObject.IsImmutable = MFI.isImmutableObjectIndex(I);
427 YamlObject.IsAliased = MFI.isAliasedObjectIndex(I);
428 // Save the ID' position in FixedStackObjects storage vector.
429 FixedStackObjectsIdx[ID] = YMF.FixedStackObjects.size();
430 YMF.FixedStackObjects.push_back(YamlObject);
431 StackObjectOperandMapping.insert(
432 std::make_pair(I, FrameIndexOperand::createFixed(ID)));
433 }
434
435 // Process ordinary stack objects.
436 assert(YMF.StackObjects.empty());
437 SmallVector<unsigned, 32> StackObjectsIdx;
438 const int EndIdx = MFI.getObjectIndexEnd();
439 if (EndIdx > 0)
440 StackObjectsIdx.reserve(EndIdx);
441 ID = 0;
442 for (int I = 0; I < EndIdx; ++I, ++ID) {
443 StackObjectsIdx.push_back(-1); // Fill index for possible dead.
444 if (MFI.isDeadObjectIndex(I))
445 continue;
446
447 yaml::MachineStackObject YamlObject;
448 YamlObject.ID = ID;
449 if (const auto *Alloca = MFI.getObjectAllocation(I))
450 YamlObject.Name.Value = std::string(
451 Alloca->hasName() ? Alloca->getName() : "");
452 YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
457 YamlObject.Offset = MFI.getObjectOffset(I);
458 YamlObject.Size = MFI.getObjectSize(I);
459 YamlObject.Alignment = MFI.getObjectAlign(I);
460 YamlObject.StackID = (TargetStackID::Value)MFI.getStackID(I);
461
462 // Save the ID' position in StackObjects storage vector.
463 StackObjectsIdx[ID] = YMF.StackObjects.size();
464 YMF.StackObjects.push_back(YamlObject);
465 StackObjectOperandMapping.insert(std::make_pair(
466 I, FrameIndexOperand::create(YamlObject.Name.Value, ID)));
467 }
468
469 for (const auto &CSInfo : MFI.getCalleeSavedInfo()) {
470 const int FrameIdx = CSInfo.getFrameIdx();
471 if (!CSInfo.isSpilledToReg() && MFI.isDeadObjectIndex(FrameIdx))
472 continue;
473
475 printRegMIR(CSInfo.getReg(), Reg, TRI);
476 if (!CSInfo.isSpilledToReg()) {
477 assert(FrameIdx >= MFI.getObjectIndexBegin() &&
478 FrameIdx < MFI.getObjectIndexEnd() &&
479 "Invalid stack object index");
480 if (FrameIdx < 0) { // Negative index means fixed objects.
481 auto &Object =
483 [FixedStackObjectsIdx[FrameIdx + MFI.getNumFixedObjects()]];
484 Object.CalleeSavedRegister = Reg;
485 Object.CalleeSavedRestored = CSInfo.isRestored();
486 } else {
487 auto &Object = YMF.StackObjects[StackObjectsIdx[FrameIdx]];
488 Object.CalleeSavedRegister = Reg;
489 Object.CalleeSavedRestored = CSInfo.isRestored();
490 }
491 }
492 }
493 for (unsigned I = 0, E = MFI.getLocalFrameObjectCount(); I < E; ++I) {
494 auto LocalObject = MFI.getLocalFrameObjectMap(I);
495 assert(LocalObject.first >= 0 && "Expected a locally mapped stack object");
496 YMF.StackObjects[StackObjectsIdx[LocalObject.first]].LocalOffset =
497 LocalObject.second;
498 }
499
500 // Print the stack object references in the frame information class after
501 // converting the stack objects.
502 if (MFI.hasStackProtectorIndex()) {
504 MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
506 }
507
508 if (MFI.hasFunctionContextIndex()) {
510 MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
512 }
513
514 // Print the debug variable information.
515 for (const MachineFunction::VariableDbgInfo &DebugVar :
517 int Idx = DebugVar.getStackSlot();
518 assert(Idx >= MFI.getObjectIndexBegin() && Idx < MFI.getObjectIndexEnd() &&
519 "Invalid stack object index");
520 if (Idx < 0) { // Negative index means fixed objects.
521 auto &Object =
522 YMF.FixedStackObjects[FixedStackObjectsIdx[Idx +
523 MFI.getNumFixedObjects()]];
524 printStackObjectDbgInfo(DebugVar, Object, MST);
525 } else {
526 auto &Object = YMF.StackObjects[StackObjectsIdx[Idx]];
527 printStackObjectDbgInfo(DebugVar, Object, MST);
528 }
529 }
530}
531
533 const MachineFunction &MF,
534 ModuleSlotTracker &MST) {
535 const auto *TRI = MF.getSubtarget().getRegisterInfo();
536 for (auto CSInfo : MF.getCallSitesInfo()) {
537 yaml::CallSiteInfo YmlCS;
539
540 // Prepare instruction position.
541 MachineBasicBlock::const_instr_iterator CallI = CSInfo.first->getIterator();
542 CallLocation.BlockNum = CallI->getParent()->getNumber();
543 // Get call instruction offset from the beginning of block.
544 CallLocation.Offset =
545 std::distance(CallI->getParent()->instr_begin(), CallI);
546 YmlCS.CallLocation = CallLocation;
547 // Construct call arguments and theirs forwarding register info.
548 for (auto ArgReg : CSInfo.second.ArgRegPairs) {
550 YmlArgReg.ArgNo = ArgReg.ArgNo;
551 printRegMIR(ArgReg.Reg, YmlArgReg.Reg, TRI);
552 YmlCS.ArgForwardingRegs.emplace_back(YmlArgReg);
553 }
554 YMF.CallSitesInfo.push_back(YmlCS);
555 }
556
557 // Sort call info by position of call instructions.
558 llvm::sort(YMF.CallSitesInfo.begin(), YMF.CallSitesInfo.end(),
560 if (A.CallLocation.BlockNum == B.CallLocation.BlockNum)
561 return A.CallLocation.Offset < B.CallLocation.Offset;
562 return A.CallLocation.BlockNum < B.CallLocation.BlockNum;
563 });
564}
565
567 const MachineFunction &MF,
570 MST.collectMachineMDNodes(MDList);
571 for (auto &MD : MDList) {
572 std::string NS;
573 raw_string_ostream StrOS(NS);
574 MD.second->print(StrOS, MST, MF.getFunction().getParent());
575 YMF.MachineMetadataNodes.push_back(NS);
576 }
577}
578
581 unsigned ID = 0;
582 for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) {
583 std::string Str;
584 raw_string_ostream StrOS(Str);
585 if (Constant.isMachineConstantPoolEntry()) {
586 Constant.Val.MachineCPVal->print(StrOS);
587 } else {
588 Constant.Val.ConstVal->printAsOperand(StrOS);
589 }
590
592 YamlConstant.ID = ID++;
593 YamlConstant.Value = Str;
594 YamlConstant.Alignment = Constant.getAlign();
595 YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry();
596
597 MF.Constants.push_back(YamlConstant);
598 }
599}
600
602 yaml::MachineJumpTable &YamlJTI,
603 const MachineJumpTableInfo &JTI) {
604 YamlJTI.Kind = JTI.getEntryKind();
605 unsigned ID = 0;
606 for (const auto &Table : JTI.getJumpTables()) {
607 std::string Str;
609 Entry.ID = ID++;
610 for (const auto *MBB : Table.MBBs) {
611 raw_string_ostream StrOS(Str);
612 StrOS << printMBBReference(*MBB);
613 Entry.Blocks.push_back(Str);
614 Str.clear();
615 }
616 YamlJTI.Entries.push_back(Entry);
617 }
618}
619
620void MIRPrinter::initRegisterMaskIds(const MachineFunction &MF) {
621 const auto *TRI = MF.getSubtarget().getRegisterInfo();
622 unsigned I = 0;
623 for (const uint32_t *Mask : TRI->getRegMasks())
624 RegisterMaskIds.insert(std::make_pair(Mask, I++));
625}
626
629 bool &IsFallthrough) {
631
632 for (const MachineInstr &MI : MBB) {
633 if (MI.isPHI())
634 continue;
635 for (const MachineOperand &MO : MI.operands()) {
636 if (!MO.isMBB())
637 continue;
638 MachineBasicBlock *Succ = MO.getMBB();
639 auto RP = Seen.insert(Succ);
640 if (RP.second)
641 Result.push_back(Succ);
642 }
643 }
645 IsFallthrough = I == MBB.end() || !I->isBarrier();
646}
647
648bool
649MIPrinter::canPredictBranchProbabilities(const MachineBasicBlock &MBB) const {
650 if (MBB.succ_size() <= 1)
651 return true;
653 return true;
654
655 SmallVector<BranchProbability,8> Normalized(MBB.Probs.begin(),
656 MBB.Probs.end());
658 Normalized.end());
659 SmallVector<BranchProbability,8> Equal(Normalized.size());
660 BranchProbability::normalizeProbabilities(Equal.begin(), Equal.end());
661
662 return std::equal(Normalized.begin(), Normalized.end(), Equal.begin());
663}
664
665bool MIPrinter::canPredictSuccessors(const MachineBasicBlock &MBB) const {
667 bool GuessedFallthrough;
668 guessSuccessors(MBB, GuessedSuccs, GuessedFallthrough);
669 if (GuessedFallthrough) {
670 const MachineFunction &MF = *MBB.getParent();
672 if (NextI != MF.end()) {
673 MachineBasicBlock *Next = const_cast<MachineBasicBlock*>(&*NextI);
674 if (!is_contained(GuessedSuccs, Next))
675 GuessedSuccs.push_back(Next);
676 }
677 }
678 if (GuessedSuccs.size() != MBB.succ_size())
679 return false;
680 return std::equal(MBB.succ_begin(), MBB.succ_end(), GuessedSuccs.begin());
681}
682
684 assert(MBB.getNumber() >= 0 && "Invalid MBB number");
685 MBB.printName(OS,
688 &MST);
689 OS << ":\n";
690
691 bool HasLineAttributes = false;
692 // Print the successors
693 bool canPredictProbs = canPredictBranchProbabilities(MBB);
694 // Even if the list of successors is empty, if we cannot guess it,
695 // we need to print it to tell the parser that the list is empty.
696 // This is needed, because MI model unreachable as empty blocks
697 // with an empty successor list. If the parser would see that
698 // without the successor list, it would guess the code would
699 // fallthrough.
700 if ((!MBB.succ_empty() && !SimplifyMIR) || !canPredictProbs ||
701 !canPredictSuccessors(MBB)) {
702 OS.indent(2) << "successors:";
703 if (!MBB.succ_empty())
704 OS << " ";
705 for (auto I = MBB.succ_begin(), E = MBB.succ_end(); I != E; ++I) {
706 if (I != MBB.succ_begin())
707 OS << ", ";
708 OS << printMBBReference(**I);
709 if (!SimplifyMIR || !canPredictProbs)
710 OS << '('
711 << format("0x%08" PRIx32, MBB.getSuccProbability(I).getNumerator())
712 << ')';
713 }
714 OS << "\n";
715 HasLineAttributes = true;
716 }
717
718 // Print the live in registers.
720 if (!MBB.livein_empty()) {
721 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
722 OS.indent(2) << "liveins: ";
723 bool First = true;
724 for (const auto &LI : MBB.liveins_dbg()) {
725 if (!First)
726 OS << ", ";
727 First = false;
728 OS << printReg(LI.PhysReg, &TRI);
729 if (!LI.LaneMask.all())
730 OS << ":0x" << PrintLaneMask(LI.LaneMask);
731 }
732 OS << "\n";
733 HasLineAttributes = true;
734 }
735
736 if (HasLineAttributes && !MBB.empty())
737 OS << "\n";
738 bool IsInBundle = false;
739 for (const MachineInstr &MI : MBB.instrs()) {
740 if (IsInBundle && !MI.isInsideBundle()) {
741 OS.indent(2) << "}\n";
742 IsInBundle = false;
743 }
744 OS.indent(IsInBundle ? 4 : 2);
745 print(MI);
746 if (!IsInBundle && MI.getFlag(MachineInstr::BundledSucc)) {
747 OS << " {";
748 IsInBundle = true;
749 }
750 OS << "\n";
751 }
752 if (IsInBundle)
753 OS.indent(2) << "}\n";
754}
755
757 const auto *MF = MI.getMF();
758 const auto &MRI = MF->getRegInfo();
759 const auto &SubTarget = MF->getSubtarget();
760 const auto *TRI = SubTarget.getRegisterInfo();
761 assert(TRI && "Expected target register info");
762 const auto *TII = SubTarget.getInstrInfo();
763 assert(TII && "Expected target instruction info");
764 if (MI.isCFIInstruction())
765 assert(MI.getNumOperands() == 1 && "Expected 1 operand in CFI instruction");
766
767 SmallBitVector PrintedTypes(8);
768 bool ShouldPrintRegisterTies = MI.hasComplexRegisterTies();
769 unsigned I = 0, E = MI.getNumOperands();
770 for (; I < E && MI.getOperand(I).isReg() && MI.getOperand(I).isDef() &&
771 !MI.getOperand(I).isImplicit();
772 ++I) {
773 if (I)
774 OS << ", ";
775 print(MI, I, TRI, TII, ShouldPrintRegisterTies,
776 MI.getTypeToPrint(I, PrintedTypes, MRI),
777 /*PrintDef=*/false);
778 }
779
780 if (I)
781 OS << " = ";
782 if (MI.getFlag(MachineInstr::FrameSetup))
783 OS << "frame-setup ";
784 if (MI.getFlag(MachineInstr::FrameDestroy))
785 OS << "frame-destroy ";
786 if (MI.getFlag(MachineInstr::FmNoNans))
787 OS << "nnan ";
788 if (MI.getFlag(MachineInstr::FmNoInfs))
789 OS << "ninf ";
790 if (MI.getFlag(MachineInstr::FmNsz))
791 OS << "nsz ";
792 if (MI.getFlag(MachineInstr::FmArcp))
793 OS << "arcp ";
794 if (MI.getFlag(MachineInstr::FmContract))
795 OS << "contract ";
796 if (MI.getFlag(MachineInstr::FmAfn))
797 OS << "afn ";
798 if (MI.getFlag(MachineInstr::FmReassoc))
799 OS << "reassoc ";
800 if (MI.getFlag(MachineInstr::NoUWrap))
801 OS << "nuw ";
802 if (MI.getFlag(MachineInstr::NoSWrap))
803 OS << "nsw ";
804 if (MI.getFlag(MachineInstr::IsExact))
805 OS << "exact ";
806 if (MI.getFlag(MachineInstr::NoFPExcept))
807 OS << "nofpexcept ";
808 if (MI.getFlag(MachineInstr::NoMerge))
809 OS << "nomerge ";
810 if (MI.getFlag(MachineInstr::Unpredictable))
811 OS << "unpredictable ";
812 if (MI.getFlag(MachineInstr::NoConvergent))
813 OS << "noconvergent ";
814 if (MI.getFlag(MachineInstr::NonNeg))
815 OS << "nneg ";
816 if (MI.getFlag(MachineInstr::Disjoint))
817 OS << "disjoint ";
818 if (MI.getFlag(MachineInstr::NoUSWrap))
819 OS << "nusw ";
820
821 OS << TII->getName(MI.getOpcode());
822 if (I < E)
823 OS << ' ';
824
825 bool NeedComma = false;
826 for (; I < E; ++I) {
827 if (NeedComma)
828 OS << ", ";
829 print(MI, I, TRI, TII, ShouldPrintRegisterTies,
830 MI.getTypeToPrint(I, PrintedTypes, MRI));
831 NeedComma = true;
832 }
833
834 // Print any optional symbols attached to this instruction as-if they were
835 // operands.
836 if (MCSymbol *PreInstrSymbol = MI.getPreInstrSymbol()) {
837 if (NeedComma)
838 OS << ',';
839 OS << " pre-instr-symbol ";
840 MachineOperand::printSymbol(OS, *PreInstrSymbol);
841 NeedComma = true;
842 }
843 if (MCSymbol *PostInstrSymbol = MI.getPostInstrSymbol()) {
844 if (NeedComma)
845 OS << ',';
846 OS << " post-instr-symbol ";
847 MachineOperand::printSymbol(OS, *PostInstrSymbol);
848 NeedComma = true;
849 }
850 if (MDNode *HeapAllocMarker = MI.getHeapAllocMarker()) {
851 if (NeedComma)
852 OS << ',';
853 OS << " heap-alloc-marker ";
854 HeapAllocMarker->printAsOperand(OS, MST);
855 NeedComma = true;
856 }
857 if (MDNode *PCSections = MI.getPCSections()) {
858 if (NeedComma)
859 OS << ',';
860 OS << " pcsections ";
861 PCSections->printAsOperand(OS, MST);
862 NeedComma = true;
863 }
864 if (MDNode *MMRA = MI.getMMRAMetadata()) {
865 if (NeedComma)
866 OS << ',';
867 OS << " mmra ";
868 MMRA->printAsOperand(OS, MST);
869 NeedComma = true;
870 }
871 if (uint32_t CFIType = MI.getCFIType()) {
872 if (NeedComma)
873 OS << ',';
874 OS << " cfi-type " << CFIType;
875 NeedComma = true;
876 }
877
878 if (auto Num = MI.peekDebugInstrNum()) {
879 if (NeedComma)
880 OS << ',';
881 OS << " debug-instr-number " << Num;
882 NeedComma = true;
883 }
884
885 if (PrintLocations) {
886 if (const DebugLoc &DL = MI.getDebugLoc()) {
887 if (NeedComma)
888 OS << ',';
889 OS << " debug-location ";
890 DL->printAsOperand(OS, MST);
891 }
892 }
893
894 if (!MI.memoperands_empty()) {
895 OS << " :: ";
896 const LLVMContext &Context = MF->getFunction().getContext();
897 const MachineFrameInfo &MFI = MF->getFrameInfo();
898 bool NeedComma = false;
899 for (const auto *Op : MI.memoperands()) {
900 if (NeedComma)
901 OS << ", ";
902 Op->print(OS, MST, SSNs, Context, &MFI, TII);
903 NeedComma = true;
904 }
905 }
906}
907
909 auto ObjectInfo = StackObjectOperandMapping.find(FrameIndex);
910 assert(ObjectInfo != StackObjectOperandMapping.end() &&
911 "Invalid frame index");
912 const FrameIndexOperand &Operand = ObjectInfo->second;
913 MachineOperand::printStackObjectReference(OS, Operand.ID, Operand.IsFixed,
914 Operand.Name);
915}
916
917static std::string formatOperandComment(std::string Comment) {
918 if (Comment.empty())
919 return Comment;
920 return std::string(" /* " + Comment + " */");
921}
922
923void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx,
924 const TargetRegisterInfo *TRI,
925 const TargetInstrInfo *TII,
926 bool ShouldPrintRegisterTies, LLT TypeToPrint,
927 bool PrintDef) {
928 const MachineOperand &Op = MI.getOperand(OpIdx);
929 std::string MOComment = TII->createMIROperandComment(MI, Op, OpIdx, TRI);
930
931 switch (Op.getType()) {
933 if (MI.isOperandSubregIdx(OpIdx)) {
936 break;
937 }
938 [[fallthrough]];
957 unsigned TiedOperandIdx = 0;
958 if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef())
959 TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx);
960 const TargetIntrinsicInfo *TII = MI.getMF()->getTarget().getIntrinsicInfo();
961 Op.print(OS, MST, TypeToPrint, OpIdx, PrintDef, /*IsStandalone=*/false,
962 ShouldPrintRegisterTies, TiedOperandIdx, TRI, TII);
963 OS << formatOperandComment(MOComment);
964 break;
965 }
967 printStackObjectReference(Op.getIndex());
968 break;
970 auto RegMaskInfo = RegisterMaskIds.find(Op.getRegMask());
971 if (RegMaskInfo != RegisterMaskIds.end())
972 OS << StringRef(TRI->getRegMaskNames()[RegMaskInfo->second]).lower();
973 else
974 printCustomRegMask(Op.getRegMask(), OS, TRI);
975 break;
976 }
977 }
978}
979
981 ModuleSlotTracker &MST) {
982 if (isa<GlobalValue>(V)) {
983 V.printAsOperand(OS, /*PrintType=*/false, MST);
984 return;
985 }
986 if (isa<Constant>(V)) {
987 // Machine memory operands can load/store to/from constant value pointers.
988 OS << '`';
989 V.printAsOperand(OS, /*PrintType=*/true, MST);
990 OS << '`';
991 return;
992 }
993 OS << "%ir.";
994 if (V.hasName()) {
995 printLLVMNameWithoutPrefix(OS, V.getName());
996 return;
997 }
998 int Slot = MST.getCurrentFunction() ? MST.getLocalSlot(&V) : -1;
1000}
1001
1003 ScopedDbgInfoFormatSetter FormatSetter(const_cast<Module &>(M),
1005
1006 yaml::Output Out(OS);
1007 Out << const_cast<Module &>(M);
1008}
1009
1011 const MachineFunction &MF) {
1012 // RemoveDIs: as there's no textual form for DbgRecords yet, print debug-info
1013 // in dbg.value format.
1014 ScopedDbgInfoFormatSetter FormatSetter(
1015 const_cast<Function &>(MF.getFunction()), WriteNewDbgInfoFormat);
1016
1017 MIRPrinter Printer(OS, MMI);
1018 Printer.print(MF);
1019}
unsigned const MachineRegisterInfo * MRI
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
dxil pretty DXIL Metadata Pretty Printer
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
expand large fp convert
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file contains an interface for creating legacy passes to print out IR in various granularities.
cl::opt< bool > WriteNewDbgInfoFormat
A common definition of LaneBitmask for use in TableGen and CodeGen.
Implement a low-level type suitable for MachineInstr level instruction selection.
#define I(x, y, z)
Definition: MD5.cpp:58
static std::string formatOperandComment(std::string Comment)
Definition: MIRPrinter.cpp:917
static void printRegMIR(unsigned Reg, yaml::StringValue &Dest, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:190
static cl::opt< bool > PrintLocations("mir-debug-loc", cl::Hidden, cl::init(true), cl::desc("Print MIR debug-locations"))
cl::opt< bool > WriteNewDbgInfoFormat
static void printStackObjectDbgInfo(const MachineFunction::VariableDbgInfo &DebugVar, T &Object, ModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:298
static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:270
static cl::opt< bool > SimplifyMIR("simplify-mir", cl::Hidden, cl::desc("Leave out unnecessary information when printing MIR"))
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
unsigned const TargetRegisterInfo * TRI
static bool isReg(const MCInst &MI, unsigned OpNo)
Module.h This file contains the declarations for the Module class.
Module * Mod
const char LLVMTargetMachineRef TM
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file implements the SmallBitVector class.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
uint32_t getNumerator() const
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
This is an important base class in LLVM.
Definition: Constant.h:42
This class represents an Operation in the Expression.
bool print(raw_ostream &OS, DIDumpOptions DumpOpts, const DWARFExpression *Expr, DWARFUnit *U) const
A debug info location.
Definition: DebugLoc.h:33
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:155
iterator end()
Definition: DenseMap.h:84
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:220
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition: Function.cpp:358
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
Metadata node.
Definition: Metadata.h:1067
This class prints out the machine instructions using the MIR serialization format.
Definition: MIRPrinter.cpp:142
void print(const MachineBasicBlock &MBB)
Definition: MIRPrinter.cpp:683
MIPrinter(raw_ostream &OS, ModuleSlotTracker &MST, const DenseMap< const uint32_t *, unsigned > &RegisterMaskIds, const DenseMap< int, FrameIndexOperand > &StackObjectOperandMapping)
Definition: MIRPrinter.cpp:154
void printStackObjectReference(int FrameIndex)
Definition: MIRPrinter.cpp:908
static void printIRValue(raw_ostream &OS, const Value &V, ModuleSlotTracker &MST)
Helper functions to print IR value as MIR serialization format which will be useful for target specif...
Definition: MIRPrinter.cpp:980
This class prints out the machine functions using the MIR serialization format.
Definition: MIRPrinter.cpp:102
MIRPrinter(raw_ostream &OS, const MachineModuleInfo &MMI)
Definition: MIRPrinter.cpp:111
void convert(yaml::MachineFunction &MF, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:312
void convertEntryValueObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:385
void convertCallSiteObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:532
void print(const MachineFunction &MF)
Definition: MIRPrinter.cpp:196
void convertMachineMetadataNodes(yaml::MachineFunction &YMF, const MachineFunction &MF, MachineModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:566
void convertStackObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:398
BranchProbability getSuccProbability(const_succ_iterator Succ) const
Return probability of the edge from this block to MBB.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
@ PrintNameIr
Add IR name where available.
@ PrintNameAttributes
Print attributes.
void printAsOperand(raw_ostream &OS, bool PrintType=true) const
unsigned succ_size() const
iterator_range< livein_iterator > liveins_dbg() const
bool hasSuccessorProbabilities() const
Return true if any of the successors have probabilities attached to them.
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
Instructions::const_iterator const_instr_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void printName(raw_ostream &os, unsigned printNameFlags=PrintNameIr, ModuleSlotTracker *moduleSlotTracker=nullptr) const
Print the basic block's name as:
This class is a data container for one entry in a MachineConstantPool.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
const AllocaInst * getObjectAllocation(int ObjectIdx) const
Return the underlying Alloca of the specified stack object if it exists.
bool adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
bool isReturnAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
int64_t getLocalFrameObjectCount() const
Return the number of objects allocated into the local object block.
bool hasCalls() const
Return true if the current function has any function calls.
bool isFrameAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
Align getMaxAlign() const
Return the alignment in bytes that this function must be aligned to, which is greater than the defaul...
std::pair< int, int64_t > getLocalFrameObjectMap(int i) const
Get the local offset mapping for a for an object.
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
bool hasPatchPoint() const
This method may be called any time after instruction selection is complete to determine if there is a...
bool hasOpaqueSPAdjustment() const
Returns true if the function contains opaque dynamic stack adjustments.
MachineBasicBlock * getRestorePoint() const
bool isImmutableObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an immutable object.
int getStackProtectorIndex() const
Return the index for the stack protector object.
int64_t getOffsetAdjustment() const
Return the correction for frame offsets.
bool hasTailCall() const
Returns true if the function contains a tail call.
bool hasMustTailInVarArgFunc() const
Returns true if the function is variadic and contains a musttail call.
bool isCalleeSavedInfoValid() const
Has the callee saved info been calculated yet?
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isSpillSlotObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a spill slot.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
bool isMaxCallFrameSizeComputed() const
int64_t getLocalFrameSize() const
Get the size of the local object blob.
bool hasStackMap() const
This method may be called any time after instruction selection is complete to determine if there is a...
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
bool hasVAStart() const
Returns true if the function calls the llvm.va_start intrinsic.
unsigned getCVBytesOfCalleeSavedRegisters() const
Returns how many bytes of callee-saved registers the target pushed in the prologue.
bool isVariableSizedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a variable sized object.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
bool hasStackProtectorIndex() const
uint8_t getStackID(int ObjectIdx) const
unsigned getNumFixedObjects() const
Return the number of fixed objects.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool hasFunctionContextIndex() const
int getObjectIndexBegin() const
Return the minimum frame object index.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
MachineBasicBlock * getSavePoint() const
int getFunctionContextIndex() const
Return the index for the function context object.
bool isAliasedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to an object that might be pointed to by an LLVM IR v...
bool hasProperty(Property P) const
Description of the location of a variable whose Address is valid and unchanging during function execu...
auto getEntryValueVariableDbgInfo() const
Returns the collection of variables for which we have debug info and that have been assigned an entry...
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...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool exposesReturnsTwice() const
exposesReturnsTwice - Returns true if the function calls setjmp or any other similar functions with a...
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
bool callsUnwindInit() const
const CallSiteInfoMap & getCallSitesInfo() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
auto getInStackSlotVariableDbgInfo()
Returns the collection of variables for which we have debug info and that have been assigned a stack ...
Align getAlignment() const
getAlignment - Return the alignment of the function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
BasicBlockListType::const_iterator const_iterator
Representation of each machine instruction.
Definition: MachineInstr.h:69
JTEntryKind getEntryKind() const
const std::vector< MachineJumpTableEntry > & getJumpTables() const
This class contains meta information specific to a module.
void collectMachineMDNodes(MachineMDNodeListType &L) const
MachineOperand class - Representation of each machine instruction operand.
static void printStackObjectReference(raw_ostream &OS, unsigned FrameIndex, bool IsFixed, StringRef Name)
Print a stack object reference.
static void printSubRegIdx(raw_ostream &OS, uint64_t Index, const TargetRegisterInfo *TRI)
Print a subreg index operand.
static void printTargetFlags(raw_ostream &OS, const MachineOperand &Op)
Print operand target flags.
static void printIRSlotNumber(raw_ostream &OS, int Slot)
Print an IRSlotNumber.
static void printSymbol(raw_ostream &OS, MCSymbol &Sym)
Print a MCSymbol as an operand.
@ MO_CFIIndex
MCCFIInstruction index.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_MCSymbol
MCSymbol reference (for debug/eh info)
@ MO_Predicate
Generic predicate for ISel.
@ MO_GlobalAddress
Address of a global value.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_ShuffleMask
Other IR Constant for ISel (shuffle masks)
@ MO_CImmediate
Immediate >64bit operand.
@ MO_BlockAddress
Address of a basic block.
@ MO_DbgInstrRef
Integer indices referring to an instruction+operand.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_IntrinsicID
Intrinsic ID for ISel.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_Metadata
Metadata reference (for debug info)
@ MO_FPImmediate
Floating-point immediate operand.
@ MO_RegisterLiveOut
Mask of live-out registers.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Register getSimpleHint(Register VReg) const
getSimpleHint - same as getRegAllocationHint except it will only return a target independent hint.
bool tracksLiveness() const
tracksLiveness - Returns true when tracking register liveness accurately.
bool isUpdatedCSRsInitialized() const
Returns true if the updated CSR list was initialized and false otherwise.
ArrayRef< std::pair< MCRegister, Register > > liveins() const
const MCPhysReg * getCalleeSavedRegs() const
Returns list of callee saved registers.
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
StringRef getVRegName(Register Reg) const
void print(raw_ostream &OS, const Module *M=nullptr, bool IsForDebug=false) const
Print.
Definition: AsmWriter.cpp:5221
Manage lifetime of a slot tracker for printing IR.
std::vector< std::pair< unsigned, const MDNode * > > MachineMDNodeListType
int getLocalSlot(const Value *V)
Return the slot number of the specified local value.
Definition: AsmWriter.cpp:916
const Function * getCurrentFunction() const
void incorporateFunction(const Function &F)
Incorporate the given function.
Definition: AsmWriter.cpp:902
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the module to an output stream with an optional AssemblyAnnotationWriter.
Definition: AsmWriter.cpp:4873
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Definition: Register.h:84
Used to temporarily set the debug info format of a function, module, or basic block for the duration ...
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:344
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:479
size_t size() const
Definition: SmallVector.h:91
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
void reserve(size_type N)
Definition: SmallVector.h:676
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
std::string lower() const
Definition: StringRef.cpp:111
TargetInstrInfo - Interface to description of machine instruction set.
TargetIntrinsicInfo - Interface to description of machine instruction set.
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:77
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
LLVM Value Representation.
Definition: Value.h:74
void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
Definition: AsmWriter.cpp:5022
void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
Definition: AsmWriter.cpp:5105
self_iterator getIterator()
Definition: ilist_node.h:132
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:661
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
Definition: LaneBitmask.h:92
void printMIR(raw_ostream &OS, const Module &M)
Print LLVM IR using the MIR serialization format to the given output stream.
void guessSuccessors(const MachineBasicBlock &MBB, SmallVectorImpl< MachineBasicBlock * > &Result, bool &IsFallthrough)
Determine a possible list of successors of a basic block based on the basic block machine operand bei...
Definition: MIRPrinter.cpp:627
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1647
Printable printRegClassOrBank(Register Reg, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Create Printable object to print register classes or register banks on a raw_ostream.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:125
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1879
void printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name)
Print out a name of an LLVM value without any prefixes.
Definition: AsmWriter.cpp:383
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.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85
static void output(const Module &Mod, void *Ctxt, raw_ostream &OS)
Definition: MIRPrinter.cpp:177
static StringRef input(StringRef Str, void *Ctxt, Module &Mod)
Definition: MIRPrinter.cpp:181
Identifies call instruction location in machine function.
Serializable representation of CallSiteInfo.
std::vector< ArgRegPair > ArgForwardingRegs
MachineInstrLoc CallLocation
Serializable representation of the MCRegister variant of MachineFunction::VariableDbgInfo.
Serializable representation of the fixed stack object from the MachineFrameInfo class.
Serializable representation of MachineFrameInfo.
unsigned MaxCallFrameSize
~0u means: not computed yet.
std::vector< MachineStackObject > StackObjects
std::vector< StringValue > MachineMetadataNodes
std::optional< std::vector< FlowStringValue > > CalleeSavedRegisters
std::vector< EntryValueObject > EntryValueObjects
std::vector< MachineConstantPoolValue > Constants
std::vector< CallSiteInfo > CallSitesInfo
std::vector< MachineFunctionLiveIn > LiveIns
std::vector< VirtualRegisterDefinition > VirtualRegisters
std::vector< FixedMachineStackObject > FixedStackObjects
std::vector< DebugValueSubstitution > DebugValueSubstitutions
std::unique_ptr< MachineFunctionInfo > MachineFuncInfo
Constant pool.
MachineJumpTable JumpTableInfo
std::vector< Entry > Entries
MachineJumpTableInfo::JTEntryKind Kind
Serializable representation of stack object from the MachineFrameInfo class.
TargetStackID::Value StackID
A wrapper around std::string which contains a source range that's being set during parsing.