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"
40#include "llvm/IR/DebugLoc.h"
41#include "llvm/IR/Function.h"
44#include "llvm/IR/Module.h"
46#include "llvm/IR/Value.h"
47#include "llvm/MC/LaneBitmask.h"
52#include "llvm/Support/Format.h"
56#include <algorithm>
57#include <cassert>
58#include <cinttypes>
59#include <cstdint>
60#include <iterator>
61#include <string>
62#include <utility>
63#include <vector>
64
65using namespace llvm;
66
68 "simplify-mir", cl::Hidden,
69 cl::desc("Leave out unnecessary information when printing MIR"));
70
71static cl::opt<bool> PrintLocations("mir-debug-loc", cl::Hidden, cl::init(true),
72 cl::desc("Print MIR debug-locations"));
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
96struct MFPrintState {
97 MachineModuleSlotTracker MST;
98 DenseMap<const uint32_t *, unsigned> RegisterMaskIds;
99 /// Maps from stack object indices to operand indices which will be used when
100 /// printing frame index machine operands.
101 DenseMap<int, FrameIndexOperand> StackObjectOperandMapping;
102 /// Synchronization scope names registered with LLVMContext.
104
105 MFPrintState(const MachineModuleInfo &MMI, const MachineFunction &MF)
106 : MST(MMI, &MF) {}
107};
108
109} // end anonymous namespace
110
111/// This struct serializes the LLVM IR module.
112template <> struct yaml::BlockScalarTraits<Module> {
113 static void output(const Module &Mod, void *Ctxt, raw_ostream &OS) {
114 Mod.print(OS, nullptr);
115 }
116
117 static StringRef input(StringRef Str, void *Ctxt, Module &Mod) {
118 llvm_unreachable("LLVM Module is supposed to be parsed separately");
119 return "";
120 }
121};
122
124 const TargetRegisterInfo *TRI) {
125 raw_string_ostream OS(Dest.Value);
126 OS << printReg(Reg, TRI);
127}
128
132 const auto *TRI = MF.getSubtarget().getRegisterInfo();
133 unsigned I = 0;
134 for (const uint32_t *Mask : TRI->getRegMasks())
135 RegisterMaskIds.insert(std::make_pair(Mask, I++));
136 return RegisterMaskIds;
137}
138
139static void printMBB(raw_ostream &OS, MFPrintState &State,
140 const MachineBasicBlock &MBB);
141static void convertMRI(yaml::MachineFunction &YamlMF, const MachineFunction &MF,
143 const TargetRegisterInfo *TRI);
144static void convertMCP(yaml::MachineFunction &MF,
146static void convertMJTI(ModuleSlotTracker &MST, yaml::MachineJumpTable &YamlJTI,
147 const MachineJumpTableInfo &JTI);
148static void convertMFI(ModuleSlotTracker &MST, yaml::MachineFrameInfo &YamlMFI,
149 const MachineFrameInfo &MFI,
150 const TargetRegisterInfo *TRI);
151static void
153 std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
154 const llvm::SaveRestorePoints &SRPoints,
155 const TargetRegisterInfo *TRI);
157 const MachineFunction &MF,
158 ModuleSlotTracker &MST, MFPrintState &State);
160 const MachineFunction &MF,
161 ModuleSlotTracker &MST);
163 const MachineFunction &MF,
164 ModuleSlotTracker &MST);
166 const MachineFunction &MF,
169 const MachineFunction &MF,
171
172static void printMF(raw_ostream &OS, const MachineModuleInfo &MMI,
173 const MachineFunction &MF) {
174 MFPrintState State(MMI, MF);
175 State.RegisterMaskIds = initRegisterMaskIds(MF);
176
178 YamlMF.Name = MF.getName();
179 YamlMF.Alignment = MF.getAlignment();
181 YamlMF.HasWinCFI = MF.hasWinCFI();
182
183 YamlMF.CallsEHReturn = MF.callsEHReturn();
184 YamlMF.CallsUnwindInit = MF.callsUnwindInit();
185 YamlMF.HasEHContTarget = MF.hasEHContTarget();
186 YamlMF.HasEHScopes = MF.hasEHScopes();
187 YamlMF.HasEHFunclets = MF.hasEHFunclets();
188 YamlMF.HasFakeUses = MF.hasFakeUses();
189 YamlMF.IsOutlined = MF.isOutlined();
191
192 const MachineFunctionProperties &Props = MF.getProperties();
193 YamlMF.Legalized = Props.hasLegalized();
194 YamlMF.RegBankSelected = Props.hasRegBankSelected();
195 YamlMF.Selected = Props.hasSelected();
196 YamlMF.FailedISel = Props.hasFailedISel();
197 YamlMF.FailsVerification = Props.hasFailsVerification();
198 YamlMF.TracksDebugUserValues = Props.hasTracksDebugUserValues();
199 YamlMF.NoPHIs = Props.hasNoPHIs();
200 YamlMF.IsSSA = Props.hasIsSSA();
201 YamlMF.NoVRegs = Props.hasNoVRegs();
202
203 convertMRI(YamlMF, MF, MF.getRegInfo(), MF.getSubtarget().getRegisterInfo());
204 MachineModuleSlotTracker &MST = State.MST;
206 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
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
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);
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,
343 const TargetRegisterInfo *TRI) {
346 YamlMFI.HasStackMap = MFI.hasStackMap();
347 YamlMFI.HasPatchPoint = MFI.hasPatchPoint();
348 YamlMFI.StackSize = MFI.getStackSize();
350 YamlMFI.MaxAlignment = MFI.getMaxAlign().value();
351 YamlMFI.AdjustsStack = MFI.adjustsStack();
352 YamlMFI.HasCalls = MFI.hasCalls();
354 ? MFI.getMaxCallFrameSize() : ~0u;
358 YamlMFI.HasVAStart = MFI.hasVAStart();
360 YamlMFI.HasTailCall = MFI.hasTailCall();
362 YamlMFI.LocalFrameSize = MFI.getLocalFrameSize();
363 if (!MFI.getSavePoints().empty())
364 convertSRPoints(MST, YamlMFI.SavePoints, MFI.getSavePoints(), TRI);
365 if (!MFI.getRestorePoints().empty())
367}
368
370 const MachineFunction &MF,
371 ModuleSlotTracker &MST) {
373 for (const MachineFunction::VariableDbgInfo &DebugVar :
375 yaml::EntryValueObject &Obj = YMF.EntryValueObjects.emplace_back();
376 printStackObjectDbgInfo(DebugVar, Obj, MST);
377 MCRegister EntryValReg = DebugVar.getEntryValueRegister();
378 printRegMIR(EntryValReg, Obj.EntryValueRegister, TRI);
379 }
380}
381
383 const MFPrintState &State,
384 int FrameIndex) {
385 auto ObjectInfo = State.StackObjectOperandMapping.find(FrameIndex);
386 assert(ObjectInfo != State.StackObjectOperandMapping.end() &&
387 "Invalid frame index");
388 const FrameIndexOperand &Operand = ObjectInfo->second;
389 MachineOperand::printStackObjectReference(OS, Operand.ID, Operand.IsFixed,
390 Operand.Name);
391}
392
394 const MachineFunction &MF,
395 ModuleSlotTracker &MST, MFPrintState &State) {
396 const MachineFrameInfo &MFI = MF.getFrameInfo();
398
399 // Process fixed stack objects.
400 assert(YMF.FixedStackObjects.empty());
401 SmallVector<int, 32> FixedStackObjectsIdx;
402 const int BeginIdx = MFI.getObjectIndexBegin();
403 if (BeginIdx < 0)
404 FixedStackObjectsIdx.reserve(-BeginIdx);
405
406 unsigned ID = 0;
407 for (int I = BeginIdx; I < 0; ++I, ++ID) {
408 FixedStackObjectsIdx.push_back(-1); // Fill index for possible dead.
409 if (MFI.isDeadObjectIndex(I))
410 continue;
411
413 YamlObject.ID = ID;
414 YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
417 YamlObject.Offset = MFI.getObjectOffset(I);
418 YamlObject.Size = MFI.getObjectSize(I);
419 YamlObject.Alignment = MFI.getObjectAlign(I);
420 YamlObject.StackID = (TargetStackID::Value)MFI.getStackID(I);
421 YamlObject.IsImmutable = MFI.isImmutableObjectIndex(I);
422 YamlObject.IsAliased = MFI.isAliasedObjectIndex(I);
423 // Save the ID' position in FixedStackObjects storage vector.
424 FixedStackObjectsIdx[ID] = YMF.FixedStackObjects.size();
425 YMF.FixedStackObjects.push_back(std::move(YamlObject));
426 State.StackObjectOperandMapping.insert(
427 std::make_pair(I, FrameIndexOperand::createFixed(ID)));
428 }
429
430 // Process ordinary stack objects.
431 assert(YMF.StackObjects.empty());
432 SmallVector<unsigned, 32> StackObjectsIdx;
433 const int EndIdx = MFI.getObjectIndexEnd();
434 if (EndIdx > 0)
435 StackObjectsIdx.reserve(EndIdx);
436 ID = 0;
437 for (int I = 0; I < EndIdx; ++I, ++ID) {
438 StackObjectsIdx.push_back(-1); // Fill index for possible dead.
439 if (MFI.isDeadObjectIndex(I))
440 continue;
441
442 yaml::MachineStackObject YamlObject;
443 YamlObject.ID = ID;
444 if (const auto *Alloca = MFI.getObjectAllocation(I))
445 YamlObject.Name.Value = std::string(
446 Alloca->hasName() ? Alloca->getName() : "");
447 YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
452 YamlObject.Offset = MFI.getObjectOffset(I);
453 YamlObject.Size = MFI.getObjectSize(I);
454 YamlObject.Alignment = MFI.getObjectAlign(I);
455 YamlObject.StackID = (TargetStackID::Value)MFI.getStackID(I);
456
457 // Save the ID' position in StackObjects storage vector.
458 StackObjectsIdx[ID] = YMF.StackObjects.size();
459 YMF.StackObjects.push_back(YamlObject);
460 State.StackObjectOperandMapping.insert(std::make_pair(
461 I, FrameIndexOperand::create(YamlObject.Name.Value, ID)));
462 }
463
464 for (const auto &CSInfo : MFI.getCalleeSavedInfo()) {
465 const int FrameIdx = CSInfo.getFrameIdx();
466 if (!CSInfo.isSpilledToReg() && MFI.isDeadObjectIndex(FrameIdx))
467 continue;
468
470 printRegMIR(CSInfo.getReg(), Reg, TRI);
471 if (!CSInfo.isSpilledToReg()) {
472 assert(FrameIdx >= MFI.getObjectIndexBegin() &&
473 FrameIdx < MFI.getObjectIndexEnd() &&
474 "Invalid stack object index");
475 if (FrameIdx < 0) { // Negative index means fixed objects.
476 auto &Object =
478 [FixedStackObjectsIdx[FrameIdx + MFI.getNumFixedObjects()]];
479 Object.CalleeSavedRegister = std::move(Reg);
480 Object.CalleeSavedRestored = CSInfo.isRestored();
481 } else {
482 auto &Object = YMF.StackObjects[StackObjectsIdx[FrameIdx]];
483 Object.CalleeSavedRegister = std::move(Reg);
484 Object.CalleeSavedRestored = CSInfo.isRestored();
485 }
486 }
487 }
488 for (unsigned I = 0, E = MFI.getLocalFrameObjectCount(); I < E; ++I) {
489 auto LocalObject = MFI.getLocalFrameObjectMap(I);
490 assert(LocalObject.first >= 0 && "Expected a locally mapped stack object");
491 YMF.StackObjects[StackObjectsIdx[LocalObject.first]].LocalOffset =
492 LocalObject.second;
493 }
494
495 // Print the stack object references in the frame information class after
496 // converting the stack objects.
497 if (MFI.hasStackProtectorIndex()) {
500 }
501
502 if (MFI.hasFunctionContextIndex()) {
505 }
506
507 // Print the debug variable information.
508 for (const MachineFunction::VariableDbgInfo &DebugVar :
510 int Idx = DebugVar.getStackSlot();
511 assert(Idx >= MFI.getObjectIndexBegin() && Idx < MFI.getObjectIndexEnd() &&
512 "Invalid stack object index");
513 if (Idx < 0) { // Negative index means fixed objects.
514 auto &Object =
515 YMF.FixedStackObjects[FixedStackObjectsIdx[Idx +
516 MFI.getNumFixedObjects()]];
517 printStackObjectDbgInfo(DebugVar, Object, MST);
518 } else {
519 auto &Object = YMF.StackObjects[StackObjectsIdx[Idx]];
520 printStackObjectDbgInfo(DebugVar, Object, MST);
521 }
522 }
523}
524
526 const MachineFunction &MF,
527 ModuleSlotTracker &MST) {
528 const auto *TRI = MF.getSubtarget().getRegisterInfo();
529 for (auto [MI, CallSiteInfo] : MF.getCallSitesInfo()) {
530 yaml::CallSiteInfo YmlCS;
531 yaml::MachineInstrLoc CallLocation;
532
533 // Prepare instruction position.
534 MachineBasicBlock::const_instr_iterator CallI = MI->getIterator();
535 CallLocation.BlockNum = CallI->getParent()->getNumber();
536 // Get call instruction offset from the beginning of block.
537 CallLocation.Offset =
538 std::distance(CallI->getParent()->instr_begin(), CallI);
539 YmlCS.CallLocation = CallLocation;
540
541 auto [ArgRegPairs, CalleeTypeIds] = CallSiteInfo;
542 // Construct call arguments and theirs forwarding register info.
543 for (auto ArgReg : ArgRegPairs) {
545 YmlArgReg.ArgNo = ArgReg.ArgNo;
546 printRegMIR(ArgReg.Reg, YmlArgReg.Reg, TRI);
547 YmlCS.ArgForwardingRegs.emplace_back(YmlArgReg);
548 }
549 // Get type ids.
550 for (auto *CalleeTypeId : CalleeTypeIds) {
551 YmlCS.CalleeTypeIds.push_back(CalleeTypeId->getZExtValue());
552 }
553 YMF.CallSitesInfo.push_back(std::move(YmlCS));
554 }
555
556 // Sort call info by position of call instructions.
557 llvm::sort(YMF.CallSitesInfo.begin(), YMF.CallSitesInfo.end(),
559 return std::tie(A.CallLocation.BlockNum, A.CallLocation.Offset) <
560 std::tie(B.CallLocation.BlockNum, B.CallLocation.Offset);
561 });
562}
563
565 const MachineFunction &MF,
568 MST.collectMachineMDNodes(MDList);
569 for (auto &MD : MDList) {
570 std::string NS;
571 raw_string_ostream StrOS(NS);
572 MD.second->print(StrOS, MST, MF.getFunction().getParent());
573 YMF.MachineMetadataNodes.push_back(std::move(NS));
574 }
575}
576
578 const MachineFunction &MF,
580 for (const auto &[CallInst, CG] : MF.getCalledGlobals()) {
581 yaml::MachineInstrLoc CallSite;
582 CallSite.BlockNum = CallInst->getParent()->getNumber();
583 CallSite.Offset = std::distance(CallInst->getParent()->instr_begin(),
585
586 yaml::CalledGlobal YamlCG{CallSite, CG.Callee->getName().str(),
587 CG.TargetFlags};
588 YMF.CalledGlobals.push_back(std::move(YamlCG));
589 }
590
591 // Sort by position of call instructions.
592 llvm::sort(YMF.CalledGlobals.begin(), YMF.CalledGlobals.end(),
594 return std::tie(A.CallSite.BlockNum, A.CallSite.Offset) <
595 std::tie(B.CallSite.BlockNum, B.CallSite.Offset);
596 });
597}
598
601 unsigned ID = 0;
602 for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) {
603 std::string Str;
604 raw_string_ostream StrOS(Str);
605 if (Constant.isMachineConstantPoolEntry())
606 Constant.Val.MachineCPVal->print(StrOS);
607 else
608 Constant.Val.ConstVal->printAsOperand(StrOS);
609
611 YamlConstant.ID = ID++;
612 YamlConstant.Value = std::move(Str);
613 YamlConstant.Alignment = Constant.getAlign();
614 YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry();
615
616 MF.Constants.push_back(std::move(YamlConstant));
617 }
618}
619
620static void
622 std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
623 const llvm::SaveRestorePoints &SRPoints,
624 const TargetRegisterInfo *TRI) {
625 for (const auto &[MBB, CSInfos] : SRPoints) {
626 SmallString<16> Str;
628 raw_svector_ostream StrOS(Str);
629 StrOS << printMBBReference(*MBB);
630 Entry.Point = StrOS.str().str();
631 Str.clear();
632 for (const CalleeSavedInfo &Info : CSInfos) {
633 if (Info.getReg()) {
634 StrOS << printReg(Info.getReg(), TRI);
635 Entry.Registers.push_back(StrOS.str().str());
636 Str.clear();
637 }
638 }
639 // Sort here needed for stable output for lit tests
640 std::sort(Entry.Registers.begin(), Entry.Registers.end(),
641 [](const yaml::StringValue &Lhs, const yaml::StringValue &Rhs) {
642 return Lhs.Value < Rhs.Value;
643 });
644 YamlSRPoints.push_back(std::move(Entry));
645 }
646 // Sort here needed for stable output for lit tests
647 std::sort(YamlSRPoints.begin(), YamlSRPoints.end(),
648 [](const yaml::SaveRestorePointEntry &Lhs,
649 const yaml::SaveRestorePointEntry &Rhs) {
650 return Lhs.Point.Value < Rhs.Point.Value;
651 });
652}
653
655 const MachineJumpTableInfo &JTI) {
656 YamlJTI.Kind = JTI.getEntryKind();
657 unsigned ID = 0;
658 for (const auto &Table : JTI.getJumpTables()) {
659 std::string Str;
661 Entry.ID = ID++;
662 for (const auto *MBB : Table.MBBs) {
663 raw_string_ostream StrOS(Str);
664 StrOS << printMBBReference(*MBB);
665 Entry.Blocks.push_back(Str);
666 Str.clear();
667 }
668 YamlJTI.Entries.push_back(std::move(Entry));
669 }
670}
671
674 bool &IsFallthrough) {
676
677 for (const MachineInstr &MI : MBB) {
678 if (MI.isPHI())
679 continue;
680 for (const MachineOperand &MO : MI.operands()) {
681 if (!MO.isMBB())
682 continue;
683 MachineBasicBlock *Succ = MO.getMBB();
684 auto RP = Seen.insert(Succ);
685 if (RP.second)
686 Result.push_back(Succ);
687 }
688 }
689 MachineBasicBlock::const_iterator I = MBB.getLastNonDebugInstr();
690 IsFallthrough = I == MBB.end() || !I->isBarrier();
691}
692
695 bool GuessedFallthrough;
696 guessSuccessors(MBB, GuessedSuccs, GuessedFallthrough);
697 if (GuessedFallthrough) {
698 const MachineFunction &MF = *MBB.getParent();
699 MachineFunction::const_iterator NextI = std::next(MBB.getIterator());
700 if (NextI != MF.end()) {
701 MachineBasicBlock *Next = const_cast<MachineBasicBlock*>(&*NextI);
702 if (!is_contained(GuessedSuccs, Next))
703 GuessedSuccs.push_back(Next);
704 }
705 }
706 if (GuessedSuccs.size() != MBB.succ_size())
707 return false;
708 return std::equal(MBB.succ_begin(), MBB.succ_end(), GuessedSuccs.begin());
709}
710
711static void printMI(raw_ostream &OS, MFPrintState &State,
712 const MachineInstr &MI);
713
714static void printMIOperand(raw_ostream &OS, MFPrintState &State,
715 const MachineInstr &MI, unsigned OpIdx,
716 const TargetRegisterInfo *TRI,
717 const TargetInstrInfo *TII,
718 bool ShouldPrintRegisterTies,
719 SmallBitVector &PrintedTypes,
720 const MachineRegisterInfo &MRI, bool PrintDef);
721
722void printMBB(raw_ostream &OS, MFPrintState &State,
723 const MachineBasicBlock &MBB) {
724 assert(MBB.getNumber() >= 0 && "Invalid MBB number");
725 MBB.printName(OS,
728 &State.MST);
729 OS << ":\n";
730
731 bool HasLineAttributes = false;
732 // Print the successors
733 bool canPredictProbs = MBB.canPredictBranchProbabilities();
734 // Even if the list of successors is empty, if we cannot guess it,
735 // we need to print it to tell the parser that the list is empty.
736 // This is needed, because MI model unreachable as empty blocks
737 // with an empty successor list. If the parser would see that
738 // without the successor list, it would guess the code would
739 // fallthrough.
740 if ((!MBB.succ_empty() && !SimplifyMIR) || !canPredictProbs ||
742 OS.indent(2) << "successors:";
743 if (!MBB.succ_empty())
744 OS << " ";
745 ListSeparator LS;
746 for (auto I = MBB.succ_begin(), E = MBB.succ_end(); I != E; ++I) {
747 OS << LS << printMBBReference(**I);
748 if (!SimplifyMIR || !canPredictProbs)
749 OS << format("(0x%08" PRIx32 ")",
750 MBB.getSuccProbability(I).getNumerator());
751 }
752 OS << "\n";
753 HasLineAttributes = true;
754 }
755
756 // Print the live in registers.
757 const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
758 if (!MBB.livein_empty()) {
759 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
760 OS.indent(2) << "liveins: ";
761 ListSeparator LS;
762 for (const auto &LI : MBB.liveins_dbg()) {
763 OS << LS << printReg(LI.PhysReg, &TRI);
764 if (!LI.LaneMask.all())
765 OS << ":0x" << PrintLaneMask(LI.LaneMask);
766 }
767 OS << "\n";
768 HasLineAttributes = true;
769 }
770
771 if (HasLineAttributes && !MBB.empty())
772 OS << "\n";
773 bool IsInBundle = false;
774 for (const MachineInstr &MI : MBB.instrs()) {
775 if (IsInBundle && !MI.isInsideBundle()) {
776 OS.indent(2) << "}\n";
777 IsInBundle = false;
778 }
779 OS.indent(IsInBundle ? 4 : 2);
780 printMI(OS, State, MI);
781 if (!IsInBundle && MI.getFlag(MachineInstr::BundledSucc)) {
782 OS << " {";
783 IsInBundle = true;
784 }
785 OS << "\n";
786 }
787 if (IsInBundle)
788 OS.indent(2) << "}\n";
789}
790
791static void printMI(raw_ostream &OS, MFPrintState &State,
792 const MachineInstr &MI) {
793 const auto *MF = MI.getMF();
794 const auto &MRI = MF->getRegInfo();
795 const auto &SubTarget = MF->getSubtarget();
796 const auto *TRI = SubTarget.getRegisterInfo();
797 assert(TRI && "Expected target register info");
798 const auto *TII = SubTarget.getInstrInfo();
799 assert(TII && "Expected target instruction info");
800 if (MI.isCFIInstruction())
801 assert(MI.getNumOperands() == 1 && "Expected 1 operand in CFI instruction");
802
803 SmallBitVector PrintedTypes(8);
804 bool ShouldPrintRegisterTies = MI.hasComplexRegisterTies();
805 ListSeparator LS;
806 unsigned I = 0, E = MI.getNumOperands();
807 for (; I < E; ++I) {
808 const MachineOperand MO = MI.getOperand(I);
809 if (!MO.isReg() || !MO.isDef() || MO.isImplicit())
810 break;
811 OS << LS;
812 printMIOperand(OS, State, MI, I, TRI, TII, ShouldPrintRegisterTies,
813 PrintedTypes, MRI, /*PrintDef=*/false);
814 }
815
816 if (I)
817 OS << " = ";
818 if (MI.getFlag(MachineInstr::FrameSetup))
819 OS << "frame-setup ";
820 if (MI.getFlag(MachineInstr::FrameDestroy))
821 OS << "frame-destroy ";
822 if (MI.getFlag(MachineInstr::FmNoNans))
823 OS << "nnan ";
824 if (MI.getFlag(MachineInstr::FmNoInfs))
825 OS << "ninf ";
826 if (MI.getFlag(MachineInstr::FmNsz))
827 OS << "nsz ";
828 if (MI.getFlag(MachineInstr::FmArcp))
829 OS << "arcp ";
830 if (MI.getFlag(MachineInstr::FmContract))
831 OS << "contract ";
832 if (MI.getFlag(MachineInstr::FmAfn))
833 OS << "afn ";
834 if (MI.getFlag(MachineInstr::FmReassoc))
835 OS << "reassoc ";
836 if (MI.getFlag(MachineInstr::NoUWrap))
837 OS << "nuw ";
838 if (MI.getFlag(MachineInstr::NoSWrap))
839 OS << "nsw ";
840 if (MI.getFlag(MachineInstr::IsExact))
841 OS << "exact ";
842 if (MI.getFlag(MachineInstr::NoFPExcept))
843 OS << "nofpexcept ";
844 if (MI.getFlag(MachineInstr::NoMerge))
845 OS << "nomerge ";
846 if (MI.getFlag(MachineInstr::Unpredictable))
847 OS << "unpredictable ";
848 if (MI.getFlag(MachineInstr::NoConvergent))
849 OS << "noconvergent ";
850 if (MI.getFlag(MachineInstr::NonNeg))
851 OS << "nneg ";
852 if (MI.getFlag(MachineInstr::Disjoint))
853 OS << "disjoint ";
854 if (MI.getFlag(MachineInstr::NoUSWrap))
855 OS << "nusw ";
856 if (MI.getFlag(MachineInstr::SameSign))
857 OS << "samesign ";
858 if (MI.getFlag(MachineInstr::InBounds))
859 OS << "inbounds ";
860
861 // NOTE: Please add new MIFlags also to the MI_FLAGS_STR in
862 // llvm/utils/update_mir_test_checks.py.
863
864 OS << TII->getName(MI.getOpcode());
865
866 // Print a space after the opcode if any additional tokens are printed.
867 LS = ListSeparator(", ", " ");
868
869 for (; I < E; ++I) {
870 OS << LS;
871 printMIOperand(OS, State, MI, I, TRI, TII, ShouldPrintRegisterTies,
872 PrintedTypes, MRI, /*PrintDef=*/true);
873 }
874
875 // Print any optional symbols attached to this instruction as-if they were
876 // operands.
877 if (MCSymbol *PreInstrSymbol = MI.getPreInstrSymbol()) {
878 OS << LS << "pre-instr-symbol ";
879 MachineOperand::printSymbol(OS, *PreInstrSymbol);
880 }
881 if (MCSymbol *PostInstrSymbol = MI.getPostInstrSymbol()) {
882 OS << LS << "post-instr-symbol ";
883 MachineOperand::printSymbol(OS, *PostInstrSymbol);
884 }
885 if (MDNode *HeapAllocMarker = MI.getHeapAllocMarker()) {
886 OS << LS << "heap-alloc-marker ";
887 HeapAllocMarker->printAsOperand(OS, State.MST);
888 }
889 if (MDNode *PCSections = MI.getPCSections()) {
890 OS << LS << "pcsections ";
891 PCSections->printAsOperand(OS, State.MST);
892 }
893 if (MDNode *MMRA = MI.getMMRAMetadata()) {
894 OS << LS << "mmra ";
895 MMRA->printAsOperand(OS, State.MST);
896 }
897 if (uint32_t CFIType = MI.getCFIType())
898 OS << LS << "cfi-type " << CFIType;
899 if (Value *DS = MI.getDeactivationSymbol()) {
900 OS << LS << "deactivation-symbol ";
901 MIRFormatter::printIRValue(OS, *DS, State.MST);
902 }
903
904 if (auto Num = MI.peekDebugInstrNum())
905 OS << LS << "debug-instr-number " << Num;
906
907 if (PrintLocations) {
908 if (const DebugLoc &DL = MI.getDebugLoc()) {
909 OS << LS << "debug-location ";
910 DL->printAsOperand(OS, State.MST);
911 }
912 }
913
914 if (!MI.memoperands_empty()) {
915 OS << " :: ";
916 const LLVMContext &Context = MF->getFunction().getContext();
917 const MachineFrameInfo &MFI = MF->getFrameInfo();
918 LS = ListSeparator();
919 for (const auto *Op : MI.memoperands()) {
920 OS << LS;
921 Op->print(OS, State.MST, State.SSNs, Context, &MFI, TII);
922 }
923 }
924}
925
926static std::string formatOperandComment(std::string Comment) {
927 if (Comment.empty())
928 return Comment;
929 return std::string(" /* " + Comment + " */");
930}
931
932static void printMIOperand(raw_ostream &OS, MFPrintState &State,
933 const MachineInstr &MI, unsigned OpIdx,
934 const TargetRegisterInfo *TRI,
935 const TargetInstrInfo *TII,
936 bool ShouldPrintRegisterTies,
937 SmallBitVector &PrintedTypes,
938 const MachineRegisterInfo &MRI, bool PrintDef) {
939 LLT TypeToPrint = MI.getTypeToPrint(OpIdx, PrintedTypes, MRI);
940 const MachineOperand &Op = MI.getOperand(OpIdx);
941 std::string MOComment = TII->createMIROperandComment(MI, Op, OpIdx, TRI);
942
943 switch (Op.getType()) {
945 if (MI.isOperandSubregIdx(OpIdx)) {
948 break;
949 }
950 [[fallthrough]];
970 unsigned TiedOperandIdx = 0;
971 if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef())
972 TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx);
973 Op.print(OS, State.MST, TypeToPrint, OpIdx, PrintDef,
974 /*IsStandalone=*/false, ShouldPrintRegisterTies, TiedOperandIdx,
975 TRI);
976 OS << formatOperandComment(MOComment);
977 break;
978 }
980 printStackObjectReference(OS, State, Op.getIndex());
981 break;
983 const auto &RegisterMaskIds = State.RegisterMaskIds;
984 auto RegMaskInfo = RegisterMaskIds.find(Op.getRegMask());
985 if (RegMaskInfo != RegisterMaskIds.end())
986 OS << StringRef(TRI->getRegMaskNames()[RegMaskInfo->second]).lower();
987 else
988 printCustomRegMask(Op.getRegMask(), OS, TRI);
989 break;
990 }
991 }
992}
993
995 ModuleSlotTracker &MST) {
996 if (isa<GlobalValue>(V)) {
997 V.printAsOperand(OS, /*PrintType=*/false, MST);
998 return;
999 }
1000 if (isa<Constant>(V)) {
1001 // Machine memory operands can load/store to/from constant value pointers.
1002 OS << '`';
1003 V.printAsOperand(OS, /*PrintType=*/true, MST);
1004 OS << '`';
1005 return;
1006 }
1007 OS << "%ir.";
1008 if (V.hasName()) {
1009 printLLVMNameWithoutPrefix(OS, V.getName());
1010 return;
1011 }
1012 int Slot = MST.getCurrentFunction() ? MST.getLocalSlot(&V) : -1;
1014}
1015
1016void llvm::printMIR(raw_ostream &OS, const Module &M) {
1017 yaml::Output Out(OS);
1018 Out << const_cast<Module &>(M);
1019}
1020
1022 const MachineFunction &MF) {
1023 printMF(OS, MMI, MF);
1024}
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
const TargetInstrInfo & TII
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Definition CSEInfo.cpp:27
This file defines the DenseMap class.
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:57
static void convertCallSiteObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
static void convertMCP(yaml::MachineFunction &MF, const MachineConstantPool &ConstantPool)
static void printMI(raw_ostream &OS, MFPrintState &State, const MachineInstr &MI)
static void convertSRPoints(ModuleSlotTracker &MST, std::vector< yaml::SaveRestorePointEntry > &YamlSRPoints, const llvm::SaveRestorePoints &SRPoints, const TargetRegisterInfo *TRI)
static DenseMap< const uint32_t *, unsigned > initRegisterMaskIds(const MachineFunction &MF)
static void convertCalledGlobals(yaml::MachineFunction &YMF, const MachineFunction &MF, MachineModuleSlotTracker &MST)
static void printMBB(raw_ostream &OS, MFPrintState &State, const MachineBasicBlock &MBB)
static std::string formatOperandComment(std::string Comment)
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)
static void convertStackObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST, MFPrintState &State)
static void printMF(raw_ostream &OS, const MachineModuleInfo &MMI, const MachineFunction &MF)
static void printStackObjectReference(raw_ostream &OS, const MFPrintState &State, int FrameIndex)
static void convertEntryValueObjects(yaml::MachineFunction &YMF, const MachineFunction &MF, ModuleSlotTracker &MST)
static void convertMRI(yaml::MachineFunction &YamlMF, const MachineFunction &MF, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
static void printStackObjectDbgInfo(const MachineFunction::VariableDbgInfo &DebugVar, T &Object, ModuleSlotTracker &MST)
static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS, const TargetRegisterInfo *TRI)
static void convertMFI(ModuleSlotTracker &MST, yaml::MachineFrameInfo &YamlMFI, const MachineFrameInfo &MFI, const TargetRegisterInfo *TRI)
static void printRegMIR(Register Reg, yaml::StringValue &Dest, const TargetRegisterInfo *TRI)
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)
static void printRegFlags(Register Reg, std::vector< yaml::FlowStringValue > &RegisterFlags, const MachineFunction &MF, const TargetRegisterInfo *TRI)
static void convertMachineMetadataNodes(yaml::MachineFunction &YMF, const MachineFunction &MF, MachineModuleSlotTracker &MST)
static void convertMJTI(ModuleSlotTracker &MST, yaml::MachineJumpTable &YamlJTI, const MachineJumpTableInfo &JTI)
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register Reg
Register const TargetRegisterInfo * TRI
#define T
MachineInstr unsigned OpIdx
This file contains some templates that are useful if you are working with the STL at all.
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.
This class represents a function call, abstracting a target machine's calling convention.
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
This is an important base class in LLVM.
Definition Constant.h:43
A debug info location.
Definition DebugLoc.h:123
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
Module * getParent()
Get the module that this global value is contained inside of...
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
A helper class to return the specified delimiter string after the first invocation of operator String...
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1078
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...
MachineInstrBundleIterator< const MachineInstr > const_iterator
@ PrintNameIr
Add IR name where available.
@ PrintNameAttributes
Print attributes.
Instructions::const_iterator const_instr_iterator
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.
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
const SaveRestorePoints & getRestorePoints() 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.
const SaveRestorePoints & getSavePoints() const
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.
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.
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.
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 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_LaneMask
Mask to represent active parts of registers.
@ 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.
const Function * getCurrentFunction() const
void incorporateFunction(const Function &F)
Incorporate the given function.
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:20
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Definition Register.h:72
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.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
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:225
LLVM_ABI std::string lower() const
TargetInstrInfo - Interface to description of machine instruction set.
Primary interface to the complete machine description for the target machine.
virtual yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
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.
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.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
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.
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
The Output class is used to generate a yaml document from in-memory structs and vectors.
void setWriteDefaultValues(bool Write)
Set whether or not to output optional values which are equal to the default value....
#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)
This is an optimization pass for GlobalISel generic memory operations.
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.
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...
DenseMap< MachineBasicBlock *, std::vector< CalleeSavedInfo > > SaveRestorePoints
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1634
LLVM_ABI Printable printRegClassOrBank(Register Reg, const MachineRegisterInfo &RegInfo, const TargetRegisterInfo *TRI)
Create Printable object to print register classes or register banks on a raw_ostream.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition Format.h:129
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
@ Sub
Subtraction of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
FunctionAddr VTableAddr Next
Definition InstrProf.h:141
DWARFExpression::Operation Op
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1909
LLVM_ABI void printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name)
Print out a name of an LLVM value without any prefixes.
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.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
This class should be specialized by type that requires custom conversion to/from a YAML literal block...
Definition YAMLTraits.h:179
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.
Identifies call instruction location in machine function.
std::vector< Entry > Entries
MachineJumpTableInfo::JTEntryKind Kind
Serializable representation of stack object from the MachineFrameInfo class.
A wrapper around std::string which contains a source range that's being set during parsing.
std::vector< FlowStringValue > RegisterFlags
static void output(const Module &Mod, void *Ctxt, raw_ostream &OS)
static StringRef input(StringRef Str, void *Ctxt, Module &Mod)