LLVM 22.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"
21#include "llvm/ADT/StringRef.h"
39#include "llvm/IR/DebugLoc.h"
40#include "llvm/IR/Function.h"
43#include "llvm/IR/Module.h"
45#include "llvm/IR/Value.h"
46#include "llvm/MC/LaneBitmask.h"
51#include "llvm/Support/Format.h"
55#include <algorithm>
56#include <cassert>
57#include <cinttypes>
58#include <cstdint>
59#include <iterator>
60#include <string>
61#include <utility>
62#include <vector>
63
64using namespace llvm;
65
67 "simplify-mir", cl::Hidden,
68 cl::desc("Leave out unnecessary information when printing MIR"));
69
70static cl::opt<bool> PrintLocations("mir-debug-loc", cl::Hidden, cl::init(true),
71 cl::desc("Print MIR debug-locations"));
72
73namespace {
74
75/// This structure describes how to print out stack object references.
76struct FrameIndexOperand {
77 std::string Name;
78 unsigned ID;
79 bool IsFixed;
80
81 FrameIndexOperand(StringRef Name, unsigned ID, bool IsFixed)
82 : Name(Name.str()), ID(ID), IsFixed(IsFixed) {}
83
84 /// Return an ordinary stack object reference.
85 static FrameIndexOperand create(StringRef Name, unsigned ID) {
86 return FrameIndexOperand(Name, ID, /*IsFixed=*/false);
87 }
88
89 /// Return a fixed stack object reference.
90 static FrameIndexOperand createFixed(unsigned ID) {
91 return FrameIndexOperand("", ID, /*IsFixed=*/true);
92 }
93};
94
95struct MFPrintState {
98 /// Maps from stack object indices to operand indices which will be used when
99 /// printing frame index machine operands.
100 DenseMap<int, FrameIndexOperand> StackObjectOperandMapping;
101 /// Synchronization scope names registered with LLVMContext.
103
104 MFPrintState(const MachineModuleInfo &MMI, const MachineFunction &MF)
105 : MST(MMI, &MF) {}
106};
107
108} // end anonymous namespace
109
110namespace llvm::yaml {
111
112/// This struct serializes the LLVM IR module.
113template <> struct BlockScalarTraits<Module> {
114 static void output(const Module &Mod, void *Ctxt, raw_ostream &OS) {
115 Mod.print(OS, nullptr);
116 }
117
118 static StringRef input(StringRef Str, void *Ctxt, Module &Mod) {
119 llvm_unreachable("LLVM Module is supposed to be parsed separately");
120 return "";
121 }
122};
123
124} // end namespace llvm::yaml
125
127 const TargetRegisterInfo *TRI) {
129 OS << printReg(Reg, TRI);
130}
131
135 const auto *TRI = MF.getSubtarget().getRegisterInfo();
136 unsigned I = 0;
137 for (const uint32_t *Mask : TRI->getRegMasks())
138 RegisterMaskIds.insert(std::make_pair(Mask, I++));
139 return RegisterMaskIds;
140}
141
142static void printMBB(raw_ostream &OS, MFPrintState &State,
143 const MachineBasicBlock &MBB);
144static void convertMRI(yaml::MachineFunction &YamlMF, const MachineFunction &MF,
146 const TargetRegisterInfo *TRI);
147static void convertMCP(yaml::MachineFunction &MF,
149static void convertMJTI(ModuleSlotTracker &MST, yaml::MachineJumpTable &YamlJTI,
150 const MachineJumpTableInfo &JTI);
151static void convertMFI(ModuleSlotTracker &MST, yaml::MachineFrameInfo &YamlMFI,
152 const MachineFrameInfo &MFI);
153static void
155 std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
156 ArrayRef<MachineBasicBlock *> SaveRestorePoints);
158 const MachineFunction &MF,
159 ModuleSlotTracker &MST, MFPrintState &State);
161 const MachineFunction &MF,
162 ModuleSlotTracker &MST);
164 const MachineFunction &MF,
165 ModuleSlotTracker &MST);
167 const MachineFunction &MF,
170 const MachineFunction &MF,
172
173static void printMF(raw_ostream &OS, const MachineModuleInfo &MMI,
174 const MachineFunction &MF) {
175 MFPrintState State(MMI, MF);
176 State.RegisterMaskIds = initRegisterMaskIds(MF);
177
179 YamlMF.Name = MF.getName();
180 YamlMF.Alignment = MF.getAlignment();
182 YamlMF.HasWinCFI = MF.hasWinCFI();
183
184 YamlMF.CallsEHReturn = MF.callsEHReturn();
185 YamlMF.CallsUnwindInit = MF.callsUnwindInit();
186 YamlMF.HasEHContTarget = MF.hasEHContTarget();
187 YamlMF.HasEHScopes = MF.hasEHScopes();
188 YamlMF.HasEHFunclets = MF.hasEHFunclets();
189 YamlMF.HasFakeUses = MF.hasFakeUses();
190 YamlMF.IsOutlined = MF.isOutlined();
192
193 const MachineFunctionProperties &Props = MF.getProperties();
194 YamlMF.Legalized = Props.hasLegalized();
195 YamlMF.RegBankSelected = Props.hasRegBankSelected();
196 YamlMF.Selected = Props.hasSelected();
197 YamlMF.FailedISel = Props.hasFailedISel();
198 YamlMF.FailsVerification = Props.hasFailsVerification();
199 YamlMF.TracksDebugUserValues = Props.hasTracksDebugUserValues();
200 YamlMF.NoPHIs = Props.hasNoPHIs();
201 YamlMF.IsSSA = Props.hasIsSSA();
202 YamlMF.NoVRegs = Props.hasNoVRegs();
203
204 convertMRI(YamlMF, MF, MF.getRegInfo(), MF.getSubtarget().getRegisterInfo());
205 MachineModuleSlotTracker &MST = State.MST;
207 convertMFI(MST, YamlMF.FrameInfo, MF.getFrameInfo());
208 convertStackObjects(YamlMF, MF, MST, State);
209 convertEntryValueObjects(YamlMF, MF, MST);
210 convertCallSiteObjects(YamlMF, MF, MST);
211 for (const auto &Sub : MF.DebugValueSubstitutions) {
212 const auto &SubSrc = Sub.Src;
213 const auto &SubDest = Sub.Dest;
214 YamlMF.DebugValueSubstitutions.push_back({SubSrc.first, SubSrc.second,
215 SubDest.first,
216 SubDest.second,
217 Sub.Subreg});
218 }
219 if (const auto *ConstantPool = MF.getConstantPool())
220 convertMCP(YamlMF, *ConstantPool);
221 if (const auto *JumpTableInfo = MF.getJumpTableInfo())
222 convertMJTI(MST, YamlMF.JumpTableInfo, *JumpTableInfo);
223
224 const TargetMachine &TM = MF.getTarget();
225 YamlMF.MachineFuncInfo =
226 std::unique_ptr<yaml::MachineFunctionInfo>(TM.convertFuncInfoToYAML(MF));
227
228 raw_string_ostream StrOS(YamlMF.Body.Value.Value);
229 bool IsNewlineNeeded = false;
230 for (const auto &MBB : MF) {
231 if (IsNewlineNeeded)
232 StrOS << "\n";
233 printMBB(StrOS, State, MBB);
234 IsNewlineNeeded = true;
235 }
236 // Convert machine metadata collected during the print of the machine
237 // function.
238 convertMachineMetadataNodes(YamlMF, MF, MST);
239
240 convertCalledGlobals(YamlMF, MF, MST);
241
242 yaml::Output Out(OS);
243 if (!SimplifyMIR)
244 Out.setWriteDefaultValues(true);
245 Out << YamlMF;
246}
247
248static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS,
249 const TargetRegisterInfo *TRI) {
250 assert(RegMask && "Can't print an empty register mask");
251 OS << StringRef("CustomRegMask(");
252
253 bool IsRegInRegMaskFound = false;
254 for (int I = 0, E = TRI->getNumRegs(); I < E; I++) {
255 // Check whether the register is asserted in regmask.
256 if (RegMask[I / 32] & (1u << (I % 32))) {
257 if (IsRegInRegMaskFound)
258 OS << ',';
259 OS << printReg(I, TRI);
260 IsRegInRegMaskFound = true;
261 }
262 }
263
264 OS << ')';
265}
266
269 const TargetRegisterInfo *TRI) {
272}
273
274template <typename T>
275static void
277 T &Object, ModuleSlotTracker &MST) {
278 std::array<std::string *, 3> Outputs{{&Object.DebugVar.Value,
279 &Object.DebugExpr.Value,
280 &Object.DebugLoc.Value}};
281 std::array<const Metadata *, 3> Metas{{DebugVar.Var,
282 DebugVar.Expr,
283 DebugVar.Loc}};
284 for (unsigned i = 0; i < 3; ++i) {
285 raw_string_ostream StrOS(*Outputs[i]);
286 Metas[i]->printAsOperand(StrOS, MST);
287 }
288}
289
290static void printRegFlags(Register Reg,
291 std::vector<yaml::FlowStringValue> &RegisterFlags,
292 const MachineFunction &MF,
293 const TargetRegisterInfo *TRI) {
294 auto FlagValues = TRI->getVRegFlagsOfReg(Reg, MF);
295 for (auto &Flag : FlagValues)
296 RegisterFlags.push_back(yaml::FlowStringValue(Flag.str()));
297}
298
299static void convertMRI(yaml::MachineFunction &YamlMF, const MachineFunction &MF,
301 const TargetRegisterInfo *TRI) {
302 YamlMF.TracksRegLiveness = RegInfo.tracksLiveness();
303
304 // Print the virtual register definitions.
305 for (unsigned I = 0, E = RegInfo.getNumVirtRegs(); I < E; ++I) {
308 VReg.ID = I;
309 if (RegInfo.getVRegName(Reg) != "")
310 continue;
312 Register PreferredReg = RegInfo.getSimpleHint(Reg);
313 if (PreferredReg)
314 printRegMIR(PreferredReg, VReg.PreferredRegister, TRI);
315 printRegFlags(Reg, VReg.RegisterFlags, MF, TRI);
316 YamlMF.VirtualRegisters.push_back(std::move(VReg));
317 }
318
319 // Print the live ins.
320 for (std::pair<MCRegister, Register> LI : RegInfo.liveins()) {
322 printRegMIR(LI.first, LiveIn.Register, TRI);
323 if (LI.second)
324 printRegMIR(LI.second, LiveIn.VirtualRegister, TRI);
325 YamlMF.LiveIns.push_back(std::move(LiveIn));
326 }
327
328 // Prints the callee saved registers.
329 if (RegInfo.isUpdatedCSRsInitialized()) {
330 const MCPhysReg *CalleeSavedRegs = RegInfo.getCalleeSavedRegs();
331 std::vector<yaml::FlowStringValue> CalleeSavedRegisters;
332 for (const MCPhysReg *I = CalleeSavedRegs; *I; ++I) {
334 printRegMIR(*I, Reg, TRI);
335 CalleeSavedRegisters.push_back(std::move(Reg));
336 }
337 YamlMF.CalleeSavedRegisters = std::move(CalleeSavedRegisters);
338 }
339}
340
342 const MachineFrameInfo &MFI) {
345 YamlMFI.HasStackMap = MFI.hasStackMap();
346 YamlMFI.HasPatchPoint = MFI.hasPatchPoint();
347 YamlMFI.StackSize = MFI.getStackSize();
349 YamlMFI.MaxAlignment = MFI.getMaxAlign().value();
350 YamlMFI.AdjustsStack = MFI.adjustsStack();
351 YamlMFI.HasCalls = MFI.hasCalls();
353 ? MFI.getMaxCallFrameSize() : ~0u;
357 YamlMFI.HasVAStart = MFI.hasVAStart();
359 YamlMFI.HasTailCall = MFI.hasTailCall();
361 YamlMFI.LocalFrameSize = MFI.getLocalFrameSize();
362 if (!MFI.getSavePoints().empty())
363 convertSRPoints(MST, YamlMFI.SavePoints, MFI.getSavePoints());
364 if (!MFI.getRestorePoints().empty())
366}
367
369 const MachineFunction &MF,
370 ModuleSlotTracker &MST) {
372 for (const MachineFunction::VariableDbgInfo &DebugVar :
374 yaml::EntryValueObject &Obj = YMF.EntryValueObjects.emplace_back();
375 printStackObjectDbgInfo(DebugVar, Obj, MST);
376 MCRegister EntryValReg = DebugVar.getEntryValueRegister();
377 printRegMIR(EntryValReg, Obj.EntryValueRegister, TRI);
378 }
379}
380
382 const MFPrintState &State,
383 int FrameIndex) {
384 auto ObjectInfo = State.StackObjectOperandMapping.find(FrameIndex);
385 assert(ObjectInfo != State.StackObjectOperandMapping.end() &&
386 "Invalid frame index");
387 const FrameIndexOperand &Operand = ObjectInfo->second;
388 MachineOperand::printStackObjectReference(OS, Operand.ID, Operand.IsFixed,
389 Operand.Name);
390}
391
393 const MachineFunction &MF,
394 ModuleSlotTracker &MST, MFPrintState &State) {
395 const MachineFrameInfo &MFI = MF.getFrameInfo();
397
398 // Process fixed stack objects.
399 assert(YMF.FixedStackObjects.empty());
400 SmallVector<int, 32> FixedStackObjectsIdx;
401 const int BeginIdx = MFI.getObjectIndexBegin();
402 if (BeginIdx < 0)
403 FixedStackObjectsIdx.reserve(-BeginIdx);
404
405 unsigned ID = 0;
406 for (int I = BeginIdx; I < 0; ++I, ++ID) {
407 FixedStackObjectsIdx.push_back(-1); // Fill index for possible dead.
408 if (MFI.isDeadObjectIndex(I))
409 continue;
410
412 YamlObject.ID = ID;
413 YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
416 YamlObject.Offset = MFI.getObjectOffset(I);
417 YamlObject.Size = MFI.getObjectSize(I);
418 YamlObject.Alignment = MFI.getObjectAlign(I);
419 YamlObject.StackID = (TargetStackID::Value)MFI.getStackID(I);
420 YamlObject.IsImmutable = MFI.isImmutableObjectIndex(I);
421 YamlObject.IsAliased = MFI.isAliasedObjectIndex(I);
422 // Save the ID' position in FixedStackObjects storage vector.
423 FixedStackObjectsIdx[ID] = YMF.FixedStackObjects.size();
424 YMF.FixedStackObjects.push_back(std::move(YamlObject));
425 State.StackObjectOperandMapping.insert(
426 std::make_pair(I, FrameIndexOperand::createFixed(ID)));
427 }
428
429 // Process ordinary stack objects.
430 assert(YMF.StackObjects.empty());
431 SmallVector<unsigned, 32> StackObjectsIdx;
432 const int EndIdx = MFI.getObjectIndexEnd();
433 if (EndIdx > 0)
434 StackObjectsIdx.reserve(EndIdx);
435 ID = 0;
436 for (int I = 0; I < EndIdx; ++I, ++ID) {
437 StackObjectsIdx.push_back(-1); // Fill index for possible dead.
438 if (MFI.isDeadObjectIndex(I))
439 continue;
440
441 yaml::MachineStackObject YamlObject;
442 YamlObject.ID = ID;
443 if (const auto *Alloca = MFI.getObjectAllocation(I))
444 YamlObject.Name.Value = std::string(
445 Alloca->hasName() ? Alloca->getName() : "");
446 YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
451 YamlObject.Offset = MFI.getObjectOffset(I);
452 YamlObject.Size = MFI.getObjectSize(I);
453 YamlObject.Alignment = MFI.getObjectAlign(I);
454 YamlObject.StackID = (TargetStackID::Value)MFI.getStackID(I);
455
456 // Save the ID' position in StackObjects storage vector.
457 StackObjectsIdx[ID] = YMF.StackObjects.size();
458 YMF.StackObjects.push_back(YamlObject);
459 State.StackObjectOperandMapping.insert(std::make_pair(
460 I, FrameIndexOperand::create(YamlObject.Name.Value, ID)));
461 }
462
463 for (const auto &CSInfo : MFI.getCalleeSavedInfo()) {
464 const int FrameIdx = CSInfo.getFrameIdx();
465 if (!CSInfo.isSpilledToReg() && MFI.isDeadObjectIndex(FrameIdx))
466 continue;
467
469 printRegMIR(CSInfo.getReg(), Reg, TRI);
470 if (!CSInfo.isSpilledToReg()) {
471 assert(FrameIdx >= MFI.getObjectIndexBegin() &&
472 FrameIdx < MFI.getObjectIndexEnd() &&
473 "Invalid stack object index");
474 if (FrameIdx < 0) { // Negative index means fixed objects.
475 auto &Object =
477 [FixedStackObjectsIdx[FrameIdx + MFI.getNumFixedObjects()]];
478 Object.CalleeSavedRegister = std::move(Reg);
479 Object.CalleeSavedRestored = CSInfo.isRestored();
480 } else {
481 auto &Object = YMF.StackObjects[StackObjectsIdx[FrameIdx]];
482 Object.CalleeSavedRegister = std::move(Reg);
483 Object.CalleeSavedRestored = CSInfo.isRestored();
484 }
485 }
486 }
487 for (unsigned I = 0, E = MFI.getLocalFrameObjectCount(); I < E; ++I) {
488 auto LocalObject = MFI.getLocalFrameObjectMap(I);
489 assert(LocalObject.first >= 0 && "Expected a locally mapped stack object");
490 YMF.StackObjects[StackObjectsIdx[LocalObject.first]].LocalOffset =
491 LocalObject.second;
492 }
493
494 // Print the stack object references in the frame information class after
495 // converting the stack objects.
496 if (MFI.hasStackProtectorIndex()) {
499 }
500
501 if (MFI.hasFunctionContextIndex()) {
504 }
505
506 // Print the debug variable information.
507 for (const MachineFunction::VariableDbgInfo &DebugVar :
509 int Idx = DebugVar.getStackSlot();
510 assert(Idx >= MFI.getObjectIndexBegin() && Idx < MFI.getObjectIndexEnd() &&
511 "Invalid stack object index");
512 if (Idx < 0) { // Negative index means fixed objects.
513 auto &Object =
514 YMF.FixedStackObjects[FixedStackObjectsIdx[Idx +
515 MFI.getNumFixedObjects()]];
516 printStackObjectDbgInfo(DebugVar, Object, MST);
517 } else {
518 auto &Object = YMF.StackObjects[StackObjectsIdx[Idx]];
519 printStackObjectDbgInfo(DebugVar, Object, MST);
520 }
521 }
522}
523
525 const MachineFunction &MF,
526 ModuleSlotTracker &MST) {
527 const auto *TRI = MF.getSubtarget().getRegisterInfo();
528 for (auto [MI, CallSiteInfo] : MF.getCallSitesInfo()) {
529 yaml::CallSiteInfo YmlCS;
530 yaml::MachineInstrLoc CallLocation;
531
532 // Prepare instruction position.
533 MachineBasicBlock::const_instr_iterator CallI = MI->getIterator();
534 CallLocation.BlockNum = CallI->getParent()->getNumber();
535 // Get call instruction offset from the beginning of block.
536 CallLocation.Offset =
537 std::distance(CallI->getParent()->instr_begin(), CallI);
538 YmlCS.CallLocation = CallLocation;
539
540 auto [ArgRegPairs, CalleeTypeIds] = CallSiteInfo;
541 // Construct call arguments and theirs forwarding register info.
542 for (auto ArgReg : ArgRegPairs) {
544 YmlArgReg.ArgNo = ArgReg.ArgNo;
545 printRegMIR(ArgReg.Reg, YmlArgReg.Reg, TRI);
546 YmlCS.ArgForwardingRegs.emplace_back(YmlArgReg);
547 }
548 // Get type ids.
549 for (auto *CalleeTypeId : CalleeTypeIds) {
550 YmlCS.CalleeTypeIds.push_back(CalleeTypeId->getZExtValue());
551 }
552 YMF.CallSitesInfo.push_back(std::move(YmlCS));
553 }
554
555 // Sort call info by position of call instructions.
556 llvm::sort(YMF.CallSitesInfo.begin(), YMF.CallSitesInfo.end(),
558 return std::tie(A.CallLocation.BlockNum, A.CallLocation.Offset) <
559 std::tie(B.CallLocation.BlockNum, B.CallLocation.Offset);
560 });
561}
562
564 const MachineFunction &MF,
567 MST.collectMachineMDNodes(MDList);
568 for (auto &MD : MDList) {
569 std::string NS;
570 raw_string_ostream StrOS(NS);
571 MD.second->print(StrOS, MST, MF.getFunction().getParent());
572 YMF.MachineMetadataNodes.push_back(std::move(NS));
573 }
574}
575
577 const MachineFunction &MF,
579 for (const auto &[CallInst, CG] : MF.getCalledGlobals()) {
580 yaml::MachineInstrLoc CallSite;
581 CallSite.BlockNum = CallInst->getParent()->getNumber();
582 CallSite.Offset = std::distance(CallInst->getParent()->instr_begin(),
584
585 yaml::CalledGlobal YamlCG{CallSite, CG.Callee->getName().str(),
586 CG.TargetFlags};
587 YMF.CalledGlobals.push_back(std::move(YamlCG));
588 }
589
590 // Sort by position of call instructions.
591 llvm::sort(YMF.CalledGlobals.begin(), YMF.CalledGlobals.end(),
593 return std::tie(A.CallSite.BlockNum, A.CallSite.Offset) <
594 std::tie(B.CallSite.BlockNum, B.CallSite.Offset);
595 });
596}
597
600 unsigned ID = 0;
601 for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) {
602 std::string Str;
603 raw_string_ostream StrOS(Str);
604 if (Constant.isMachineConstantPoolEntry())
605 Constant.Val.MachineCPVal->print(StrOS);
606 else
607 Constant.Val.ConstVal->printAsOperand(StrOS);
608
610 YamlConstant.ID = ID++;
611 YamlConstant.Value = std::move(Str);
612 YamlConstant.Alignment = Constant.getAlign();
613 YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry();
614
615 MF.Constants.push_back(std::move(YamlConstant));
616 }
617}
618
619static void
621 std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
623 for (const auto &MBB : SRPoints) {
624 SmallString<16> Str;
626 raw_svector_ostream StrOS(Str);
627 StrOS << printMBBReference(*MBB);
628 Entry.Point = StrOS.str().str();
629 Str.clear();
630 YamlSRPoints.push_back(Entry);
631 }
632}
633
635 const MachineJumpTableInfo &JTI) {
636 YamlJTI.Kind = JTI.getEntryKind();
637 unsigned ID = 0;
638 for (const auto &Table : JTI.getJumpTables()) {
639 std::string Str;
641 Entry.ID = ID++;
642 for (const auto *MBB : Table.MBBs) {
643 raw_string_ostream StrOS(Str);
644 StrOS << printMBBReference(*MBB);
645 Entry.Blocks.push_back(Str);
646 Str.clear();
647 }
648 YamlJTI.Entries.push_back(std::move(Entry));
649 }
650}
651
654 bool &IsFallthrough) {
656
657 for (const MachineInstr &MI : MBB) {
658 if (MI.isPHI())
659 continue;
660 for (const MachineOperand &MO : MI.operands()) {
661 if (!MO.isMBB())
662 continue;
663 MachineBasicBlock *Succ = MO.getMBB();
664 auto RP = Seen.insert(Succ);
665 if (RP.second)
666 Result.push_back(Succ);
667 }
668 }
670 IsFallthrough = I == MBB.end() || !I->isBarrier();
671}
672
675 bool GuessedFallthrough;
676 guessSuccessors(MBB, GuessedSuccs, GuessedFallthrough);
677 if (GuessedFallthrough) {
678 const MachineFunction &MF = *MBB.getParent();
680 if (NextI != MF.end()) {
681 MachineBasicBlock *Next = const_cast<MachineBasicBlock*>(&*NextI);
682 if (!is_contained(GuessedSuccs, Next))
683 GuessedSuccs.push_back(Next);
684 }
685 }
686 if (GuessedSuccs.size() != MBB.succ_size())
687 return false;
688 return std::equal(MBB.succ_begin(), MBB.succ_end(), GuessedSuccs.begin());
689}
690
691static void printMI(raw_ostream &OS, MFPrintState &State,
692 const MachineInstr &MI);
693
694static void printMIOperand(raw_ostream &OS, MFPrintState &State,
695 const MachineInstr &MI, unsigned OpIdx,
696 const TargetRegisterInfo *TRI,
697 const TargetInstrInfo *TII,
698 bool ShouldPrintRegisterTies,
699 SmallBitVector &PrintedTypes,
700 const MachineRegisterInfo &MRI, bool PrintDef);
701
702void printMBB(raw_ostream &OS, MFPrintState &State,
703 const MachineBasicBlock &MBB) {
704 assert(MBB.getNumber() >= 0 && "Invalid MBB number");
708 &State.MST);
709 OS << ":\n";
710
711 bool HasLineAttributes = false;
712 // Print the successors
713 bool canPredictProbs = MBB.canPredictBranchProbabilities();
714 // Even if the list of successors is empty, if we cannot guess it,
715 // we need to print it to tell the parser that the list is empty.
716 // This is needed, because MI model unreachable as empty blocks
717 // with an empty successor list. If the parser would see that
718 // without the successor list, it would guess the code would
719 // fallthrough.
720 if ((!MBB.succ_empty() && !SimplifyMIR) || !canPredictProbs ||
722 OS.indent(2) << "successors:";
723 if (!MBB.succ_empty())
724 OS << " ";
725 ListSeparator LS;
726 for (auto I = MBB.succ_begin(), E = MBB.succ_end(); I != E; ++I) {
727 OS << LS << printMBBReference(**I);
728 if (!SimplifyMIR || !canPredictProbs)
729 OS << format("(0x%08" PRIx32 ")",
731 }
732 OS << "\n";
733 HasLineAttributes = true;
734 }
735
736 // Print the live in registers.
738 if (!MBB.livein_empty()) {
739 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
740 OS.indent(2) << "liveins: ";
741 ListSeparator LS;
742 for (const auto &LI : MBB.liveins_dbg()) {
743 OS << LS << printReg(LI.PhysReg, &TRI);
744 if (!LI.LaneMask.all())
745 OS << ":0x" << PrintLaneMask(LI.LaneMask);
746 }
747 OS << "\n";
748 HasLineAttributes = true;
749 }
750
751 if (HasLineAttributes && !MBB.empty())
752 OS << "\n";
753 bool IsInBundle = false;
754 for (const MachineInstr &MI : MBB.instrs()) {
755 if (IsInBundle && !MI.isInsideBundle()) {
756 OS.indent(2) << "}\n";
757 IsInBundle = false;
758 }
759 OS.indent(IsInBundle ? 4 : 2);
760 printMI(OS, State, MI);
761 if (!IsInBundle && MI.getFlag(MachineInstr::BundledSucc)) {
762 OS << " {";
763 IsInBundle = true;
764 }
765 OS << "\n";
766 }
767 if (IsInBundle)
768 OS.indent(2) << "}\n";
769}
770
771static void printMI(raw_ostream &OS, MFPrintState &State,
772 const MachineInstr &MI) {
773 const auto *MF = MI.getMF();
774 const auto &MRI = MF->getRegInfo();
775 const auto &SubTarget = MF->getSubtarget();
776 const auto *TRI = SubTarget.getRegisterInfo();
777 assert(TRI && "Expected target register info");
778 const auto *TII = SubTarget.getInstrInfo();
779 assert(TII && "Expected target instruction info");
780 if (MI.isCFIInstruction())
781 assert(MI.getNumOperands() == 1 && "Expected 1 operand in CFI instruction");
782
783 SmallBitVector PrintedTypes(8);
784 bool ShouldPrintRegisterTies = MI.hasComplexRegisterTies();
785 ListSeparator LS;
786 unsigned I = 0, E = MI.getNumOperands();
787 for (; I < E; ++I) {
788 const MachineOperand MO = MI.getOperand(I);
789 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
790 break;
791 OS << LS;
792 printMIOperand(OS, State, MI, I, TRI, TII, ShouldPrintRegisterTies,
793 PrintedTypes, MRI, /*PrintDef=*/false);
794 }
795
796 if (I)
797 OS << " = ";
798 if (MI.getFlag(MachineInstr::FrameSetup))
799 OS << "frame-setup ";
800 if (MI.getFlag(MachineInstr::FrameDestroy))
801 OS << "frame-destroy ";
802 if (MI.getFlag(MachineInstr::FmNoNans))
803 OS << "nnan ";
804 if (MI.getFlag(MachineInstr::FmNoInfs))
805 OS << "ninf ";
806 if (MI.getFlag(MachineInstr::FmNsz))
807 OS << "nsz ";
808 if (MI.getFlag(MachineInstr::FmArcp))
809 OS << "arcp ";
810 if (MI.getFlag(MachineInstr::FmContract))
811 OS << "contract ";
812 if (MI.getFlag(MachineInstr::FmAfn))
813 OS << "afn ";
814 if (MI.getFlag(MachineInstr::FmReassoc))
815 OS << "reassoc ";
816 if (MI.getFlag(MachineInstr::NoUWrap))
817 OS << "nuw ";
818 if (MI.getFlag(MachineInstr::NoSWrap))
819 OS << "nsw ";
820 if (MI.getFlag(MachineInstr::IsExact))
821 OS << "exact ";
822 if (MI.getFlag(MachineInstr::NoFPExcept))
823 OS << "nofpexcept ";
824 if (MI.getFlag(MachineInstr::NoMerge))
825 OS << "nomerge ";
826 if (MI.getFlag(MachineInstr::Unpredictable))
827 OS << "unpredictable ";
828 if (MI.getFlag(MachineInstr::NoConvergent))
829 OS << "noconvergent ";
830 if (MI.getFlag(MachineInstr::NonNeg))
831 OS << "nneg ";
832 if (MI.getFlag(MachineInstr::Disjoint))
833 OS << "disjoint ";
834 if (MI.getFlag(MachineInstr::NoUSWrap))
835 OS << "nusw ";
836 if (MI.getFlag(MachineInstr::SameSign))
837 OS << "samesign ";
838 if (MI.getFlag(MachineInstr::InBounds))
839 OS << "inbounds ";
840
841 // NOTE: Please add new MIFlags also to the MI_FLAGS_STR in
842 // llvm/utils/update_mir_test_checks.py.
843
844 OS << TII->getName(MI.getOpcode());
845
846 LS = ListSeparator();
847
848 if (I < E) {
849 OS << ' ';
850 for (; I < E; ++I) {
851 OS << LS;
852 printMIOperand(OS, State, MI, I, TRI, TII, ShouldPrintRegisterTies,
853 PrintedTypes, MRI, /*PrintDef=*/true);
854 }
855 }
856
857 // Print any optional symbols attached to this instruction as-if they were
858 // operands.
859 if (MCSymbol *PreInstrSymbol = MI.getPreInstrSymbol()) {
860 OS << LS << " pre-instr-symbol ";
861 MachineOperand::printSymbol(OS, *PreInstrSymbol);
862 }
863 if (MCSymbol *PostInstrSymbol = MI.getPostInstrSymbol()) {
864 OS << LS << " post-instr-symbol ";
865 MachineOperand::printSymbol(OS, *PostInstrSymbol);
866 }
867 if (MDNode *HeapAllocMarker = MI.getHeapAllocMarker()) {
868 OS << LS << " heap-alloc-marker ";
869 HeapAllocMarker->printAsOperand(OS, State.MST);
870 }
871 if (MDNode *PCSections = MI.getPCSections()) {
872 OS << LS << " pcsections ";
873 PCSections->printAsOperand(OS, State.MST);
874 }
875 if (MDNode *MMRA = MI.getMMRAMetadata()) {
876 OS << LS << " mmra ";
877 MMRA->printAsOperand(OS, State.MST);
878 }
879 if (uint32_t CFIType = MI.getCFIType())
880 OS << LS << " cfi-type " << CFIType;
881
882 if (auto Num = MI.peekDebugInstrNum())
883 OS << LS << " debug-instr-number " << Num;
884
885 if (PrintLocations) {
886 if (const DebugLoc &DL = MI.getDebugLoc()) {
887 OS << LS << " debug-location ";
888 DL->printAsOperand(OS, State.MST);
889 }
890 }
891
892 if (!MI.memoperands_empty()) {
893 OS << " :: ";
894 const LLVMContext &Context = MF->getFunction().getContext();
895 const MachineFrameInfo &MFI = MF->getFrameInfo();
896 LS = ListSeparator();
897 for (const auto *Op : MI.memoperands()) {
898 OS << LS;
899 Op->print(OS, State.MST, State.SSNs, Context, &MFI, TII);
900 }
901 }
902}
903
904static std::string formatOperandComment(std::string Comment) {
905 if (Comment.empty())
906 return Comment;
907 return std::string(" /* " + Comment + " */");
908}
909
910static void printMIOperand(raw_ostream &OS, MFPrintState &State,
911 const MachineInstr &MI, unsigned OpIdx,
912 const TargetRegisterInfo *TRI,
913 const TargetInstrInfo *TII,
914 bool ShouldPrintRegisterTies,
915 SmallBitVector &PrintedTypes,
916 const MachineRegisterInfo &MRI, bool PrintDef) {
917 LLT TypeToPrint = MI.getTypeToPrint(OpIdx, PrintedTypes, MRI);
918 const MachineOperand &Op = MI.getOperand(OpIdx);
919 std::string MOComment = TII->createMIROperandComment(MI, Op, OpIdx, TRI);
920
921 switch (Op.getType()) {
923 if (MI.isOperandSubregIdx(OpIdx)) {
926 break;
927 }
928 [[fallthrough]];
947 unsigned TiedOperandIdx = 0;
948 if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef())
949 TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx);
950 Op.print(OS, State.MST, TypeToPrint, OpIdx, PrintDef,
951 /*IsStandalone=*/false, ShouldPrintRegisterTies, TiedOperandIdx,
952 TRI);
953 OS << formatOperandComment(MOComment);
954 break;
955 }
957 printStackObjectReference(OS, State, Op.getIndex());
958 break;
960 const auto &RegisterMaskIds = State.RegisterMaskIds;
961 auto RegMaskInfo = RegisterMaskIds.find(Op.getRegMask());
962 if (RegMaskInfo != RegisterMaskIds.end())
963 OS << StringRef(TRI->getRegMaskNames()[RegMaskInfo->second]).lower();
964 else
965 printCustomRegMask(Op.getRegMask(), OS, TRI);
966 break;
967 }
968 }
969}
970
972 ModuleSlotTracker &MST) {
973 if (isa<GlobalValue>(V)) {
974 V.printAsOperand(OS, /*PrintType=*/false, MST);
975 return;
976 }
977 if (isa<Constant>(V)) {
978 // Machine memory operands can load/store to/from constant value pointers.
979 OS << '`';
980 V.printAsOperand(OS, /*PrintType=*/true, MST);
981 OS << '`';
982 return;
983 }
984 OS << "%ir.";
985 if (V.hasName()) {
986 printLLVMNameWithoutPrefix(OS, V.getName());
987 return;
988 }
989 int Slot = MST.getCurrentFunction() ? MST.getLocalSlot(&V) : -1;
991}
992
994 yaml::Output Out(OS);
995 Out << const_cast<Module &>(M);
996}
997
999 const MachineFunction &MF) {
1000 printMF(OS, MMI, MF);
1001}
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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")
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.
@ CallSiteInfo
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file contains an interface for creating legacy passes to print out IR in various granularities.
Module.h This file contains the declarations for the Module class.
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 void convertCallSiteObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:524
static void convertMCP(yaml::MachineFunction &MF, const MachineConstantPool &ConstantPool)
Definition: MIRPrinter.cpp:598
static void printMI(raw_ostream &OS, MFPrintState &State, const MachineInstr &MI)
Definition: MIRPrinter.cpp:771
static DenseMap< const uint32_t *, unsigned > initRegisterMaskIds(const MachineFunction &MF)
Definition: MIRPrinter.cpp:133
static void convertCalledGlobals(yaml::MachineFunction &YMF, const MachineFunction &MF, MachineModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:576
static void printMBB(raw_ostream &OS, MFPrintState &State, const MachineBasicBlock &MBB)
Definition: MIRPrinter.cpp:702
static std::string formatOperandComment(std::string Comment)
Definition: MIRPrinter.cpp:904
static cl::opt< bool > PrintLocations("mir-debug-loc", cl::Hidden, cl::init(true), cl::desc("Print MIR debug-locations"))
static bool canPredictSuccessors(const MachineBasicBlock &MBB)
Definition: MIRPrinter.cpp:673
static void convertStackObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST, MFPrintState &State)
Definition: MIRPrinter.cpp:392
static void printMF(raw_ostream &OS, const MachineModuleInfo &MMI, const MachineFunction &MF)
Definition: MIRPrinter.cpp:173
static void printStackObjectReference(raw_ostream &OS, const MFPrintState &State, int FrameIndex)
Definition: MIRPrinter.cpp:381
static void convertMFI(ModuleSlotTracker &MST, yaml::MachineFrameInfo &YamlMFI, const MachineFrameInfo &MFI)
Definition: MIRPrinter.cpp:341
static void convertEntryValueObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:368
static void convertMRI(yaml::MachineFunction &YamlMF, const MachineFunction &MF, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:299
static void printStackObjectDbgInfo(const MachineFunction::VariableDbgInfo &DebugVar, T &Object, ModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:276
static void printRegClassOrBank(Register Reg, yaml::StringValue &Dest, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:267
static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:248
static void printRegMIR(Register Reg, yaml::StringValue &Dest, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:126
static cl::opt< bool > SimplifyMIR("simplify-mir", cl::Hidden, cl::desc("Leave out unnecessary information when printing MIR"))
static void printMIOperand(raw_ostream &OS, MFPrintState &State, const MachineInstr &MI, unsigned OpIdx, const TargetRegisterInfo *TRI, const TargetInstrInfo *TII, bool ShouldPrintRegisterTies, SmallBitVector &PrintedTypes, const MachineRegisterInfo &MRI, bool PrintDef)
Definition: MIRPrinter.cpp:910
static void printRegFlags(Register Reg, std::vector< yaml::FlowStringValue > &RegisterFlags, const MachineFunction &MF, const TargetRegisterInfo *TRI)
Definition: MIRPrinter.cpp:290
static void convertSRPoints(ModuleSlotTracker &MST, std::vector< yaml::SaveRestorePointEntry > &YamlSRPoints, ArrayRef< MachineBasicBlock * > SaveRestorePoints)
Definition: MIRPrinter.cpp:620
static void convertMachineMetadataNodes(yaml::MachineFunction &YMF, const MachineFunction &MF, MachineModuleSlotTracker &MST)
Definition: MIRPrinter.cpp:563
static void convertMJTI(ModuleSlotTracker &MST, yaml::MachineJumpTable &YamlJTI, const MachineJumpTableInfo &JTI)
Definition: MIRPrinter.cpp:634
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
MachineInstr unsigned OpIdx
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
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.
This file contains some functions that are useful when dealing with strings.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
uint32_t getNumerator() const
This class represents a function call, abstracting a target machine's calling convention.
This is an important base class in LLVM.
Definition: Constant.h:43
This class represents an Operation in the Expression.
A debug info location.
Definition: DebugLoc.h:124
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:230
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:663
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
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:42
Metadata node.
Definition: Metadata.h:1077
static LLVM_ABI 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:971
LLVM_ABI 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.
LLVM_ABI void printAsOperand(raw_ostream &OS, bool PrintType=true) const
unsigned succ_size() const
iterator_range< livein_iterator > liveins_dbg() const
LLVM_ABI 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.
LLVM_ABI void printName(raw_ostream &os, unsigned printNameFlags=PrintNameIr, ModuleSlotTracker *moduleSlotTracker=nullptr) const
Print the basic block's name as:
LLVM_ABI bool canPredictBranchProbabilities() const
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...
ArrayRef< MachineBasicBlock * > getSavePoints() const
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.
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.
ArrayRef< MachineBasicBlock * > getRestorePoints() const
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.
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...
Properties which a MachineFunction may have at a given point in time.
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.
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.
auto getCalledGlobals() const
Iterates over the full set of call sites and their associated globals.
bool hasEHContTarget() const
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
BasicBlockListType::const_iterator const_iterator
Representation of each machine instruction.
Definition: MachineInstr.h:72
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 LLVM_ABI void printStackObjectReference(raw_ostream &OS, unsigned FrameIndex, bool IsFixed, StringRef Name)
Print a stack object reference.
static LLVM_ABI void printSubRegIdx(raw_ostream &OS, uint64_t Index, const TargetRegisterInfo *TRI)
Print a subreg index operand.
static LLVM_ABI void printTargetFlags(raw_ostream &OS, const MachineOperand &Op)
Print operand target flags.
bool isImplicit() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
static LLVM_ABI void printIRSlotNumber(raw_ostream &OS, int Slot)
Print an IRSlotNumber.
static LLVM_ABI 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,...
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:977
const Function * getCurrentFunction() const
void incorporateFunction(const Function &F)
Incorporate the given function.
Definition: AsmWriter.cpp:963
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
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:67
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:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
void reserve(size_type N)
Definition: SmallVector.h:664
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:233
LLVM_ABI std::string lower() const
Definition: StringRef.cpp:112
TargetInstrInfo - Interface to description of machine instruction set.
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:83
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
LLVM Value Representation.
Definition: Value.h:75
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
Definition: AsmWriter.cpp:5222
LLVM_ABI 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:5305
const ParentTy * getParent() const
Definition: ilist_node.h:34
self_iterator getIterator()
Definition: ilist_node.h:134
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:662
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:692
StringRef str() const
Return a StringRef for the vector contents.
Definition: raw_ostream.h:721
#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:444
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
LLVM_ABI void printMIR(raw_ostream &OS, const Module &M)
Print LLVM IR using the MIR serialization format to the given output stream.
Definition: MIRPrinter.cpp:993
LLVM_ABI 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:652
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1669
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:126
@ Sub
Subtraction of integers.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1916
LLVM_ABI void printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name)
Print out a name of an LLVM value without any prefixes.
Definition: AsmWriter.cpp:442
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.
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:114
static StringRef input(StringRef Str, void *Ctxt, Module &Mod)
Definition: MIRPrinter.cpp:118
Serializable representation of CallSiteInfo.
std::vector< uint64_t > CalleeTypeIds
Numeric callee type identifiers for the callgraph section.
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.
std::vector< SaveRestorePointEntry > RestorePoints
unsigned MaxCallFrameSize
~0u means: not computed yet.
std::vector< SaveRestorePointEntry > SavePoints
std::vector< MachineStackObject > StackObjects
std::vector< StringValue > MachineMetadataNodes
std::optional< std::vector< FlowStringValue > > CalleeSavedRegisters
std::vector< CalledGlobal > CalledGlobals
std::optional< bool > HasFakeUses
std::vector< EntryValueObject > EntryValueObjects
std::optional< bool > NoPHIs
std::vector< MachineConstantPoolValue > Constants
std::optional< bool > NoVRegs
std::vector< CallSiteInfo > CallSitesInfo
std::vector< MachineFunctionLiveIn > LiveIns
std::vector< VirtualRegisterDefinition > VirtualRegisters
std::vector< FixedMachineStackObject > FixedStackObjects
std::optional< bool > IsSSA
std::vector< DebugValueSubstitution > DebugValueSubstitutions
std::unique_ptr< MachineFunctionInfo > MachineFuncInfo
Constant pool.
MachineJumpTable JumpTableInfo
Identifies call instruction location in machine function.
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.
std::vector< FlowStringValue > RegisterFlags