LCOV - code coverage report
Current view: top level - lib/CodeGen - MIRPrinter.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 411 417 98.6 %
Date: 2018-10-20 13:21:21 Functions: 21 23 91.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- MIRPrinter.cpp - MIR serialization format printer ------------------===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This file implements the class that prints out the LLVM IR and machine
      11             : // functions using the MIR serialization format.
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #include "llvm/CodeGen/MIRPrinter.h"
      16             : #include "llvm/ADT/DenseMap.h"
      17             : #include "llvm/ADT/None.h"
      18             : #include "llvm/ADT/STLExtras.h"
      19             : #include "llvm/ADT/SmallBitVector.h"
      20             : #include "llvm/ADT/SmallPtrSet.h"
      21             : #include "llvm/ADT/SmallVector.h"
      22             : #include "llvm/ADT/StringRef.h"
      23             : #include "llvm/ADT/Twine.h"
      24             : #include "llvm/CodeGen/GlobalISel/RegisterBank.h"
      25             : #include "llvm/CodeGen/MIRYamlMapping.h"
      26             : #include "llvm/CodeGen/MachineBasicBlock.h"
      27             : #include "llvm/CodeGen/MachineConstantPool.h"
      28             : #include "llvm/CodeGen/MachineFrameInfo.h"
      29             : #include "llvm/CodeGen/MachineFunction.h"
      30             : #include "llvm/CodeGen/MachineInstr.h"
      31             : #include "llvm/CodeGen/MachineJumpTableInfo.h"
      32             : #include "llvm/CodeGen/MachineMemOperand.h"
      33             : #include "llvm/CodeGen/MachineOperand.h"
      34             : #include "llvm/CodeGen/MachineRegisterInfo.h"
      35             : #include "llvm/CodeGen/PseudoSourceValue.h"
      36             : #include "llvm/CodeGen/TargetInstrInfo.h"
      37             : #include "llvm/CodeGen/TargetRegisterInfo.h"
      38             : #include "llvm/CodeGen/TargetSubtargetInfo.h"
      39             : #include "llvm/IR/BasicBlock.h"
      40             : #include "llvm/IR/Constants.h"
      41             : #include "llvm/IR/DebugInfo.h"
      42             : #include "llvm/IR/DebugLoc.h"
      43             : #include "llvm/IR/Function.h"
      44             : #include "llvm/IR/GlobalValue.h"
      45             : #include "llvm/IR/IRPrintingPasses.h"
      46             : #include "llvm/IR/InstrTypes.h"
      47             : #include "llvm/IR/Instructions.h"
      48             : #include "llvm/IR/Intrinsics.h"
      49             : #include "llvm/IR/Module.h"
      50             : #include "llvm/IR/ModuleSlotTracker.h"
      51             : #include "llvm/IR/Value.h"
      52             : #include "llvm/MC/LaneBitmask.h"
      53             : #include "llvm/MC/MCContext.h"
      54             : #include "llvm/MC/MCDwarf.h"
      55             : #include "llvm/MC/MCSymbol.h"
      56             : #include "llvm/Support/AtomicOrdering.h"
      57             : #include "llvm/Support/BranchProbability.h"
      58             : #include "llvm/Support/Casting.h"
      59             : #include "llvm/Support/CommandLine.h"
      60             : #include "llvm/Support/ErrorHandling.h"
      61             : #include "llvm/Support/Format.h"
      62             : #include "llvm/Support/LowLevelTypeImpl.h"
      63             : #include "llvm/Support/YAMLTraits.h"
      64             : #include "llvm/Support/raw_ostream.h"
      65             : #include "llvm/Target/TargetIntrinsicInfo.h"
      66             : #include "llvm/Target/TargetMachine.h"
      67             : #include <algorithm>
      68             : #include <cassert>
      69             : #include <cinttypes>
      70             : #include <cstdint>
      71             : #include <iterator>
      72             : #include <string>
      73             : #include <utility>
      74             : #include <vector>
      75             : 
      76             : using namespace llvm;
      77             : 
      78             : static cl::opt<bool> SimplifyMIR(
      79             :     "simplify-mir", cl::Hidden,
      80             :     cl::desc("Leave out unnecessary information when printing MIR"));
      81             : 
      82             : namespace {
      83             : 
      84             : /// This structure describes how to print out stack object references.
      85        2874 : struct FrameIndexOperand {
      86             :   std::string Name;
      87             :   unsigned ID;
      88             :   bool IsFixed;
      89             : 
      90             :   FrameIndexOperand(StringRef Name, unsigned ID, bool IsFixed)
      91         958 :       : Name(Name.str()), ID(ID), IsFixed(IsFixed) {}
      92             : 
      93             :   /// Return an ordinary stack object reference.
      94             :   static FrameIndexOperand create(StringRef Name, unsigned ID) {
      95             :     return FrameIndexOperand(Name, ID, /*IsFixed=*/false);
      96             :   }
      97             : 
      98             :   /// Return a fixed stack object reference.
      99             :   static FrameIndexOperand createFixed(unsigned ID) {
     100             :     return FrameIndexOperand("", ID, /*IsFixed=*/true);
     101             :   }
     102             : };
     103             : 
     104             : } // end anonymous namespace
     105             : 
     106             : namespace llvm {
     107             : 
     108             : /// This class prints out the machine functions using the MIR serialization
     109             : /// format.
     110             : class MIRPrinter {
     111             :   raw_ostream &OS;
     112             :   DenseMap<const uint32_t *, unsigned> RegisterMaskIds;
     113             :   /// Maps from stack object indices to operand indices which will be used when
     114             :   /// printing frame index machine operands.
     115             :   DenseMap<int, FrameIndexOperand> StackObjectOperandMapping;
     116             : 
     117             : public:
     118        4764 :   MIRPrinter(raw_ostream &OS) : OS(OS) {}
     119             : 
     120             :   void print(const MachineFunction &MF);
     121             : 
     122             :   void convert(yaml::MachineFunction &MF, const MachineRegisterInfo &RegInfo,
     123             :                const TargetRegisterInfo *TRI);
     124             :   void convert(ModuleSlotTracker &MST, yaml::MachineFrameInfo &YamlMFI,
     125             :                const MachineFrameInfo &MFI);
     126             :   void convert(yaml::MachineFunction &MF,
     127             :                const MachineConstantPool &ConstantPool);
     128             :   void convert(ModuleSlotTracker &MST, yaml::MachineJumpTable &YamlJTI,
     129             :                const MachineJumpTableInfo &JTI);
     130             :   void convertStackObjects(yaml::MachineFunction &YMF,
     131             :                            const MachineFunction &MF, ModuleSlotTracker &MST);
     132             : 
     133             : private:
     134             :   void initRegisterMaskIds(const MachineFunction &MF);
     135             : };
     136             : 
     137             : /// This class prints out the machine instructions using the MIR serialization
     138             : /// format.
     139             : class MIPrinter {
     140             :   raw_ostream &OS;
     141             :   ModuleSlotTracker &MST;
     142             :   const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds;
     143             :   const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping;
     144             :   /// Synchronization scope names registered with LLVMContext.
     145             :   SmallVector<StringRef, 8> SSNs;
     146             : 
     147             :   bool canPredictBranchProbabilities(const MachineBasicBlock &MBB) const;
     148             :   bool canPredictSuccessors(const MachineBasicBlock &MBB) const;
     149             : 
     150             : public:
     151             :   MIPrinter(raw_ostream &OS, ModuleSlotTracker &MST,
     152             :             const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds,
     153             :             const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping)
     154             :       : OS(OS), MST(MST), RegisterMaskIds(RegisterMaskIds),
     155        6883 :         StackObjectOperandMapping(StackObjectOperandMapping) {}
     156             : 
     157             :   void print(const MachineBasicBlock &MBB);
     158             : 
     159             :   void print(const MachineInstr &MI);
     160             :   void printStackObjectReference(int FrameIndex);
     161             :   void print(const MachineInstr &MI, unsigned OpIdx,
     162             :              const TargetRegisterInfo *TRI, bool ShouldPrintRegisterTies,
     163             :              LLT TypeToPrint, bool PrintDef = true);
     164             : };
     165             : 
     166             : } // end namespace llvm
     167             : 
     168             : namespace llvm {
     169             : namespace yaml {
     170             : 
     171             : /// This struct serializes the LLVM IR module.
     172             : template <> struct BlockScalarTraits<Module> {
     173           0 :   static void output(const Module &Mod, void *Ctxt, raw_ostream &OS) {
     174        1119 :     Mod.print(OS, nullptr);
     175           0 :   }
     176             : 
     177           0 :   static StringRef input(StringRef Str, void *Ctxt, Module &Mod) {
     178           0 :     llvm_unreachable("LLVM Module is supposed to be parsed separately");
     179             :     return "";
     180             :   }
     181             : };
     182             : 
     183             : } // end namespace yaml
     184             : } // end namespace llvm
     185             : 
     186        3547 : static void printRegMIR(unsigned Reg, yaml::StringValue &Dest,
     187             :                         const TargetRegisterInfo *TRI) {
     188        3547 :   raw_string_ostream OS(Dest.Value);
     189        7094 :   OS << printReg(Reg, TRI);
     190        3547 : }
     191             : 
     192        4764 : void MIRPrinter::print(const MachineFunction &MF) {
     193        4764 :   initRegisterMaskIds(MF);
     194             : 
     195        9528 :   yaml::MachineFunction YamlMF;
     196        4764 :   YamlMF.Name = MF.getName();
     197        4764 :   YamlMF.Alignment = MF.getAlignment();
     198        4764 :   YamlMF.ExposesReturnsTwice = MF.exposesReturnsTwice();
     199             : 
     200        4764 :   YamlMF.Legalized = MF.getProperties().hasProperty(
     201             :       MachineFunctionProperties::Property::Legalized);
     202        4764 :   YamlMF.RegBankSelected = MF.getProperties().hasProperty(
     203             :       MachineFunctionProperties::Property::RegBankSelected);
     204        4764 :   YamlMF.Selected = MF.getProperties().hasProperty(
     205             :       MachineFunctionProperties::Property::Selected);
     206        4764 :   YamlMF.FailedISel = MF.getProperties().hasProperty(
     207             :       MachineFunctionProperties::Property::FailedISel);
     208             : 
     209        4764 :   convert(YamlMF, MF.getRegInfo(), MF.getSubtarget().getRegisterInfo());
     210        9528 :   ModuleSlotTracker MST(MF.getFunction().getParent());
     211        4764 :   MST.incorporateFunction(MF.getFunction());
     212        4764 :   convert(MST, YamlMF.FrameInfo, MF.getFrameInfo());
     213        4764 :   convertStackObjects(YamlMF, MF, MST);
     214        4764 :   if (const auto *ConstantPool = MF.getConstantPool())
     215        4764 :     convert(YamlMF, *ConstantPool);
     216        4764 :   if (const auto *JumpTableInfo = MF.getJumpTableInfo())
     217           9 :     convert(MST, YamlMF.JumpTableInfo, *JumpTableInfo);
     218        4764 :   raw_string_ostream StrOS(YamlMF.Body.Value.Value);
     219             :   bool IsNewlineNeeded = false;
     220       11646 :   for (const auto &MBB : MF) {
     221        6882 :     if (IsNewlineNeeded)
     222        2144 :       StrOS << "\n";
     223       13764 :     MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
     224        6882 :         .print(MBB);
     225             :     IsNewlineNeeded = true;
     226             :   }
     227             :   StrOS.flush();
     228        9528 :   yaml::Output Out(OS);
     229        4764 :   if (!SimplifyMIR)
     230             :       Out.setWriteDefaultValues(true);
     231        4764 :   Out << YamlMF;
     232        4764 : }
     233             : 
     234           2 : static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS,
     235             :                                const TargetRegisterInfo *TRI) {
     236             :   assert(RegMask && "Can't print an empty register mask");
     237           2 :   OS << StringRef("CustomRegMask(");
     238             : 
     239             :   bool IsRegInRegMaskFound = false;
     240         556 :   for (int I = 0, E = TRI->getNumRegs(); I < E; I++) {
     241             :     // Check whether the register is asserted in regmask.
     242         554 :     if (RegMask[I / 32] & (1u << (I % 32))) {
     243         124 :       if (IsRegInRegMaskFound)
     244             :         OS << ',';
     245         248 :       OS << printReg(I, TRI);
     246             :       IsRegInRegMaskFound = true;
     247             :     }
     248             :   }
     249             : 
     250             :   OS << ')';
     251           2 : }
     252             : 
     253       22802 : static void printRegClassOrBank(unsigned Reg, yaml::StringValue &Dest,
     254             :                                 const MachineRegisterInfo &RegInfo,
     255             :                                 const TargetRegisterInfo *TRI) {
     256       22802 :   raw_string_ostream OS(Dest.Value);
     257       45604 :   OS << printRegClassOrBank(Reg, RegInfo, TRI);
     258       22802 : }
     259             : 
     260             : template <typename T>
     261             : static void
     262           6 : printStackObjectDbgInfo(const MachineFunction::VariableDbgInfo &DebugVar,
     263             :                         T &Object, ModuleSlotTracker &MST) {
     264          18 :   std::array<std::string *, 3> Outputs{{&Object.DebugVar.Value,
     265           6 :                                         &Object.DebugExpr.Value,
     266           6 :                                         &Object.DebugLoc.Value}};
     267          18 :   std::array<const Metadata *, 3> Metas{{DebugVar.Var,
     268           6 :                                         DebugVar.Expr,
     269           6 :                                         DebugVar.Loc}};
     270          24 :   for (unsigned i = 0; i < 3; ++i) {
     271          18 :     raw_string_ostream StrOS(*Outputs[i]);
     272          18 :     Metas[i]->printAsOperand(StrOS, MST);
     273             :   }
     274           6 : }
     275           4 : 
     276             : void MIRPrinter::convert(yaml::MachineFunction &MF,
     277          12 :                          const MachineRegisterInfo &RegInfo,
     278           4 :                          const TargetRegisterInfo *TRI) {
     279           4 :   MF.TracksRegLiveness = RegInfo.tracksLiveness();
     280          12 : 
     281           4 :   // Print the virtual register definitions.
     282           4 :   for (unsigned I = 0, E = RegInfo.getNumVirtRegs(); I < E; ++I) {
     283          16 :     unsigned Reg = TargetRegisterInfo::index2VirtReg(I);
     284          12 :     yaml::VirtualRegisterDefinition VReg;
     285          12 :     VReg.ID = I;
     286             :     if (RegInfo.getVRegName(Reg) != "")
     287           4 :       continue;
     288           2 :     ::printRegClassOrBank(Reg, VReg.Class, RegInfo, TRI);
     289             :     unsigned PreferredReg = RegInfo.getSimpleHint(Reg);
     290           6 :     if (PreferredReg)
     291           2 :       printRegMIR(PreferredReg, VReg.PreferredRegister, TRI);
     292           2 :     MF.VirtualRegisters.push_back(VReg);
     293           6 :   }
     294           2 : 
     295           2 :   // Print the live ins.
     296           8 :   for (std::pair<unsigned, unsigned> LI : RegInfo.liveins()) {
     297           6 :     yaml::MachineFunctionLiveIn LiveIn;
     298           6 :     printRegMIR(LI.first, LiveIn.Register, TRI);
     299             :     if (LI.second)
     300           2 :       printRegMIR(LI.second, LiveIn.VirtualRegister, TRI);
     301             :     MF.LiveIns.push_back(LiveIn);
     302        4764 :   }
     303             : 
     304             :   // Prints the callee saved registers.
     305        9528 :   if (RegInfo.isUpdatedCSRsInitialized()) {
     306             :     const MCPhysReg *CalleeSavedRegs = RegInfo.getCalleeSavedRegs();
     307             :     std::vector<yaml::FlowStringValue> CalleeSavedRegisters;
     308       27647 :     for (const MCPhysReg *I = CalleeSavedRegs; *I; ++I) {
     309             :       yaml::FlowStringValue Reg;
     310       22802 :       printRegMIR(*I, Reg, TRI);
     311       22883 :       CalleeSavedRegisters.push_back(Reg);
     312             :     }
     313          81 :     MF.CalleeSavedRegisters = CalleeSavedRegisters;
     314       22802 :   }
     315             : }
     316       22802 : 
     317         200 : void MIRPrinter::convert(ModuleSlotTracker &MST,
     318       22802 :                          yaml::MachineFrameInfo &YamlMFI,
     319             :                          const MachineFrameInfo &MFI) {
     320             :   YamlMFI.IsFrameAddressTaken = MFI.isFrameAddressTaken();
     321             :   YamlMFI.IsReturnAddressTaken = MFI.isReturnAddressTaken();
     322        6377 :   YamlMFI.HasStackMap = MFI.hasStackMap();
     323        1613 :   YamlMFI.HasPatchPoint = MFI.hasPatchPoint();
     324        1613 :   YamlMFI.StackSize = MFI.getStackSize();
     325        1613 :   YamlMFI.OffsetAdjustment = MFI.getOffsetAdjustment();
     326        1022 :   YamlMFI.MaxAlignment = MFI.getMaxAlignment();
     327        1613 :   YamlMFI.AdjustsStack = MFI.adjustsStack();
     328             :   YamlMFI.HasCalls = MFI.hasCalls();
     329             :   YamlMFI.MaxCallFrameSize = MFI.isMaxCallFrameSizeComputed()
     330             :     ? MFI.getMaxCallFrameSize() : ~0u;
     331        4764 :   YamlMFI.CVBytesOfCalleeSavedRegisters =
     332          12 :       MFI.getCVBytesOfCalleeSavedRegisters();
     333          12 :   YamlMFI.HasOpaqueSPAdjustment = MFI.hasOpaqueSPAdjustment();
     334         425 :   YamlMFI.HasVAStart = MFI.hasVAStart();
     335             :   YamlMFI.HasMustTailInVarArgFunc = MFI.hasMustTailInVarArgFunc();
     336         413 :   YamlMFI.LocalFrameSize = MFI.getLocalFrameSize();
     337         413 :   if (MFI.getSavePoint()) {
     338             :     raw_string_ostream StrOS(YamlMFI.SavePoint.Value);
     339             :     StrOS << printMBBReference(*MFI.getSavePoint());
     340             :   }
     341        4764 :   if (MFI.getRestorePoint()) {
     342             :     raw_string_ostream StrOS(YamlMFI.RestorePoint.Value);
     343        4764 :     StrOS << printMBBReference(*MFI.getRestorePoint());
     344             :   }
     345             : }
     346        4764 : 
     347        4764 : void MIRPrinter::convertStackObjects(yaml::MachineFunction &YMF,
     348        4764 :                                      const MachineFunction &MF,
     349        4764 :                                      ModuleSlotTracker &MST) {
     350        4764 :   const MachineFrameInfo &MFI = MF.getFrameInfo();
     351        4764 :   const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
     352        4764 :   // Process fixed stack objects.
     353        4764 :   unsigned ID = 0;
     354        4764 :   for (int I = MFI.getObjectIndexBegin(); I < 0; ++I) {
     355        9528 :     if (MFI.isDeadObjectIndex(I))
     356        4764 :       continue;
     357        4764 : 
     358        4764 :     yaml::FixedMachineStackObject YamlObject;
     359        4764 :     YamlObject.ID = ID;
     360        4764 :     YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
     361        4764 :                           ? yaml::FixedMachineStackObject::SpillSlot
     362        4764 :                           : yaml::FixedMachineStackObject::DefaultType;
     363        4764 :     YamlObject.Offset = MFI.getObjectOffset(I);
     364           2 :     YamlObject.Size = MFI.getObjectSize(I);
     365           4 :     YamlObject.Alignment = MFI.getObjectAlignment(I);
     366             :     YamlObject.StackID = MFI.getStackID(I);
     367        4764 :     YamlObject.IsImmutable = MFI.isImmutableObjectIndex(I);
     368           2 :     YamlObject.IsAliased = MFI.isAliasedObjectIndex(I);
     369           4 :     YMF.FixedStackObjects.push_back(YamlObject);
     370             :     StackObjectOperandMapping.insert(
     371        4764 :         std::make_pair(I, FrameIndexOperand::createFixed(ID++)));
     372             :   }
     373        4764 : 
     374             :   // Process ordinary stack objects.
     375             :   ID = 0;
     376        4764 :   for (int I = 0, E = MFI.getObjectIndexEnd(); I < E; ++I) {
     377        4764 :     if (MFI.isDeadObjectIndex(I))
     378             :       continue;
     379             : 
     380        5140 :     yaml::MachineStackObject YamlObject;
     381         376 :     YamlObject.ID = ID;
     382           0 :     if (const auto *Alloca = MFI.getObjectAllocation(I))
     383             :       YamlObject.Name.Value =
     384         376 :           Alloca->hasName() ? Alloca->getName() : "<unnamed alloca>";
     385         376 :     YamlObject.Type = MFI.isSpillSlotObjectIndex(I)
     386         376 :                           ? yaml::MachineStackObject::SpillSlot
     387         376 :                           : MFI.isVariableSizedObjectIndex(I)
     388             :                                 ? yaml::MachineStackObject::VariableSized
     389         376 :                                 : yaml::MachineStackObject::DefaultType;
     390         376 :     YamlObject.Offset = MFI.getObjectOffset(I);
     391         376 :     YamlObject.Size = MFI.getObjectSize(I);
     392         376 :     YamlObject.Alignment = MFI.getObjectAlignment(I);
     393         376 :     YamlObject.StackID = MFI.getStackID(I);
     394         376 : 
     395         376 :     YMF.StackObjects.push_back(YamlObject);
     396         376 :     StackObjectOperandMapping.insert(std::make_pair(
     397         752 :         I, FrameIndexOperand::create(YamlObject.Name.Value, ID++)));
     398             :   }
     399             : 
     400             :   for (const auto &CSInfo : MFI.getCalleeSavedInfo()) {
     401             :     yaml::StringValue Reg;
     402        5354 :     printRegMIR(CSInfo.getReg(), Reg, TRI);
     403         590 :     auto StackObjectInfo = StackObjectOperandMapping.find(CSInfo.getFrameIdx());
     404           8 :     assert(StackObjectInfo != StackObjectOperandMapping.end() &&
     405             :            "Invalid stack object index");
     406         582 :     const FrameIndexOperand &StackObject = StackObjectInfo->second;
     407         582 :     if (StackObject.IsFixed) {
     408         582 :       YMF.FixedStackObjects[StackObject.ID].CalleeSavedRegister = Reg;
     409             :       YMF.FixedStackObjects[StackObject.ID].CalleeSavedRestored =
     410         372 :         CSInfo.isRestored();
     411         582 :     } else {
     412         582 :       YMF.StackObjects[StackObject.ID].CalleeSavedRegister = Reg;
     413             :       YMF.StackObjects[StackObject.ID].CalleeSavedRestored =
     414         205 :         CSInfo.isRestored();
     415             :     }
     416         582 :   }
     417         582 :   for (unsigned I = 0, E = MFI.getLocalFrameObjectCount(); I < E; ++I) {
     418         582 :     auto LocalObject = MFI.getLocalFrameObjectMap(I);
     419         582 :     auto StackObjectInfo = StackObjectOperandMapping.find(LocalObject.first);
     420             :     assert(StackObjectInfo != StackObjectOperandMapping.end() &&
     421         582 :            "Invalid stack object index");
     422         582 :     const FrameIndexOperand &StackObject = StackObjectInfo->second;
     423        1164 :     assert(!StackObject.IsFixed && "Expected a locally mapped stack object");
     424             :     YMF.StackObjects[StackObject.ID].LocalOffset = LocalObject.second;
     425             :   }
     426        5063 : 
     427             :   // Print the stack object references in the frame information class after
     428         299 :   // converting the stack objects.
     429         299 :   if (MFI.hasStackProtectorIndex()) {
     430             :     raw_string_ostream StrOS(YMF.FrameInfo.StackProtector.Value);
     431             :     MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping)
     432         299 :         .printStackObjectReference(MFI.getStackProtectorIndex());
     433         299 :   }
     434          43 : 
     435          43 :   // Print the debug variable information.
     436          43 :   for (const MachineFunction::VariableDbgInfo &DebugVar :
     437             :        MF.getVariableDbgInfo()) {
     438         256 :     auto StackObjectInfo = StackObjectOperandMapping.find(DebugVar.Slot);
     439         256 :     assert(StackObjectInfo != StackObjectOperandMapping.end() &&
     440         256 :            "Invalid stack object index");
     441             :     const FrameIndexOperand &StackObject = StackObjectInfo->second;
     442             :     if (StackObject.IsFixed) {
     443        4817 :       auto &Object = YMF.FixedStackObjects[StackObject.ID];
     444          53 :       printStackObjectDbgInfo(DebugVar, Object, MST);
     445          53 :     } else {
     446             :       auto &Object = YMF.StackObjects[StackObject.ID];
     447             :       printStackObjectDbgInfo(DebugVar, Object, MST);
     448          53 :     }
     449             :   }
     450         106 : }
     451             : 
     452             : void MIRPrinter::convert(yaml::MachineFunction &MF,
     453             :                          const MachineConstantPool &ConstantPool) {
     454             :   unsigned ID = 0;
     455        4764 :   for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) {
     456           1 :     std::string Str;
     457           2 :     raw_string_ostream StrOS(Str);
     458           1 :     if (Constant.isMachineConstantPoolEntry()) {
     459             :       Constant.Val.MachineCPVal->print(StrOS);
     460             :     } else {
     461             :       Constant.Val.ConstVal->printAsOperand(StrOS);
     462           6 :     }
     463        4770 : 
     464           6 :     yaml::MachineConstantPoolValue YamlConstant;
     465             :     YamlConstant.ID = ID++;
     466             :     YamlConstant.Value = StrOS.str();
     467           6 :     YamlConstant.Alignment = Constant.getAlignment();
     468           6 :     YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry();
     469           2 : 
     470           2 :     MF.Constants.push_back(YamlConstant);
     471             :   }
     472           4 : }
     473           4 : 
     474             : void MIRPrinter::convert(ModuleSlotTracker &MST,
     475             :                          yaml::MachineJumpTable &YamlJTI,
     476        4764 :                          const MachineJumpTableInfo &JTI) {
     477             :   YamlJTI.Kind = JTI.getEntryKind();
     478        4764 :   unsigned ID = 0;
     479             :   for (const auto &Table : JTI.getJumpTables()) {
     480             :     std::string Str;
     481        4823 :     yaml::MachineJumpTable::Entry Entry;
     482             :     Entry.ID = ID++;
     483          59 :     for (const auto *MBB : Table.MBBs) {
     484         118 :       raw_string_ostream StrOS(Str);
     485           4 :       StrOS << printMBBReference(*MBB);
     486             :       Entry.Blocks.push_back(StrOS.str());
     487          55 :       Str.clear();
     488             :     }
     489             :     YamlJTI.Entries.push_back(Entry);
     490             :   }
     491          59 : }
     492          59 : 
     493          59 : void MIRPrinter::initRegisterMaskIds(const MachineFunction &MF) {
     494          59 :   const auto *TRI = MF.getSubtarget().getRegisterInfo();
     495             :   unsigned I = 0;
     496          59 :   for (const uint32_t *Mask : TRI->getRegMasks())
     497             :     RegisterMaskIds.insert(std::make_pair(Mask, I++));
     498        4764 : }
     499             : 
     500           9 : void llvm::guessSuccessors(const MachineBasicBlock &MBB,
     501             :                            SmallVectorImpl<MachineBasicBlock*> &Result,
     502             :                            bool &IsFallthrough) {
     503           9 :   SmallPtrSet<MachineBasicBlock*,8> Seen;
     504             : 
     505          18 :   for (const MachineInstr &MI : MBB) {
     506             :     if (MI.isPHI())
     507             :       continue;
     508           9 :     for (const MachineOperand &MO : MI.operands()) {
     509          91 :       if (!MO.isMBB())
     510          82 :         continue;
     511         164 :       MachineBasicBlock *Succ = MO.getMBB();
     512         164 :       auto RP = Seen.insert(Succ);
     513             :       if (RP.second)
     514             :         Result.push_back(Succ);
     515           9 :     }
     516             :   }
     517           9 :   MachineBasicBlock::const_iterator I = MBB.getLastNonDebugInstr();
     518             :   IsFallthrough = I == MBB.end() || !I->isBarrier();
     519        4764 : }
     520        4764 : 
     521             : bool
     522      102499 : MIPrinter::canPredictBranchProbabilities(const MachineBasicBlock &MBB) const {
     523       97735 :   if (MBB.succ_size() <= 1)
     524        4764 :     return true;
     525             :   if (!MBB.hasSuccessorProbabilities())
     526       10270 :     return true;
     527             : 
     528             :   SmallVector<BranchProbability,8> Normalized(MBB.Probs.begin(),
     529             :                                               MBB.Probs.end());
     530             :   BranchProbability::normalizeProbabilities(Normalized.begin(),
     531       74202 :                                             Normalized.end());
     532             :   SmallVector<BranchProbability,8> Equal(Normalized.size());
     533             :   BranchProbability::normalizeProbabilities(Equal.begin(), Equal.end());
     534      248795 : 
     535      185013 :   return std::equal(Normalized.begin(), Normalized.end(), Equal.begin());
     536      184492 : }
     537         521 : 
     538         521 : bool MIPrinter::canPredictSuccessors(const MachineBasicBlock &MBB) const {
     539         521 :   SmallVector<MachineBasicBlock*,8> GuessedSuccs;
     540         515 :   bool GuessedFallthrough;
     541             :   guessSuccessors(MBB, GuessedSuccs, GuessedFallthrough);
     542             :   if (GuessedFallthrough) {
     543             :     const MachineFunction &MF = *MBB.getParent();
     544       22918 :     MachineFunction::const_iterator NextI = std::next(MBB.getIterator());
     545       10270 :     if (NextI != MF.end()) {
     546             :       MachineBasicBlock *Next = const_cast<MachineBasicBlock*>(&*NextI);
     547             :       if (!is_contained(GuessedSuccs, Next))
     548        6882 :         GuessedSuccs.push_back(Next);
     549        6882 :     }
     550             :   }
     551         779 :   if (GuessedSuccs.size() != MBB.succ_size())
     552             :     return false;
     553             :   return std::equal(MBB.succ_begin(), MBB.succ_end(), GuessedSuccs.begin());
     554             : }
     555         769 : 
     556         769 : void MIPrinter::print(const MachineBasicBlock &MBB) {
     557             :   assert(MBB.getNumber() >= 0 && "Invalid MBB number");
     558         769 :   OS << "bb." << MBB.getNumber();
     559         769 :   bool HasAttributes = false;
     560             :   if (const auto *BB = MBB.getBasicBlock()) {
     561             :     if (BB->hasName()) {
     562             :       OS << "." << BB->getName();
     563             :     } else {
     564        4972 :       HasAttributes = true;
     565             :       OS << " (";
     566             :       int Slot = MST.getLocalSlot(BB);
     567        4972 :       if (Slot == -1)
     568        4972 :         OS << "<ir-block badref>";
     569        1182 :       else
     570        1182 :         OS << (Twine("%ir-block.") + Twine(Slot)).str();
     571        1182 :     }
     572          39 :   }
     573          39 :   if (MBB.hasAddressTaken()) {
     574          38 :     OS << (HasAttributes ? ", " : " (");
     575             :     OS << "address-taken";
     576             :     HasAttributes = true;
     577        9944 :   }
     578             :   if (MBB.isEHPad()) {
     579             :     OS << (HasAttributes ? ", " : " (");
     580             :     OS << "landing-pad";
     581             :     HasAttributes = true;
     582        6882 :   }
     583             :   if (MBB.getAlignment()) {
     584        6882 :     OS << (HasAttributes ? ", " : " (");
     585             :     OS << "align " << MBB.getAlignment();
     586        6882 :     HasAttributes = true;
     587        3802 :   }
     588        2232 :   if (HasAttributes)
     589             :     OS << ")";
     590             :   OS << ":\n";
     591        1570 : 
     592        1570 :   bool HasLineAttributes = false;
     593        1570 :   // Print the successors
     594           0 :   bool canPredictProbs = canPredictBranchProbabilities(MBB);
     595             :   // Even if the list of successors is empty, if we cannot guess it,
     596        3140 :   // we need to print it to tell the parser that the list is empty.
     597             :   // This is needed, because MI model unreachable as empty blocks
     598             :   // with an empty successor list. If the parser would see that
     599        6882 :   // without the successor list, it would guess the code would
     600          38 :   // fallthrough.
     601          19 :   if ((!MBB.succ_empty() && !SimplifyMIR) || !canPredictProbs ||
     602             :       !canPredictSuccessors(MBB)) {
     603             :     OS.indent(2) << "successors: ";
     604        6882 :     for (auto I = MBB.succ_begin(), E = MBB.succ_end(); I != E; ++I) {
     605          20 :       if (I != MBB.succ_begin())
     606          10 :         OS << ", ";
     607             :       OS << printMBBReference(**I);
     608             :       if (!SimplifyMIR || !canPredictProbs)
     609        6882 :         OS << '('
     610          40 :            << format("0x%08" PRIx32, MBB.getSuccProbability(I).getNumerator())
     611          21 :            << ')';
     612             :     }
     613             :     OS << "\n";
     614        6861 :     HasLineAttributes = true;
     615        1618 :   }
     616        6882 : 
     617             :   // Print the live in registers.
     618             :   const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
     619             :   if (MRI.tracksLiveness() && !MBB.livein_empty()) {
     620        6882 :     const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
     621             :     OS.indent(2) << "liveins: ";
     622             :     bool First = true;
     623             :     for (const auto &LI : MBB.liveins()) {
     624             :       if (!First)
     625             :         OS << ", ";
     626             :       First = false;
     627       11854 :       OS << printReg(LI.PhysReg, &TRI);
     628        4972 :       if (!LI.LaneMask.all())
     629        1945 :         OS << ":0x" << PrintLaneMask(LI.LaneMask);
     630        4683 :     }
     631        2738 :     OS << "\n";
     632         824 :     HasLineAttributes = true;
     633        5476 :   }
     634        2738 : 
     635        2730 :   if (HasLineAttributes)
     636        5460 :     OS << "\n";
     637             :   bool IsInBundle = false;
     638             :   for (auto I = MBB.instr_begin(), E = MBB.instr_end(); I != E; ++I) {
     639        1945 :     const MachineInstr &MI = *I;
     640             :     if (IsInBundle && !MI.isInsideBundle()) {
     641             :       OS.indent(2) << "}\n";
     642             :       IsInBundle = false;
     643             :     }
     644        6882 :     OS.indent(IsInBundle ? 4 : 2);
     645       13764 :     print(MI);
     646             :     if (!IsInBundle && MI.getFlag(MachineInstr::BundledSucc)) {
     647        2306 :       OS << " {";
     648             :       IsInBundle = true;
     649        7686 :     }
     650        5380 :     OS << "\n";
     651        3074 :   }
     652             :   if (IsInBundle)
     653        5380 :     OS.indent(2) << "}\n";
     654        5380 : }
     655          96 : 
     656             : void MIPrinter::print(const MachineInstr &MI) {
     657        2306 :   const auto *MF = MI.getMF();
     658             :   const auto &MRI = MF->getRegInfo();
     659             :   const auto &SubTarget = MF->getSubtarget();
     660             :   const auto *TRI = SubTarget.getRegisterInfo();
     661        4576 :   assert(TRI && "Expected target register info");
     662        3733 :   const auto *TII = SubTarget.getInstrInfo();
     663             :   assert(TII && "Expected target instruction info");
     664       49273 :   if (MI.isCFIInstruction())
     665             :     assert(MI.getNumOperands() == 1 && "Expected 1 operand in CFI instruction");
     666       42391 : 
     667          25 :   SmallBitVector PrintedTypes(8);
     668             :   bool ShouldPrintRegisterTies = MI.hasComplexRegisterTies();
     669             :   unsigned I = 0, E = MI.getNumOperands();
     670       84306 :   for (; I < E && MI.getOperand(I).isReg() && MI.getOperand(I).isDef() &&
     671       42391 :          !MI.getOperand(I).isImplicit();
     672       42391 :        ++I) {
     673         392 :     if (I)
     674             :       OS << ", ";
     675             :     print(MI, I, TRI, ShouldPrintRegisterTies,
     676       42391 :           MI.getTypeToPrint(I, PrintedTypes, MRI),
     677             :           /*PrintDef=*/false);
     678        6882 :   }
     679         367 : 
     680        6882 :   if (I)
     681             :     OS << " = ";
     682       42391 :   if (MI.getFlag(MachineInstr::FrameSetup))
     683       42391 :     OS << "frame-setup ";
     684       42391 :   if (MI.getFlag(MachineInstr::FrameDestroy))
     685       42391 :     OS << "frame-destroy ";
     686       42391 :   if (MI.getFlag(MachineInstr::FmNoNans))
     687             :     OS << "nnan ";
     688       42391 :   if (MI.getFlag(MachineInstr::FmNoInfs))
     689             :     OS << "ninf ";
     690             :   if (MI.getFlag(MachineInstr::FmNsz))
     691             :     OS << "nsz ";
     692             :   if (MI.getFlag(MachineInstr::FmArcp))
     693       42391 :     OS << "arcp ";
     694       42391 :   if (MI.getFlag(MachineInstr::FmContract))
     695       42391 :     OS << "contract ";
     696       73606 :   if (MI.getFlag(MachineInstr::FmAfn))
     697             :     OS << "afn ";
     698             :   if (MI.getFlag(MachineInstr::FmReassoc))
     699       31215 :     OS << "reassoc ";
     700         475 :   if (MI.getFlag(MachineInstr::NoUWrap))
     701       31215 :     OS << "nuw ";
     702             :   if (MI.getFlag(MachineInstr::NoSWrap))
     703             :     OS << "nsw ";
     704             :   if (MI.getFlag(MachineInstr::IsExact))
     705             :     OS << "exact ";
     706       42391 : 
     707       30740 :   OS << TII->getName(MI.getOpcode());
     708       42391 :   if (I < E)
     709         388 :     OS << ' ';
     710       42391 : 
     711          89 :   bool NeedComma = false;
     712       42391 :   for (; I < E; ++I) {
     713          13 :     if (NeedComma)
     714       42391 :       OS << ", ";
     715           9 :     print(MI, I, TRI, ShouldPrintRegisterTies,
     716       42391 :           MI.getTypeToPrint(I, PrintedTypes, MRI));
     717          12 :     NeedComma = true;
     718       42391 :   }
     719          14 : 
     720       42391 :   // Print any optional symbols attached to this instruction as-if they were
     721          15 :   // operands.
     722       42391 :   if (MCSymbol *PreInstrSymbol = MI.getPreInstrSymbol()) {
     723          11 :     if (NeedComma)
     724       42391 :       OS << ',';
     725          15 :     OS << " pre-instr-symbol ";
     726       42391 :     MachineOperand::printSymbol(OS, *PreInstrSymbol);
     727          11 :     NeedComma = true;
     728       42391 :   }
     729          23 :   if (MCSymbol *PostInstrSymbol = MI.getPostInstrSymbol()) {
     730       42391 :     if (NeedComma)
     731           1 :       OS << ',';
     732             :     OS << " post-instr-symbol ";
     733      127173 :     MachineOperand::printSymbol(OS, *PostInstrSymbol);
     734       42391 :     NeedComma = true;
     735       40578 :   }
     736             : 
     737             :   if (const DebugLoc &DL = MI.getDebugLoc()) {
     738      137790 :     if (NeedComma)
     739       95399 :       OS << ',';
     740       54821 :     OS << " debug-location ";
     741       95399 :     DL->printAsOperand(OS, MST);
     742             :   }
     743             : 
     744             :   if (!MI.memoperands_empty()) {
     745             :     OS << " :: ";
     746             :     const LLVMContext &Context = MF->getFunction().getContext();
     747             :     const MachineFrameInfo &MFI = MF->getFrameInfo();
     748       42391 :     bool NeedComma = false;
     749           2 :     for (const auto *Op : MI.memoperands()) {
     750           2 :       if (NeedComma)
     751           2 :         OS << ", ";
     752           2 :       Op->print(OS, MST, SSNs, Context, &MFI, TII);
     753             :       NeedComma = true;
     754             :     }
     755       42391 :   }
     756           2 : }
     757           2 : 
     758           2 : void MIPrinter::printStackObjectReference(int FrameIndex) {
     759           2 :   auto ObjectInfo = StackObjectOperandMapping.find(FrameIndex);
     760             :   assert(ObjectInfo != StackObjectOperandMapping.end() &&
     761             :          "Invalid frame index");
     762             :   const FrameIndexOperand &Operand = ObjectInfo->second;
     763       42391 :   MachineOperand::printStackObjectReference(OS, Operand.ID, Operand.IsFixed,
     764        1178 :                                             Operand.Name);
     765        1169 : }
     766        1178 : 
     767        1178 : void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx,
     768             :                       const TargetRegisterInfo *TRI,
     769             :                       bool ShouldPrintRegisterTies, LLT TypeToPrint,
     770       42391 :                       bool PrintDef) {
     771        3208 :   const MachineOperand &Op = MI.getOperand(OpIdx);
     772        3208 :   switch (Op.getType()) {
     773        3208 :   case MachineOperand::MO_Immediate:
     774             :     if (MI.isOperandSubregIdx(OpIdx)) {
     775        6557 :       MachineOperand::printTargetFlags(OS, Op);
     776        3349 :       MachineOperand::printSubRegIdx(OS, Op.getImm(), TRI);
     777         141 :       break;
     778        3349 :     }
     779             :     LLVM_FALLTHROUGH;
     780             :   case MachineOperand::MO_Register:
     781             :   case MachineOperand::MO_CImmediate:
     782       42391 :   case MachineOperand::MO_FPImmediate:
     783             :   case MachineOperand::MO_MachineBasicBlock:
     784         754 :   case MachineOperand::MO_ConstantPoolIndex:
     785         754 :   case MachineOperand::MO_TargetIndex:
     786             :   case MachineOperand::MO_JumpTableIndex:
     787             :   case MachineOperand::MO_ExternalSymbol:
     788         754 :   case MachineOperand::MO_GlobalAddress:
     789         754 :   case MachineOperand::MO_RegisterLiveOut:
     790             :   case MachineOperand::MO_Metadata:
     791         754 :   case MachineOperand::MO_MCSymbol:
     792             :   case MachineOperand::MO_CFIIndex:
     793      126614 :   case MachineOperand::MO_IntrinsicID:
     794             :   case MachineOperand::MO_Predicate:
     795             :   case MachineOperand::MO_BlockAddress: {
     796             :     unsigned TiedOperandIdx = 0;
     797      126614 :     if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef())
     798      126614 :       TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx);
     799       22350 :     const TargetIntrinsicInfo *TII = MI.getMF()->getTarget().getIntrinsicInfo();
     800       22350 :     Op.print(OS, MST, TypeToPrint, PrintDef, /*IsStandalone=*/false,
     801         574 :              ShouldPrintRegisterTies, TiedOperandIdx, TRI, TII);
     802         574 :     break;
     803         574 :   }
     804             :   case MachineOperand::MO_FrameIndex:
     805             :     printStackObjectReference(Op.getIndex());
     806             :     break;
     807             :   case MachineOperand::MO_RegisterMask: {
     808             :     auto RegMaskInfo = RegisterMaskIds.find(Op.getRegMask());
     809             :     if (RegMaskInfo != RegisterMaskIds.end())
     810             :       OS << StringRef(TRI->getRegMaskNames()[RegMaskInfo->second]).lower();
     811             :     else
     812             :       printCustomRegMask(Op.getRegMask(), OS, TRI);
     813             :     break;
     814             :   }
     815             :   }
     816             : }
     817             : 
     818             : void llvm::printMIR(raw_ostream &OS, const Module &M) {
     819             :   yaml::Output Out(OS);
     820             :   Out << const_cast<Module &>(M);
     821             : }
     822             : 
     823      124793 : void llvm::printMIR(raw_ostream &OS, const MachineFunction &MF) {
     824          12 :   MIRPrinter Printer(OS);
     825      124793 :   Printer.print(MF);
     826      124793 : }

Generated by: LCOV version 1.13