| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 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 |  | 
| David Blaikie | 3f833ed | 2017-11-08 01:01:31 +0000 | [diff] [blame] | 15 | #include "llvm/CodeGen/MIRPrinter.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 16 | #include "llvm/ADT/DenseMap.h" | 
|  | 17 | #include "llvm/ADT/None.h" | 
| David Blaikie | 3f833ed | 2017-11-08 01:01:31 +0000 | [diff] [blame] | 18 | #include "llvm/ADT/STLExtras.h" | 
| Tim Northover | d28d3cc | 2016-09-12 11:20:10 +0000 | [diff] [blame] | 19 | #include "llvm/ADT/SmallBitVector.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 20 | #include "llvm/ADT/SmallPtrSet.h" | 
|  | 21 | #include "llvm/ADT/SmallVector.h" | 
| Konstantin Zhuravlyov | bb80d3e | 2017-07-11 22:23:00 +0000 | [diff] [blame] | 22 | #include "llvm/ADT/StringExtras.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 23 | #include "llvm/ADT/StringRef.h" | 
|  | 24 | #include "llvm/ADT/Twine.h" | 
| Quentin Colombet | fab1cfe | 2016-04-08 16:26:22 +0000 | [diff] [blame] | 25 | #include "llvm/CodeGen/GlobalISel/RegisterBank.h" | 
| David Blaikie | 3f833ed | 2017-11-08 01:01:31 +0000 | [diff] [blame] | 26 | #include "llvm/CodeGen/MIRYamlMapping.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 27 | #include "llvm/CodeGen/MachineBasicBlock.h" | 
| Alex Lorenz | ab98049 | 2015-07-20 20:51:18 +0000 | [diff] [blame] | 28 | #include "llvm/CodeGen/MachineConstantPool.h" | 
| Alex Lorenz | 60541c1 | 2015-07-09 19:55:27 +0000 | [diff] [blame] | 29 | #include "llvm/CodeGen/MachineFrameInfo.h" | 
| Quentin Colombet | fab1cfe | 2016-04-08 16:26:22 +0000 | [diff] [blame] | 30 | #include "llvm/CodeGen/MachineFunction.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 31 | #include "llvm/CodeGen/MachineInstr.h" | 
|  | 32 | #include "llvm/CodeGen/MachineJumpTableInfo.h" | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 33 | #include "llvm/CodeGen/MachineMemOperand.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 34 | #include "llvm/CodeGen/MachineOperand.h" | 
| Alex Lorenz | 54565cf | 2015-06-24 19:56:10 +0000 | [diff] [blame] | 35 | #include "llvm/CodeGen/MachineRegisterInfo.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 36 | #include "llvm/CodeGen/PseudoSourceValue.h" | 
| David Blaikie | 3f833ed | 2017-11-08 01:01:31 +0000 | [diff] [blame] | 37 | #include "llvm/CodeGen/TargetInstrInfo.h" | 
| David Blaikie | b3bde2e | 2017-11-17 01:07:10 +0000 | [diff] [blame] | 38 | #include "llvm/CodeGen/TargetRegisterInfo.h" | 
|  | 39 | #include "llvm/CodeGen/TargetSubtargetInfo.h" | 
| Alex Lorenz | 4f093bf | 2015-06-19 17:43:07 +0000 | [diff] [blame] | 40 | #include "llvm/IR/BasicBlock.h" | 
| Alex Lorenz | deb5349 | 2015-07-28 17:28:03 +0000 | [diff] [blame] | 41 | #include "llvm/IR/Constants.h" | 
| Reid Kleckner | 2886580 | 2016-04-14 18:29:59 +0000 | [diff] [blame] | 42 | #include "llvm/IR/DebugInfo.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 43 | #include "llvm/IR/DebugLoc.h" | 
|  | 44 | #include "llvm/IR/Function.h" | 
|  | 45 | #include "llvm/IR/GlobalValue.h" | 
| David Blaikie | 3f833ed | 2017-11-08 01:01:31 +0000 | [diff] [blame] | 46 | #include "llvm/IR/IRPrintingPasses.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 47 | #include "llvm/IR/InstrTypes.h" | 
| Quentin Colombet | fab1cfe | 2016-04-08 16:26:22 +0000 | [diff] [blame] | 48 | #include "llvm/IR/Instructions.h" | 
| Tim Northover | 6b3bd61 | 2016-07-29 20:32:59 +0000 | [diff] [blame] | 49 | #include "llvm/IR/Intrinsics.h" | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 50 | #include "llvm/IR/Module.h" | 
| Alex Lorenz | 900b5cb | 2015-07-07 23:27:53 +0000 | [diff] [blame] | 51 | #include "llvm/IR/ModuleSlotTracker.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 52 | #include "llvm/IR/Value.h" | 
|  | 53 | #include "llvm/MC/LaneBitmask.h" | 
|  | 54 | #include "llvm/MC/MCDwarf.h" | 
| Alex Lorenz | f22ca8a | 2015-08-21 21:12:44 +0000 | [diff] [blame] | 55 | #include "llvm/MC/MCSymbol.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 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" | 
| Geoff Berry | b51774a | 2016-11-18 19:37:24 +0000 | [diff] [blame] | 61 | #include "llvm/Support/Format.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 62 | #include "llvm/Support/LowLevelTypeImpl.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 63 | #include "llvm/Support/YAMLTraits.h" | 
| David Blaikie | 3f833ed | 2017-11-08 01:01:31 +0000 | [diff] [blame] | 64 | #include "llvm/Support/raw_ostream.h" | 
| Tim Northover | 6b3bd61 | 2016-07-29 20:32:59 +0000 | [diff] [blame] | 65 | #include "llvm/Target/TargetIntrinsicInfo.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 66 | #include "llvm/Target/TargetMachine.h" | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 67 | #include <algorithm> | 
|  | 68 | #include <cassert> | 
|  | 69 | #include <cinttypes> | 
|  | 70 | #include <cstdint> | 
|  | 71 | #include <iterator> | 
|  | 72 | #include <string> | 
|  | 73 | #include <utility> | 
|  | 74 | #include <vector> | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 75 |  | 
|  | 76 | using namespace llvm; | 
|  | 77 |  | 
| Zachary Turner | 8065f0b | 2017-12-01 00:53:10 +0000 | [diff] [blame] | 78 | static cl::opt<bool> SimplifyMIR( | 
|  | 79 | "simplify-mir", cl::Hidden, | 
| Matthias Braun | 8940114 | 2017-05-05 21:09:30 +0000 | [diff] [blame] | 80 | cl::desc("Leave out unnecessary information when printing MIR")); | 
|  | 81 |  | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 82 | namespace { | 
|  | 83 |  | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 84 | /// This structure describes how to print out stack object references. | 
|  | 85 | struct FrameIndexOperand { | 
|  | 86 | std::string Name; | 
|  | 87 | unsigned ID; | 
|  | 88 | bool IsFixed; | 
|  | 89 |  | 
|  | 90 | FrameIndexOperand(StringRef Name, unsigned ID, bool IsFixed) | 
|  | 91 | : 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 |  | 
| Alex Lorenz | 618b283 | 2015-07-30 16:54:38 +0000 | [diff] [blame] | 104 | } // end anonymous namespace | 
|  | 105 |  | 
|  | 106 | namespace llvm { | 
|  | 107 |  | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 108 | /// This class prints out the machine functions using the MIR serialization | 
|  | 109 | /// format. | 
|  | 110 | class MIRPrinter { | 
|  | 111 | raw_ostream &OS; | 
| Alex Lorenz | 8f6f428 | 2015-06-29 16:57:06 +0000 | [diff] [blame] | 112 | DenseMap<const uint32_t *, unsigned> RegisterMaskIds; | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 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; | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 116 |  | 
|  | 117 | public: | 
|  | 118 | MIRPrinter(raw_ostream &OS) : OS(OS) {} | 
|  | 119 |  | 
|  | 120 | void print(const MachineFunction &MF); | 
| Alex Lorenz | 4f093bf | 2015-06-19 17:43:07 +0000 | [diff] [blame] | 121 |  | 
| Alex Lorenz | 28148ba | 2015-07-09 22:23:13 +0000 | [diff] [blame] | 122 | void convert(yaml::MachineFunction &MF, const MachineRegisterInfo &RegInfo, | 
|  | 123 | const TargetRegisterInfo *TRI); | 
| Alex Lorenz | a6f9a37 | 2015-07-29 21:09:09 +0000 | [diff] [blame] | 124 | void convert(ModuleSlotTracker &MST, yaml::MachineFrameInfo &YamlMFI, | 
|  | 125 | const MachineFrameInfo &MFI); | 
| Alex Lorenz | ab98049 | 2015-07-20 20:51:18 +0000 | [diff] [blame] | 126 | void convert(yaml::MachineFunction &MF, | 
|  | 127 | const MachineConstantPool &ConstantPool); | 
| Alex Lorenz | 6799e9b | 2015-07-15 23:31:07 +0000 | [diff] [blame] | 128 | void convert(ModuleSlotTracker &MST, yaml::MachineJumpTable &YamlJTI, | 
|  | 129 | const MachineJumpTableInfo &JTI); | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 130 | void convertStackObjects(yaml::MachineFunction &YMF, | 
|  | 131 | const MachineFunction &MF, ModuleSlotTracker &MST); | 
| Alex Lorenz | 8f6f428 | 2015-06-29 16:57:06 +0000 | [diff] [blame] | 132 |  | 
|  | 133 | private: | 
|  | 134 | void initRegisterMaskIds(const MachineFunction &MF); | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 135 | }; | 
|  | 136 |  | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 137 | /// This class prints out the machine instructions using the MIR serialization | 
|  | 138 | /// format. | 
|  | 139 | class MIPrinter { | 
|  | 140 | raw_ostream &OS; | 
| Alex Lorenz | 900b5cb | 2015-07-07 23:27:53 +0000 | [diff] [blame] | 141 | ModuleSlotTracker &MST; | 
| Alex Lorenz | 8f6f428 | 2015-06-29 16:57:06 +0000 | [diff] [blame] | 142 | const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds; | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 143 | const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping; | 
| Konstantin Zhuravlyov | bb80d3e | 2017-07-11 22:23:00 +0000 | [diff] [blame] | 144 | /// Synchronization scope names registered with LLVMContext. | 
|  | 145 | SmallVector<StringRef, 8> SSNs; | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 146 |  | 
| Matthias Braun | 8940114 | 2017-05-05 21:09:30 +0000 | [diff] [blame] | 147 | bool canPredictBranchProbabilities(const MachineBasicBlock &MBB) const; | 
|  | 148 | bool canPredictSuccessors(const MachineBasicBlock &MBB) const; | 
|  | 149 |  | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 150 | public: | 
| Alex Lorenz | 900b5cb | 2015-07-07 23:27:53 +0000 | [diff] [blame] | 151 | MIPrinter(raw_ostream &OS, ModuleSlotTracker &MST, | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 152 | const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds, | 
|  | 153 | const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping) | 
|  | 154 | : OS(OS), MST(MST), RegisterMaskIds(RegisterMaskIds), | 
|  | 155 | StackObjectOperandMapping(StackObjectOperandMapping) {} | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 156 |  | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 157 | void print(const MachineBasicBlock &MBB); | 
|  | 158 |  | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 159 | void print(const MachineInstr &MI); | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 160 | void printIRValueReference(const Value &V); | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 161 | void printStackObjectReference(int FrameIndex); | 
| Bjorn Pettersson | a42ed3e | 2017-11-06 21:46:06 +0000 | [diff] [blame] | 162 | void print(const MachineInstr &MI, unsigned OpIdx, | 
|  | 163 | const TargetRegisterInfo *TRI, bool ShouldPrintRegisterTies, | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 164 | LLT TypeToPrint, bool PrintDef = true); | 
| Geoff Berry | 6748abe | 2017-07-13 02:28:54 +0000 | [diff] [blame] | 165 | void print(const LLVMContext &Context, const TargetInstrInfo &TII, | 
|  | 166 | const MachineMemOperand &Op); | 
| Konstantin Zhuravlyov | bb80d3e | 2017-07-11 22:23:00 +0000 | [diff] [blame] | 167 | void printSyncScope(const LLVMContext &Context, SyncScope::ID SSID); | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 168 | }; | 
|  | 169 |  | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 170 | } // end namespace llvm | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 171 |  | 
|  | 172 | namespace llvm { | 
|  | 173 | namespace yaml { | 
|  | 174 |  | 
|  | 175 | /// This struct serializes the LLVM IR module. | 
|  | 176 | template <> struct BlockScalarTraits<Module> { | 
|  | 177 | static void output(const Module &Mod, void *Ctxt, raw_ostream &OS) { | 
|  | 178 | Mod.print(OS, nullptr); | 
|  | 179 | } | 
| Eugene Zelenko | fb69e66 | 2017-06-06 22:22:41 +0000 | [diff] [blame] | 180 |  | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 181 | static StringRef input(StringRef Str, void *Ctxt, Module &Mod) { | 
|  | 182 | llvm_unreachable("LLVM Module is supposed to be parsed separately"); | 
|  | 183 | return ""; | 
|  | 184 | } | 
|  | 185 | }; | 
|  | 186 |  | 
|  | 187 | } // end namespace yaml | 
|  | 188 | } // end namespace llvm | 
|  | 189 |  | 
| Francis Visoiu Mistrih | 9d419d3 | 2017-11-28 12:42:37 +0000 | [diff] [blame] | 190 | static void printRegMIR(unsigned Reg, yaml::StringValue &Dest, | 
|  | 191 | const TargetRegisterInfo *TRI) { | 
| Alex Lorenz | ab4cbcf | 2015-07-24 20:35:40 +0000 | [diff] [blame] | 192 | raw_string_ostream OS(Dest.Value); | 
| Francis Visoiu Mistrih | c71cced | 2017-11-30 16:12:24 +0000 | [diff] [blame] | 193 | OS << printReg(Reg, TRI); | 
| Alex Lorenz | ab4cbcf | 2015-07-24 20:35:40 +0000 | [diff] [blame] | 194 | } | 
|  | 195 |  | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 196 | void MIRPrinter::print(const MachineFunction &MF) { | 
| Alex Lorenz | 8f6f428 | 2015-06-29 16:57:06 +0000 | [diff] [blame] | 197 | initRegisterMaskIds(MF); | 
|  | 198 |  | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 199 | yaml::MachineFunction YamlMF; | 
|  | 200 | YamlMF.Name = MF.getName(); | 
| Alex Lorenz | 5b5f975 | 2015-06-16 00:10:47 +0000 | [diff] [blame] | 201 | YamlMF.Alignment = MF.getAlignment(); | 
|  | 202 | YamlMF.ExposesReturnsTwice = MF.exposesReturnsTwice(); | 
| Derek Schuff | ad154c8 | 2016-03-28 17:05:30 +0000 | [diff] [blame] | 203 |  | 
| Ahmed Bougacha | 0d7b0cb | 2016-08-02 15:10:25 +0000 | [diff] [blame] | 204 | YamlMF.Legalized = MF.getProperties().hasProperty( | 
|  | 205 | MachineFunctionProperties::Property::Legalized); | 
| Ahmed Bougacha | 2471265 | 2016-08-02 16:17:10 +0000 | [diff] [blame] | 206 | YamlMF.RegBankSelected = MF.getProperties().hasProperty( | 
|  | 207 | MachineFunctionProperties::Property::RegBankSelected); | 
| Ahmed Bougacha | b109d51 | 2016-08-02 16:49:19 +0000 | [diff] [blame] | 208 | YamlMF.Selected = MF.getProperties().hasProperty( | 
|  | 209 | MachineFunctionProperties::Property::Selected); | 
| Ahmed Bougacha | 0d7b0cb | 2016-08-02 15:10:25 +0000 | [diff] [blame] | 210 |  | 
| Alex Lorenz | 28148ba | 2015-07-09 22:23:13 +0000 | [diff] [blame] | 211 | convert(YamlMF, MF.getRegInfo(), MF.getSubtarget().getRegisterInfo()); | 
| Matthias Braun | f1caa28 | 2017-12-15 22:22:58 +0000 | [diff] [blame] | 212 | ModuleSlotTracker MST(MF.getFunction().getParent()); | 
|  | 213 | MST.incorporateFunction(MF.getFunction()); | 
| Matthias Braun | 941a705 | 2016-07-28 18:40:00 +0000 | [diff] [blame] | 214 | convert(MST, YamlMF.FrameInfo, MF.getFrameInfo()); | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 215 | convertStackObjects(YamlMF, MF, MST); | 
| Alex Lorenz | ab98049 | 2015-07-20 20:51:18 +0000 | [diff] [blame] | 216 | if (const auto *ConstantPool = MF.getConstantPool()) | 
|  | 217 | convert(YamlMF, *ConstantPool); | 
| Alex Lorenz | 6799e9b | 2015-07-15 23:31:07 +0000 | [diff] [blame] | 218 | if (const auto *JumpTableInfo = MF.getJumpTableInfo()) | 
|  | 219 | convert(MST, YamlMF.JumpTableInfo, *JumpTableInfo); | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 220 | raw_string_ostream StrOS(YamlMF.Body.Value.Value); | 
|  | 221 | bool IsNewlineNeeded = false; | 
| Alex Lorenz | 4f093bf | 2015-06-19 17:43:07 +0000 | [diff] [blame] | 222 | for (const auto &MBB : MF) { | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 223 | if (IsNewlineNeeded) | 
|  | 224 | StrOS << "\n"; | 
|  | 225 | MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping) | 
|  | 226 | .print(MBB); | 
|  | 227 | IsNewlineNeeded = true; | 
| Alex Lorenz | 4f093bf | 2015-06-19 17:43:07 +0000 | [diff] [blame] | 228 | } | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 229 | StrOS.flush(); | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 230 | yaml::Output Out(OS); | 
| Vivek Pandya | 56d87ef | 2017-06-06 08:16:19 +0000 | [diff] [blame] | 231 | if (!SimplifyMIR) | 
|  | 232 | Out.setWriteDefaultValues(true); | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 233 | Out << YamlMF; | 
|  | 234 | } | 
|  | 235 |  | 
| Oren Ben Simhon | 0ef61ec | 2017-03-19 08:14:18 +0000 | [diff] [blame] | 236 | static void printCustomRegMask(const uint32_t *RegMask, raw_ostream &OS, | 
|  | 237 | const TargetRegisterInfo *TRI) { | 
|  | 238 | assert(RegMask && "Can't print an empty register mask"); | 
|  | 239 | OS << StringRef("CustomRegMask("); | 
|  | 240 |  | 
|  | 241 | bool IsRegInRegMaskFound = false; | 
|  | 242 | for (int I = 0, E = TRI->getNumRegs(); I < E; I++) { | 
|  | 243 | // Check whether the register is asserted in regmask. | 
|  | 244 | if (RegMask[I / 32] & (1u << (I % 32))) { | 
|  | 245 | if (IsRegInRegMaskFound) | 
|  | 246 | OS << ','; | 
| Francis Visoiu Mistrih | c71cced | 2017-11-30 16:12:24 +0000 | [diff] [blame] | 247 | OS << printReg(I, TRI); | 
| Oren Ben Simhon | 0ef61ec | 2017-03-19 08:14:18 +0000 | [diff] [blame] | 248 | IsRegInRegMaskFound = true; | 
|  | 249 | } | 
|  | 250 | } | 
|  | 251 |  | 
|  | 252 | OS << ')'; | 
|  | 253 | } | 
|  | 254 |  | 
| Justin Bogner | 6c45283 | 2017-10-24 18:04:54 +0000 | [diff] [blame] | 255 | static void printRegClassOrBank(unsigned Reg, yaml::StringValue &Dest, | 
|  | 256 | const MachineRegisterInfo &RegInfo, | 
|  | 257 | const TargetRegisterInfo *TRI) { | 
|  | 258 | raw_string_ostream OS(Dest.Value); | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 259 | OS << printRegClassOrBank(Reg, RegInfo, TRI); | 
| Justin Bogner | 6c45283 | 2017-10-24 18:04:54 +0000 | [diff] [blame] | 260 | } | 
|  | 261 |  | 
|  | 262 |  | 
| Alex Lorenz | 54565cf | 2015-06-24 19:56:10 +0000 | [diff] [blame] | 263 | void MIRPrinter::convert(yaml::MachineFunction &MF, | 
| Alex Lorenz | 28148ba | 2015-07-09 22:23:13 +0000 | [diff] [blame] | 264 | const MachineRegisterInfo &RegInfo, | 
|  | 265 | const TargetRegisterInfo *TRI) { | 
| Alex Lorenz | 54565cf | 2015-06-24 19:56:10 +0000 | [diff] [blame] | 266 | MF.TracksRegLiveness = RegInfo.tracksLiveness(); | 
| Alex Lorenz | 28148ba | 2015-07-09 22:23:13 +0000 | [diff] [blame] | 267 |  | 
|  | 268 | // Print the virtual register definitions. | 
|  | 269 | for (unsigned I = 0, E = RegInfo.getNumVirtRegs(); I < E; ++I) { | 
|  | 270 | unsigned Reg = TargetRegisterInfo::index2VirtReg(I); | 
|  | 271 | yaml::VirtualRegisterDefinition VReg; | 
|  | 272 | VReg.ID = I; | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 273 | ::printRegClassOrBank(Reg, VReg.Class, RegInfo, TRI); | 
| Alex Lorenz | ab4cbcf | 2015-07-24 20:35:40 +0000 | [diff] [blame] | 274 | unsigned PreferredReg = RegInfo.getSimpleHint(Reg); | 
|  | 275 | if (PreferredReg) | 
| Francis Visoiu Mistrih | 9d419d3 | 2017-11-28 12:42:37 +0000 | [diff] [blame] | 276 | printRegMIR(PreferredReg, VReg.PreferredRegister, TRI); | 
| Alex Lorenz | 28148ba | 2015-07-09 22:23:13 +0000 | [diff] [blame] | 277 | MF.VirtualRegisters.push_back(VReg); | 
|  | 278 | } | 
| Alex Lorenz | 12045a4 | 2015-07-27 17:42:45 +0000 | [diff] [blame] | 279 |  | 
|  | 280 | // Print the live ins. | 
| Krzysztof Parzyszek | 72518ea | 2017-10-16 19:08:41 +0000 | [diff] [blame] | 281 | for (std::pair<unsigned, unsigned> LI : RegInfo.liveins()) { | 
| Alex Lorenz | 12045a4 | 2015-07-27 17:42:45 +0000 | [diff] [blame] | 282 | yaml::MachineFunctionLiveIn LiveIn; | 
| Francis Visoiu Mistrih | 9d419d3 | 2017-11-28 12:42:37 +0000 | [diff] [blame] | 283 | printRegMIR(LI.first, LiveIn.Register, TRI); | 
| Krzysztof Parzyszek | 72518ea | 2017-10-16 19:08:41 +0000 | [diff] [blame] | 284 | if (LI.second) | 
| Francis Visoiu Mistrih | 9d419d3 | 2017-11-28 12:42:37 +0000 | [diff] [blame] | 285 | printRegMIR(LI.second, LiveIn.VirtualRegister, TRI); | 
| Alex Lorenz | 12045a4 | 2015-07-27 17:42:45 +0000 | [diff] [blame] | 286 | MF.LiveIns.push_back(LiveIn); | 
|  | 287 | } | 
| Oren Ben Simhon | 0ef61ec | 2017-03-19 08:14:18 +0000 | [diff] [blame] | 288 |  | 
|  | 289 | // Prints the callee saved registers. | 
|  | 290 | if (RegInfo.isUpdatedCSRsInitialized()) { | 
|  | 291 | const MCPhysReg *CalleeSavedRegs = RegInfo.getCalleeSavedRegs(); | 
|  | 292 | std::vector<yaml::FlowStringValue> CalleeSavedRegisters; | 
|  | 293 | for (const MCPhysReg *I = CalleeSavedRegs; *I; ++I) { | 
| Alex Lorenz | c483808 | 2015-08-11 00:32:49 +0000 | [diff] [blame] | 294 | yaml::FlowStringValue Reg; | 
| Francis Visoiu Mistrih | 9d419d3 | 2017-11-28 12:42:37 +0000 | [diff] [blame] | 295 | printRegMIR(*I, Reg, TRI); | 
| Alex Lorenz | c483808 | 2015-08-11 00:32:49 +0000 | [diff] [blame] | 296 | CalleeSavedRegisters.push_back(Reg); | 
|  | 297 | } | 
| Oren Ben Simhon | 0ef61ec | 2017-03-19 08:14:18 +0000 | [diff] [blame] | 298 | MF.CalleeSavedRegisters = CalleeSavedRegisters; | 
| Alex Lorenz | c483808 | 2015-08-11 00:32:49 +0000 | [diff] [blame] | 299 | } | 
| Alex Lorenz | 54565cf | 2015-06-24 19:56:10 +0000 | [diff] [blame] | 300 | } | 
|  | 301 |  | 
| Alex Lorenz | a6f9a37 | 2015-07-29 21:09:09 +0000 | [diff] [blame] | 302 | void MIRPrinter::convert(ModuleSlotTracker &MST, | 
|  | 303 | yaml::MachineFrameInfo &YamlMFI, | 
| Alex Lorenz | 60541c1 | 2015-07-09 19:55:27 +0000 | [diff] [blame] | 304 | const MachineFrameInfo &MFI) { | 
|  | 305 | YamlMFI.IsFrameAddressTaken = MFI.isFrameAddressTaken(); | 
|  | 306 | YamlMFI.IsReturnAddressTaken = MFI.isReturnAddressTaken(); | 
|  | 307 | YamlMFI.HasStackMap = MFI.hasStackMap(); | 
|  | 308 | YamlMFI.HasPatchPoint = MFI.hasPatchPoint(); | 
|  | 309 | YamlMFI.StackSize = MFI.getStackSize(); | 
|  | 310 | YamlMFI.OffsetAdjustment = MFI.getOffsetAdjustment(); | 
|  | 311 | YamlMFI.MaxAlignment = MFI.getMaxAlignment(); | 
|  | 312 | YamlMFI.AdjustsStack = MFI.adjustsStack(); | 
|  | 313 | YamlMFI.HasCalls = MFI.hasCalls(); | 
| Matthias Braun | ab9438c | 2017-05-01 22:32:25 +0000 | [diff] [blame] | 314 | YamlMFI.MaxCallFrameSize = MFI.isMaxCallFrameSizeComputed() | 
|  | 315 | ? MFI.getMaxCallFrameSize() : ~0u; | 
| Alex Lorenz | 60541c1 | 2015-07-09 19:55:27 +0000 | [diff] [blame] | 316 | YamlMFI.HasOpaqueSPAdjustment = MFI.hasOpaqueSPAdjustment(); | 
|  | 317 | YamlMFI.HasVAStart = MFI.hasVAStart(); | 
|  | 318 | YamlMFI.HasMustTailInVarArgFunc = MFI.hasMustTailInVarArgFunc(); | 
| Alex Lorenz | a6f9a37 | 2015-07-29 21:09:09 +0000 | [diff] [blame] | 319 | if (MFI.getSavePoint()) { | 
|  | 320 | raw_string_ostream StrOS(YamlMFI.SavePoint.Value); | 
| Francis Visoiu Mistrih | 25528d6 | 2017-12-04 17:18:51 +0000 | [diff] [blame] | 321 | StrOS << printMBBReference(*MFI.getSavePoint()); | 
| Alex Lorenz | a6f9a37 | 2015-07-29 21:09:09 +0000 | [diff] [blame] | 322 | } | 
|  | 323 | if (MFI.getRestorePoint()) { | 
|  | 324 | raw_string_ostream StrOS(YamlMFI.RestorePoint.Value); | 
| Francis Visoiu Mistrih | 25528d6 | 2017-12-04 17:18:51 +0000 | [diff] [blame] | 325 | StrOS << printMBBReference(*MFI.getRestorePoint()); | 
| Alex Lorenz | a6f9a37 | 2015-07-29 21:09:09 +0000 | [diff] [blame] | 326 | } | 
| Alex Lorenz | 60541c1 | 2015-07-09 19:55:27 +0000 | [diff] [blame] | 327 | } | 
|  | 328 |  | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 329 | void MIRPrinter::convertStackObjects(yaml::MachineFunction &YMF, | 
|  | 330 | const MachineFunction &MF, | 
|  | 331 | ModuleSlotTracker &MST) { | 
|  | 332 | const MachineFrameInfo &MFI = MF.getFrameInfo(); | 
|  | 333 | const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); | 
| Alex Lorenz | de491f0 | 2015-07-13 18:07:26 +0000 | [diff] [blame] | 334 | // Process fixed stack objects. | 
| Alex Lorenz | f6bc866 | 2015-07-10 18:13:57 +0000 | [diff] [blame] | 335 | unsigned ID = 0; | 
| Alex Lorenz | de491f0 | 2015-07-13 18:07:26 +0000 | [diff] [blame] | 336 | for (int I = MFI.getObjectIndexBegin(); I < 0; ++I) { | 
|  | 337 | if (MFI.isDeadObjectIndex(I)) | 
|  | 338 | continue; | 
|  | 339 |  | 
|  | 340 | yaml::FixedMachineStackObject YamlObject; | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 341 | YamlObject.ID = ID; | 
| Alex Lorenz | de491f0 | 2015-07-13 18:07:26 +0000 | [diff] [blame] | 342 | YamlObject.Type = MFI.isSpillSlotObjectIndex(I) | 
|  | 343 | ? yaml::FixedMachineStackObject::SpillSlot | 
|  | 344 | : yaml::FixedMachineStackObject::DefaultType; | 
|  | 345 | YamlObject.Offset = MFI.getObjectOffset(I); | 
|  | 346 | YamlObject.Size = MFI.getObjectSize(I); | 
|  | 347 | YamlObject.Alignment = MFI.getObjectAlignment(I); | 
| Matt Arsenault | db78273 | 2017-07-20 21:03:45 +0000 | [diff] [blame] | 348 | YamlObject.StackID = MFI.getStackID(I); | 
| Alex Lorenz | de491f0 | 2015-07-13 18:07:26 +0000 | [diff] [blame] | 349 | YamlObject.IsImmutable = MFI.isImmutableObjectIndex(I); | 
|  | 350 | YamlObject.IsAliased = MFI.isAliasedObjectIndex(I); | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 351 | YMF.FixedStackObjects.push_back(YamlObject); | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 352 | StackObjectOperandMapping.insert( | 
|  | 353 | std::make_pair(I, FrameIndexOperand::createFixed(ID++))); | 
| Alex Lorenz | de491f0 | 2015-07-13 18:07:26 +0000 | [diff] [blame] | 354 | } | 
|  | 355 |  | 
|  | 356 | // Process ordinary stack objects. | 
|  | 357 | ID = 0; | 
| Alex Lorenz | f6bc866 | 2015-07-10 18:13:57 +0000 | [diff] [blame] | 358 | for (int I = 0, E = MFI.getObjectIndexEnd(); I < E; ++I) { | 
|  | 359 | if (MFI.isDeadObjectIndex(I)) | 
|  | 360 | continue; | 
|  | 361 |  | 
|  | 362 | yaml::MachineStackObject YamlObject; | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 363 | YamlObject.ID = ID; | 
| Alex Lorenz | 37643a0 | 2015-07-15 22:14:49 +0000 | [diff] [blame] | 364 | if (const auto *Alloca = MFI.getObjectAllocation(I)) | 
|  | 365 | YamlObject.Name.Value = | 
|  | 366 | Alloca->hasName() ? Alloca->getName() : "<unnamed alloca>"; | 
| Alex Lorenz | f6bc866 | 2015-07-10 18:13:57 +0000 | [diff] [blame] | 367 | YamlObject.Type = MFI.isSpillSlotObjectIndex(I) | 
|  | 368 | ? yaml::MachineStackObject::SpillSlot | 
| Alex Lorenz | 418f3ec | 2015-07-14 00:26:26 +0000 | [diff] [blame] | 369 | : MFI.isVariableSizedObjectIndex(I) | 
|  | 370 | ? yaml::MachineStackObject::VariableSized | 
|  | 371 | : yaml::MachineStackObject::DefaultType; | 
| Alex Lorenz | f6bc866 | 2015-07-10 18:13:57 +0000 | [diff] [blame] | 372 | YamlObject.Offset = MFI.getObjectOffset(I); | 
|  | 373 | YamlObject.Size = MFI.getObjectSize(I); | 
|  | 374 | YamlObject.Alignment = MFI.getObjectAlignment(I); | 
| Matt Arsenault | db78273 | 2017-07-20 21:03:45 +0000 | [diff] [blame] | 375 | YamlObject.StackID = MFI.getStackID(I); | 
| Alex Lorenz | f6bc866 | 2015-07-10 18:13:57 +0000 | [diff] [blame] | 376 |  | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 377 | YMF.StackObjects.push_back(YamlObject); | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 378 | StackObjectOperandMapping.insert(std::make_pair( | 
|  | 379 | I, FrameIndexOperand::create(YamlObject.Name.Value, ID++))); | 
| Alex Lorenz | f6bc866 | 2015-07-10 18:13:57 +0000 | [diff] [blame] | 380 | } | 
| Alex Lorenz | 1bb48de | 2015-07-24 22:22:50 +0000 | [diff] [blame] | 381 |  | 
|  | 382 | for (const auto &CSInfo : MFI.getCalleeSavedInfo()) { | 
|  | 383 | yaml::StringValue Reg; | 
| Francis Visoiu Mistrih | 9d419d3 | 2017-11-28 12:42:37 +0000 | [diff] [blame] | 384 | printRegMIR(CSInfo.getReg(), Reg, TRI); | 
| Alex Lorenz | 1bb48de | 2015-07-24 22:22:50 +0000 | [diff] [blame] | 385 | auto StackObjectInfo = StackObjectOperandMapping.find(CSInfo.getFrameIdx()); | 
|  | 386 | assert(StackObjectInfo != StackObjectOperandMapping.end() && | 
|  | 387 | "Invalid stack object index"); | 
|  | 388 | const FrameIndexOperand &StackObject = StackObjectInfo->second; | 
| Matthias Braun | 5c3e8a4 | 2017-09-28 18:52:14 +0000 | [diff] [blame] | 389 | if (StackObject.IsFixed) { | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 390 | YMF.FixedStackObjects[StackObject.ID].CalleeSavedRegister = Reg; | 
| Matthias Braun | 5c3e8a4 | 2017-09-28 18:52:14 +0000 | [diff] [blame] | 391 | YMF.FixedStackObjects[StackObject.ID].CalleeSavedRestored = | 
|  | 392 | CSInfo.isRestored(); | 
|  | 393 | } else { | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 394 | YMF.StackObjects[StackObject.ID].CalleeSavedRegister = Reg; | 
| Matthias Braun | 5c3e8a4 | 2017-09-28 18:52:14 +0000 | [diff] [blame] | 395 | YMF.StackObjects[StackObject.ID].CalleeSavedRestored = | 
|  | 396 | CSInfo.isRestored(); | 
|  | 397 | } | 
| Alex Lorenz | 1bb48de | 2015-07-24 22:22:50 +0000 | [diff] [blame] | 398 | } | 
| Alex Lorenz | a56ba6a | 2015-08-17 22:17:42 +0000 | [diff] [blame] | 399 | for (unsigned I = 0, E = MFI.getLocalFrameObjectCount(); I < E; ++I) { | 
|  | 400 | auto LocalObject = MFI.getLocalFrameObjectMap(I); | 
|  | 401 | auto StackObjectInfo = StackObjectOperandMapping.find(LocalObject.first); | 
|  | 402 | assert(StackObjectInfo != StackObjectOperandMapping.end() && | 
|  | 403 | "Invalid stack object index"); | 
|  | 404 | const FrameIndexOperand &StackObject = StackObjectInfo->second; | 
|  | 405 | assert(!StackObject.IsFixed && "Expected a locally mapped stack object"); | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 406 | YMF.StackObjects[StackObject.ID].LocalOffset = LocalObject.second; | 
| Alex Lorenz | a56ba6a | 2015-08-17 22:17:42 +0000 | [diff] [blame] | 407 | } | 
| Alex Lorenz | a314d81 | 2015-08-18 22:26:26 +0000 | [diff] [blame] | 408 |  | 
|  | 409 | // Print the stack object references in the frame information class after | 
|  | 410 | // converting the stack objects. | 
|  | 411 | if (MFI.hasStackProtectorIndex()) { | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 412 | raw_string_ostream StrOS(YMF.FrameInfo.StackProtector.Value); | 
| Alex Lorenz | a314d81 | 2015-08-18 22:26:26 +0000 | [diff] [blame] | 413 | MIPrinter(StrOS, MST, RegisterMaskIds, StackObjectOperandMapping) | 
|  | 414 | .printStackObjectReference(MFI.getStackProtectorIndex()); | 
|  | 415 | } | 
| Alex Lorenz | df9e3c6 | 2015-08-19 00:13:25 +0000 | [diff] [blame] | 416 |  | 
|  | 417 | // Print the debug variable information. | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 418 | for (const MachineFunction::VariableDbgInfo &DebugVar : | 
|  | 419 | MF.getVariableDbgInfo()) { | 
| Alex Lorenz | df9e3c6 | 2015-08-19 00:13:25 +0000 | [diff] [blame] | 420 | auto StackObjectInfo = StackObjectOperandMapping.find(DebugVar.Slot); | 
|  | 421 | assert(StackObjectInfo != StackObjectOperandMapping.end() && | 
|  | 422 | "Invalid stack object index"); | 
|  | 423 | const FrameIndexOperand &StackObject = StackObjectInfo->second; | 
|  | 424 | assert(!StackObject.IsFixed && "Expected a non-fixed stack object"); | 
| Matthias Braun | ef331ef | 2016-11-30 23:48:50 +0000 | [diff] [blame] | 425 | auto &Object = YMF.StackObjects[StackObject.ID]; | 
| Alex Lorenz | df9e3c6 | 2015-08-19 00:13:25 +0000 | [diff] [blame] | 426 | { | 
|  | 427 | raw_string_ostream StrOS(Object.DebugVar.Value); | 
|  | 428 | DebugVar.Var->printAsOperand(StrOS, MST); | 
|  | 429 | } | 
|  | 430 | { | 
|  | 431 | raw_string_ostream StrOS(Object.DebugExpr.Value); | 
|  | 432 | DebugVar.Expr->printAsOperand(StrOS, MST); | 
|  | 433 | } | 
|  | 434 | { | 
|  | 435 | raw_string_ostream StrOS(Object.DebugLoc.Value); | 
|  | 436 | DebugVar.Loc->printAsOperand(StrOS, MST); | 
|  | 437 | } | 
|  | 438 | } | 
| Alex Lorenz | f6bc866 | 2015-07-10 18:13:57 +0000 | [diff] [blame] | 439 | } | 
|  | 440 |  | 
| Alex Lorenz | ab98049 | 2015-07-20 20:51:18 +0000 | [diff] [blame] | 441 | void MIRPrinter::convert(yaml::MachineFunction &MF, | 
|  | 442 | const MachineConstantPool &ConstantPool) { | 
|  | 443 | unsigned ID = 0; | 
|  | 444 | for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) { | 
| Alex Lorenz | ab98049 | 2015-07-20 20:51:18 +0000 | [diff] [blame] | 445 | std::string Str; | 
|  | 446 | raw_string_ostream StrOS(Str); | 
| Diana Picus | d5a00b0 | 2017-08-02 11:09:30 +0000 | [diff] [blame] | 447 | if (Constant.isMachineConstantPoolEntry()) { | 
|  | 448 | Constant.Val.MachineCPVal->print(StrOS); | 
|  | 449 | } else { | 
|  | 450 | Constant.Val.ConstVal->printAsOperand(StrOS); | 
|  | 451 | } | 
|  | 452 |  | 
|  | 453 | yaml::MachineConstantPoolValue YamlConstant; | 
| Alex Lorenz | ab98049 | 2015-07-20 20:51:18 +0000 | [diff] [blame] | 454 | YamlConstant.ID = ID++; | 
|  | 455 | YamlConstant.Value = StrOS.str(); | 
|  | 456 | YamlConstant.Alignment = Constant.getAlignment(); | 
| Diana Picus | d5a00b0 | 2017-08-02 11:09:30 +0000 | [diff] [blame] | 457 | YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry(); | 
|  | 458 |  | 
| Alex Lorenz | ab98049 | 2015-07-20 20:51:18 +0000 | [diff] [blame] | 459 | MF.Constants.push_back(YamlConstant); | 
|  | 460 | } | 
|  | 461 | } | 
|  | 462 |  | 
| Alex Lorenz | 900b5cb | 2015-07-07 23:27:53 +0000 | [diff] [blame] | 463 | void MIRPrinter::convert(ModuleSlotTracker &MST, | 
| Alex Lorenz | 6799e9b | 2015-07-15 23:31:07 +0000 | [diff] [blame] | 464 | yaml::MachineJumpTable &YamlJTI, | 
|  | 465 | const MachineJumpTableInfo &JTI) { | 
|  | 466 | YamlJTI.Kind = JTI.getEntryKind(); | 
|  | 467 | unsigned ID = 0; | 
|  | 468 | for (const auto &Table : JTI.getJumpTables()) { | 
|  | 469 | std::string Str; | 
|  | 470 | yaml::MachineJumpTable::Entry Entry; | 
|  | 471 | Entry.ID = ID++; | 
|  | 472 | for (const auto *MBB : Table.MBBs) { | 
|  | 473 | raw_string_ostream StrOS(Str); | 
| Francis Visoiu Mistrih | 25528d6 | 2017-12-04 17:18:51 +0000 | [diff] [blame] | 474 | StrOS << printMBBReference(*MBB); | 
| Alex Lorenz | 6799e9b | 2015-07-15 23:31:07 +0000 | [diff] [blame] | 475 | Entry.Blocks.push_back(StrOS.str()); | 
|  | 476 | Str.clear(); | 
|  | 477 | } | 
|  | 478 | YamlJTI.Entries.push_back(Entry); | 
|  | 479 | } | 
|  | 480 | } | 
|  | 481 |  | 
| Alex Lorenz | 8f6f428 | 2015-06-29 16:57:06 +0000 | [diff] [blame] | 482 | void MIRPrinter::initRegisterMaskIds(const MachineFunction &MF) { | 
|  | 483 | const auto *TRI = MF.getSubtarget().getRegisterInfo(); | 
|  | 484 | unsigned I = 0; | 
|  | 485 | for (const uint32_t *Mask : TRI->getRegMasks()) | 
|  | 486 | RegisterMaskIds.insert(std::make_pair(Mask, I++)); | 
|  | 487 | } | 
|  | 488 |  | 
| Matthias Braun | 8940114 | 2017-05-05 21:09:30 +0000 | [diff] [blame] | 489 | void llvm::guessSuccessors(const MachineBasicBlock &MBB, | 
|  | 490 | SmallVectorImpl<MachineBasicBlock*> &Result, | 
|  | 491 | bool &IsFallthrough) { | 
|  | 492 | SmallPtrSet<MachineBasicBlock*,8> Seen; | 
|  | 493 |  | 
|  | 494 | for (const MachineInstr &MI : MBB) { | 
|  | 495 | if (MI.isPHI()) | 
|  | 496 | continue; | 
|  | 497 | for (const MachineOperand &MO : MI.operands()) { | 
|  | 498 | if (!MO.isMBB()) | 
|  | 499 | continue; | 
|  | 500 | MachineBasicBlock *Succ = MO.getMBB(); | 
|  | 501 | auto RP = Seen.insert(Succ); | 
|  | 502 | if (RP.second) | 
|  | 503 | Result.push_back(Succ); | 
|  | 504 | } | 
|  | 505 | } | 
|  | 506 | MachineBasicBlock::const_iterator I = MBB.getLastNonDebugInstr(); | 
|  | 507 | IsFallthrough = I == MBB.end() || !I->isBarrier(); | 
|  | 508 | } | 
|  | 509 |  | 
|  | 510 | bool | 
|  | 511 | MIPrinter::canPredictBranchProbabilities(const MachineBasicBlock &MBB) const { | 
|  | 512 | if (MBB.succ_size() <= 1) | 
|  | 513 | return true; | 
|  | 514 | if (!MBB.hasSuccessorProbabilities()) | 
|  | 515 | return true; | 
|  | 516 |  | 
|  | 517 | SmallVector<BranchProbability,8> Normalized(MBB.Probs.begin(), | 
|  | 518 | MBB.Probs.end()); | 
|  | 519 | BranchProbability::normalizeProbabilities(Normalized.begin(), | 
|  | 520 | Normalized.end()); | 
|  | 521 | SmallVector<BranchProbability,8> Equal(Normalized.size()); | 
|  | 522 | BranchProbability::normalizeProbabilities(Equal.begin(), Equal.end()); | 
|  | 523 |  | 
|  | 524 | return std::equal(Normalized.begin(), Normalized.end(), Equal.begin()); | 
|  | 525 | } | 
|  | 526 |  | 
|  | 527 | bool MIPrinter::canPredictSuccessors(const MachineBasicBlock &MBB) const { | 
|  | 528 | SmallVector<MachineBasicBlock*,8> GuessedSuccs; | 
|  | 529 | bool GuessedFallthrough; | 
|  | 530 | guessSuccessors(MBB, GuessedSuccs, GuessedFallthrough); | 
|  | 531 | if (GuessedFallthrough) { | 
|  | 532 | const MachineFunction &MF = *MBB.getParent(); | 
|  | 533 | MachineFunction::const_iterator NextI = std::next(MBB.getIterator()); | 
|  | 534 | if (NextI != MF.end()) { | 
|  | 535 | MachineBasicBlock *Next = const_cast<MachineBasicBlock*>(&*NextI); | 
|  | 536 | if (!is_contained(GuessedSuccs, Next)) | 
|  | 537 | GuessedSuccs.push_back(Next); | 
|  | 538 | } | 
|  | 539 | } | 
|  | 540 | if (GuessedSuccs.size() != MBB.succ_size()) | 
|  | 541 | return false; | 
|  | 542 | return std::equal(MBB.succ_begin(), MBB.succ_end(), GuessedSuccs.begin()); | 
|  | 543 | } | 
|  | 544 |  | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 545 | void MIPrinter::print(const MachineBasicBlock &MBB) { | 
|  | 546 | assert(MBB.getNumber() >= 0 && "Invalid MBB number"); | 
|  | 547 | OS << "bb." << MBB.getNumber(); | 
|  | 548 | bool HasAttributes = false; | 
|  | 549 | if (const auto *BB = MBB.getBasicBlock()) { | 
|  | 550 | if (BB->hasName()) { | 
|  | 551 | OS << "." << BB->getName(); | 
|  | 552 | } else { | 
|  | 553 | HasAttributes = true; | 
|  | 554 | OS << " ("; | 
|  | 555 | int Slot = MST.getLocalSlot(BB); | 
|  | 556 | if (Slot == -1) | 
|  | 557 | OS << "<ir-block badref>"; | 
|  | 558 | else | 
|  | 559 | OS << (Twine("%ir-block.") + Twine(Slot)).str(); | 
|  | 560 | } | 
|  | 561 | } | 
|  | 562 | if (MBB.hasAddressTaken()) { | 
|  | 563 | OS << (HasAttributes ? ", " : " ("); | 
|  | 564 | OS << "address-taken"; | 
|  | 565 | HasAttributes = true; | 
|  | 566 | } | 
| Reid Kleckner | 0e28823 | 2015-08-27 23:27:47 +0000 | [diff] [blame] | 567 | if (MBB.isEHPad()) { | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 568 | OS << (HasAttributes ? ", " : " ("); | 
|  | 569 | OS << "landing-pad"; | 
|  | 570 | HasAttributes = true; | 
|  | 571 | } | 
|  | 572 | if (MBB.getAlignment()) { | 
|  | 573 | OS << (HasAttributes ? ", " : " ("); | 
|  | 574 | OS << "align " << MBB.getAlignment(); | 
|  | 575 | HasAttributes = true; | 
|  | 576 | } | 
|  | 577 | if (HasAttributes) | 
|  | 578 | OS << ")"; | 
|  | 579 | OS << ":\n"; | 
|  | 580 |  | 
|  | 581 | bool HasLineAttributes = false; | 
|  | 582 | // Print the successors | 
| Matthias Braun | 8940114 | 2017-05-05 21:09:30 +0000 | [diff] [blame] | 583 | bool canPredictProbs = canPredictBranchProbabilities(MBB); | 
| Quentin Colombet | d652aeb | 2017-09-19 23:34:12 +0000 | [diff] [blame] | 584 | // Even if the list of successors is empty, if we cannot guess it, | 
|  | 585 | // we need to print it to tell the parser that the list is empty. | 
|  | 586 | // This is needed, because MI model unreachable as empty blocks | 
|  | 587 | // with an empty successor list. If the parser would see that | 
|  | 588 | // without the successor list, it would guess the code would | 
|  | 589 | // fallthrough. | 
|  | 590 | if ((!MBB.succ_empty() && !SimplifyMIR) || !canPredictProbs || | 
|  | 591 | !canPredictSuccessors(MBB)) { | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 592 | OS.indent(2) << "successors: "; | 
|  | 593 | for (auto I = MBB.succ_begin(), E = MBB.succ_end(); I != E; ++I) { | 
|  | 594 | if (I != MBB.succ_begin()) | 
|  | 595 | OS << ", "; | 
| Francis Visoiu Mistrih | 25528d6 | 2017-12-04 17:18:51 +0000 | [diff] [blame] | 596 | OS << printMBBReference(**I); | 
| Matthias Braun | 8940114 | 2017-05-05 21:09:30 +0000 | [diff] [blame] | 597 | if (!SimplifyMIR || !canPredictProbs) | 
| Geoff Berry | b51774a | 2016-11-18 19:37:24 +0000 | [diff] [blame] | 598 | OS << '(' | 
|  | 599 | << format("0x%08" PRIx32, MBB.getSuccProbability(I).getNumerator()) | 
|  | 600 | << ')'; | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 601 | } | 
|  | 602 | OS << "\n"; | 
|  | 603 | HasLineAttributes = true; | 
|  | 604 | } | 
|  | 605 |  | 
|  | 606 | // Print the live in registers. | 
| Matthias Braun | 1172332 | 2017-01-05 20:01:19 +0000 | [diff] [blame] | 607 | const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo(); | 
|  | 608 | if (MRI.tracksLiveness() && !MBB.livein_empty()) { | 
|  | 609 | const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo(); | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 610 | OS.indent(2) << "liveins: "; | 
| Matthias Braun | b2b7ef1 | 2015-08-24 22:59:52 +0000 | [diff] [blame] | 611 | bool First = true; | 
| Matthias Braun | d9da162 | 2015-09-09 18:08:03 +0000 | [diff] [blame] | 612 | for (const auto &LI : MBB.liveins()) { | 
| Matthias Braun | b2b7ef1 | 2015-08-24 22:59:52 +0000 | [diff] [blame] | 613 | if (!First) | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 614 | OS << ", "; | 
| Matthias Braun | b2b7ef1 | 2015-08-24 22:59:52 +0000 | [diff] [blame] | 615 | First = false; | 
| Francis Visoiu Mistrih | c71cced | 2017-11-30 16:12:24 +0000 | [diff] [blame] | 616 | OS << printReg(LI.PhysReg, &TRI); | 
| Krzysztof Parzyszek | 91b5cf8 | 2016-12-15 14:36:06 +0000 | [diff] [blame] | 617 | if (!LI.LaneMask.all()) | 
| Krzysztof Parzyszek | d62669d | 2016-10-12 21:06:45 +0000 | [diff] [blame] | 618 | OS << ":0x" << PrintLaneMask(LI.LaneMask); | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 619 | } | 
|  | 620 | OS << "\n"; | 
|  | 621 | HasLineAttributes = true; | 
|  | 622 | } | 
|  | 623 |  | 
|  | 624 | if (HasLineAttributes) | 
|  | 625 | OS << "\n"; | 
| Alex Lorenz | f9a2b12 | 2015-08-14 18:57:24 +0000 | [diff] [blame] | 626 | bool IsInBundle = false; | 
|  | 627 | for (auto I = MBB.instr_begin(), E = MBB.instr_end(); I != E; ++I) { | 
|  | 628 | const MachineInstr &MI = *I; | 
|  | 629 | if (IsInBundle && !MI.isInsideBundle()) { | 
|  | 630 | OS.indent(2) << "}\n"; | 
|  | 631 | IsInBundle = false; | 
|  | 632 | } | 
|  | 633 | OS.indent(IsInBundle ? 4 : 2); | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 634 | print(MI); | 
| Alex Lorenz | f9a2b12 | 2015-08-14 18:57:24 +0000 | [diff] [blame] | 635 | if (!IsInBundle && MI.getFlag(MachineInstr::BundledSucc)) { | 
|  | 636 | OS << " {"; | 
|  | 637 | IsInBundle = true; | 
|  | 638 | } | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 639 | OS << "\n"; | 
|  | 640 | } | 
| Alex Lorenz | f9a2b12 | 2015-08-14 18:57:24 +0000 | [diff] [blame] | 641 | if (IsInBundle) | 
|  | 642 | OS.indent(2) << "}\n"; | 
| Alex Lorenz | 5022f6b | 2015-08-13 23:10:16 +0000 | [diff] [blame] | 643 | } | 
|  | 644 |  | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 645 | void MIPrinter::print(const MachineInstr &MI) { | 
| Justin Bogner | fdf9bf4 | 2017-10-10 23:50:49 +0000 | [diff] [blame] | 646 | const auto *MF = MI.getMF(); | 
| Quentin Colombet | 4e14a49 | 2016-03-07 21:57:52 +0000 | [diff] [blame] | 647 | const auto &MRI = MF->getRegInfo(); | 
|  | 648 | const auto &SubTarget = MF->getSubtarget(); | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 649 | const auto *TRI = SubTarget.getRegisterInfo(); | 
|  | 650 | assert(TRI && "Expected target register info"); | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 651 | const auto *TII = SubTarget.getInstrInfo(); | 
|  | 652 | assert(TII && "Expected target instruction info"); | 
| Alex Lorenz | f4baeb5 | 2015-07-21 22:28:27 +0000 | [diff] [blame] | 653 | if (MI.isCFIInstruction()) | 
|  | 654 | assert(MI.getNumOperands() == 1 && "Expected 1 operand in CFI instruction"); | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 655 |  | 
| Tim Northover | d28d3cc | 2016-09-12 11:20:10 +0000 | [diff] [blame] | 656 | SmallBitVector PrintedTypes(8); | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 657 | bool ShouldPrintRegisterTies = MI.hasComplexRegisterTies(); | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 658 | unsigned I = 0, E = MI.getNumOperands(); | 
|  | 659 | for (; I < E && MI.getOperand(I).isReg() && MI.getOperand(I).isDef() && | 
|  | 660 | !MI.getOperand(I).isImplicit(); | 
|  | 661 | ++I) { | 
|  | 662 | if (I) | 
|  | 663 | OS << ", "; | 
| Bjorn Pettersson | a42ed3e | 2017-11-06 21:46:06 +0000 | [diff] [blame] | 664 | print(MI, I, TRI, ShouldPrintRegisterTies, | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 665 | MI.getTypeToPrint(I, PrintedTypes, MRI), | 
|  | 666 | /*PrintDef=*/false); | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 667 | } | 
|  | 668 |  | 
|  | 669 | if (I) | 
|  | 670 | OS << " = "; | 
| Alex Lorenz | e5a4466 | 2015-07-17 00:24:15 +0000 | [diff] [blame] | 671 | if (MI.getFlag(MachineInstr::FrameSetup)) | 
|  | 672 | OS << "frame-setup "; | 
| Francis Visoiu Mistrih | dbf2c48 | 2018-01-09 11:33:22 +0000 | [diff] [blame] | 673 | else if (MI.getFlag(MachineInstr::FrameDestroy)) | 
|  | 674 | OS << "frame-destroy "; | 
|  | 675 |  | 
| Alex Lorenz | 8e0a1b4 | 2015-06-22 17:02:30 +0000 | [diff] [blame] | 676 | OS << TII->getName(MI.getOpcode()); | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 677 | if (I < E) | 
|  | 678 | OS << ' '; | 
|  | 679 |  | 
|  | 680 | bool NeedComma = false; | 
|  | 681 | for (; I < E; ++I) { | 
|  | 682 | if (NeedComma) | 
|  | 683 | OS << ", "; | 
| Bjorn Pettersson | a42ed3e | 2017-11-06 21:46:06 +0000 | [diff] [blame] | 684 | print(MI, I, TRI, ShouldPrintRegisterTies, | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 685 | MI.getTypeToPrint(I, PrintedTypes, MRI)); | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 686 | NeedComma = true; | 
|  | 687 | } | 
| Alex Lorenz | 46d760d | 2015-07-22 21:15:11 +0000 | [diff] [blame] | 688 |  | 
| Francis Visoiu Mistrih | 548add9 | 2018-01-19 11:44:42 +0000 | [diff] [blame] | 689 | if (const DebugLoc &DL = MI.getDebugLoc()) { | 
| Alex Lorenz | 46d760d | 2015-07-22 21:15:11 +0000 | [diff] [blame] | 690 | if (NeedComma) | 
|  | 691 | OS << ','; | 
|  | 692 | OS << " debug-location "; | 
| Francis Visoiu Mistrih | 548add9 | 2018-01-19 11:44:42 +0000 | [diff] [blame] | 693 | DL->printAsOperand(OS, MST); | 
| Alex Lorenz | 46d760d | 2015-07-22 21:15:11 +0000 | [diff] [blame] | 694 | } | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 695 |  | 
|  | 696 | if (!MI.memoperands_empty()) { | 
|  | 697 | OS << " :: "; | 
| Matthias Braun | f1caa28 | 2017-12-15 22:22:58 +0000 | [diff] [blame] | 698 | const LLVMContext &Context = MF->getFunction().getContext(); | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 699 | bool NeedComma = false; | 
|  | 700 | for (const auto *Op : MI.memoperands()) { | 
|  | 701 | if (NeedComma) | 
|  | 702 | OS << ", "; | 
| Geoff Berry | 6748abe | 2017-07-13 02:28:54 +0000 | [diff] [blame] | 703 | print(Context, *TII, *Op); | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 704 | NeedComma = true; | 
|  | 705 | } | 
|  | 706 | } | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 707 | } | 
|  | 708 |  | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 709 | void MIPrinter::printIRValueReference(const Value &V) { | 
| Alex Lorenz | 36efd38 | 2015-08-20 00:20:03 +0000 | [diff] [blame] | 710 | if (isa<GlobalValue>(V)) { | 
|  | 711 | V.printAsOperand(OS, /*PrintType=*/false, MST); | 
|  | 712 | return; | 
|  | 713 | } | 
| Alex Lorenz | c1136ef3 | 2015-08-21 21:54:12 +0000 | [diff] [blame] | 714 | if (isa<Constant>(V)) { | 
|  | 715 | // Machine memory operands can load/store to/from constant value pointers. | 
|  | 716 | OS << '`'; | 
|  | 717 | V.printAsOperand(OS, /*PrintType=*/true, MST); | 
|  | 718 | OS << '`'; | 
|  | 719 | return; | 
|  | 720 | } | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 721 | OS << "%ir."; | 
|  | 722 | if (V.hasName()) { | 
|  | 723 | printLLVMNameWithoutPrefix(OS, V.getName()); | 
|  | 724 | return; | 
|  | 725 | } | 
| Francis Visoiu Mistrih | f81727d | 2017-12-19 21:47:14 +0000 | [diff] [blame] | 726 | MachineOperand::printIRSlotNumber(OS, MST.getLocalSlot(&V)); | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 727 | } | 
|  | 728 |  | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 729 | void MIPrinter::printStackObjectReference(int FrameIndex) { | 
|  | 730 | auto ObjectInfo = StackObjectOperandMapping.find(FrameIndex); | 
|  | 731 | assert(ObjectInfo != StackObjectOperandMapping.end() && | 
|  | 732 | "Invalid frame index"); | 
|  | 733 | const FrameIndexOperand &Operand = ObjectInfo->second; | 
| Francis Visoiu Mistrih | 0b5bdce | 2017-12-15 16:33:45 +0000 | [diff] [blame] | 734 | MachineOperand::printStackObjectReference(OS, Operand.ID, Operand.IsFixed, | 
|  | 735 | Operand.Name); | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 736 | } | 
|  | 737 |  | 
| Bjorn Pettersson | a42ed3e | 2017-11-06 21:46:06 +0000 | [diff] [blame] | 738 | void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx, | 
|  | 739 | const TargetRegisterInfo *TRI, | 
|  | 740 | bool ShouldPrintRegisterTies, LLT TypeToPrint, | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 741 | bool PrintDef) { | 
| Bjorn Pettersson | a42ed3e | 2017-11-06 21:46:06 +0000 | [diff] [blame] | 742 | const MachineOperand &Op = MI.getOperand(OpIdx); | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 743 | switch (Op.getType()) { | 
| Francis Visoiu Mistrih | 440f69c | 2017-12-08 22:53:21 +0000 | [diff] [blame] | 744 | case MachineOperand::MO_Immediate: | 
|  | 745 | if (MI.isOperandSubregIdx(OpIdx)) { | 
| Francis Visoiu Mistrih | 5df3bbf | 2017-12-14 10:03:09 +0000 | [diff] [blame] | 746 | MachineOperand::printTargetFlags(OS, Op); | 
| Francis Visoiu Mistrih | ecd0b83 | 2018-01-16 10:53:11 +0000 | [diff] [blame] | 747 | MachineOperand::printSubRegIdx(OS, Op.getImm(), TRI); | 
| Francis Visoiu Mistrih | 440f69c | 2017-12-08 22:53:21 +0000 | [diff] [blame] | 748 | break; | 
|  | 749 | } | 
|  | 750 | LLVM_FALLTHROUGH; | 
| Francis Visoiu Mistrih | 6c4ca71 | 2017-12-08 11:40:06 +0000 | [diff] [blame] | 751 | case MachineOperand::MO_Register: | 
| Francis Visoiu Mistrih | f4bd295 | 2017-12-08 11:48:02 +0000 | [diff] [blame] | 752 | case MachineOperand::MO_CImmediate: | 
| Francis Visoiu Mistrih | 3b265c8 | 2017-12-19 21:47:00 +0000 | [diff] [blame] | 753 | case MachineOperand::MO_FPImmediate: | 
| Francis Visoiu Mistrih | 26ae8a6 | 2017-12-13 10:30:45 +0000 | [diff] [blame] | 754 | case MachineOperand::MO_MachineBasicBlock: | 
| Francis Visoiu Mistrih | b3a0d51 | 2017-12-13 10:30:51 +0000 | [diff] [blame] | 755 | case MachineOperand::MO_ConstantPoolIndex: | 
| Francis Visoiu Mistrih | b41dbbe | 2017-12-13 10:30:59 +0000 | [diff] [blame] | 756 | case MachineOperand::MO_TargetIndex: | 
| Francis Visoiu Mistrih | e76c5fc | 2017-12-14 10:02:58 +0000 | [diff] [blame] | 757 | case MachineOperand::MO_JumpTableIndex: | 
| Francis Visoiu Mistrih | 5df3bbf | 2017-12-14 10:03:09 +0000 | [diff] [blame] | 758 | case MachineOperand::MO_ExternalSymbol: | 
| Francis Visoiu Mistrih | bdaf8bf | 2017-12-14 10:03:14 +0000 | [diff] [blame] | 759 | case MachineOperand::MO_GlobalAddress: | 
| Francis Visoiu Mistrih | 2db5938 | 2017-12-14 10:03:18 +0000 | [diff] [blame] | 760 | case MachineOperand::MO_RegisterLiveOut: | 
| Francis Visoiu Mistrih | 3c99371 | 2017-12-14 10:03:23 +0000 | [diff] [blame] | 761 | case MachineOperand::MO_Metadata: | 
| Francis Visoiu Mistrih | 874ae6f | 2017-12-19 16:51:52 +0000 | [diff] [blame] | 762 | case MachineOperand::MO_MCSymbol: | 
| Francis Visoiu Mistrih | bbd610a | 2017-12-19 21:47:05 +0000 | [diff] [blame] | 763 | case MachineOperand::MO_CFIIndex: | 
| Francis Visoiu Mistrih | cb2683d | 2017-12-19 21:47:10 +0000 | [diff] [blame] | 764 | case MachineOperand::MO_IntrinsicID: | 
| Francis Visoiu Mistrih | f81727d | 2017-12-19 21:47:14 +0000 | [diff] [blame] | 765 | case MachineOperand::MO_Predicate: | 
|  | 766 | case MachineOperand::MO_BlockAddress: { | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 767 | unsigned TiedOperandIdx = 0; | 
| Francis Visoiu Mistrih | 440f69c | 2017-12-08 22:53:21 +0000 | [diff] [blame] | 768 | if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef()) | 
| Francis Visoiu Mistrih | a8a83d1 | 2017-12-07 10:40:31 +0000 | [diff] [blame] | 769 | TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx); | 
|  | 770 | const TargetIntrinsicInfo *TII = MI.getMF()->getTarget().getIntrinsicInfo(); | 
| Francis Visoiu Mistrih | eb3f76f | 2018-01-18 18:05:15 +0000 | [diff] [blame] | 771 | Op.print(OS, MST, TypeToPrint, PrintDef, /*IsStandalone=*/false, | 
| Francis Visoiu Mistrih | 378b5f3 | 2018-01-18 17:59:06 +0000 | [diff] [blame] | 772 | ShouldPrintRegisterTies, TiedOperandIdx, TRI, TII); | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 773 | break; | 
| Justin Bogner | 6c45283 | 2017-10-24 18:04:54 +0000 | [diff] [blame] | 774 | } | 
| Alex Lorenz | 7feaf7c | 2015-07-16 23:37:45 +0000 | [diff] [blame] | 775 | case MachineOperand::MO_FrameIndex: | 
|  | 776 | printStackObjectReference(Op.getIndex()); | 
|  | 777 | break; | 
| Alex Lorenz | 8f6f428 | 2015-06-29 16:57:06 +0000 | [diff] [blame] | 778 | case MachineOperand::MO_RegisterMask: { | 
|  | 779 | auto RegMaskInfo = RegisterMaskIds.find(Op.getRegMask()); | 
|  | 780 | if (RegMaskInfo != RegisterMaskIds.end()) | 
|  | 781 | OS << StringRef(TRI->getRegMaskNames()[RegMaskInfo->second]).lower(); | 
|  | 782 | else | 
| Oren Ben Simhon | 0ef61ec | 2017-03-19 08:14:18 +0000 | [diff] [blame] | 783 | printCustomRegMask(Op.getRegMask(), OS, TRI); | 
| Alex Lorenz | 8f6f428 | 2015-06-29 16:57:06 +0000 | [diff] [blame] | 784 | break; | 
|  | 785 | } | 
| Alex Lorenz | f3db51de | 2015-06-23 16:35:26 +0000 | [diff] [blame] | 786 | } | 
| Alex Lorenz | 4f093bf | 2015-06-19 17:43:07 +0000 | [diff] [blame] | 787 | } | 
|  | 788 |  | 
| Geoff Berry | 6748abe | 2017-07-13 02:28:54 +0000 | [diff] [blame] | 789 | static const char *getTargetMMOFlagName(const TargetInstrInfo &TII, | 
|  | 790 | unsigned TMMOFlag) { | 
|  | 791 | auto Flags = TII.getSerializableMachineMemOperandTargetFlags(); | 
|  | 792 | for (const auto &I : Flags) { | 
|  | 793 | if (I.first == TMMOFlag) { | 
|  | 794 | return I.second; | 
|  | 795 | } | 
|  | 796 | } | 
|  | 797 | return nullptr; | 
|  | 798 | } | 
|  | 799 |  | 
|  | 800 | void MIPrinter::print(const LLVMContext &Context, const TargetInstrInfo &TII, | 
|  | 801 | const MachineMemOperand &Op) { | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 802 | OS << '('; | 
| Alex Lorenz | a518b79 | 2015-08-04 00:24:45 +0000 | [diff] [blame] | 803 | if (Op.isVolatile()) | 
|  | 804 | OS << "volatile "; | 
| Alex Lorenz | 10fd038 | 2015-08-06 16:49:30 +0000 | [diff] [blame] | 805 | if (Op.isNonTemporal()) | 
|  | 806 | OS << "non-temporal "; | 
| Justin Lebar | adbf09e | 2016-09-11 01:38:58 +0000 | [diff] [blame] | 807 | if (Op.isDereferenceable()) | 
|  | 808 | OS << "dereferenceable "; | 
| Alex Lorenz | dc8de2a | 2015-08-06 16:55:53 +0000 | [diff] [blame] | 809 | if (Op.isInvariant()) | 
|  | 810 | OS << "invariant "; | 
| Geoff Berry | 6748abe | 2017-07-13 02:28:54 +0000 | [diff] [blame] | 811 | if (Op.getFlags() & MachineMemOperand::MOTargetFlag1) | 
|  | 812 | OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag1) | 
|  | 813 | << "\" "; | 
|  | 814 | if (Op.getFlags() & MachineMemOperand::MOTargetFlag2) | 
|  | 815 | OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag2) | 
|  | 816 | << "\" "; | 
|  | 817 | if (Op.getFlags() & MachineMemOperand::MOTargetFlag3) | 
|  | 818 | OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag3) | 
|  | 819 | << "\" "; | 
| Daniel Sanders | 17d277b | 2017-11-28 18:57:02 +0000 | [diff] [blame] | 820 |  | 
|  | 821 | assert((Op.isLoad() || Op.isStore()) && "machine memory operand must be a load or store (or both)"); | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 822 | if (Op.isLoad()) | 
|  | 823 | OS << "load "; | 
| Daniel Sanders | 17d277b | 2017-11-28 18:57:02 +0000 | [diff] [blame] | 824 | if (Op.isStore()) | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 825 | OS << "store "; | 
| Tim Northover | b73e309 | 2017-02-13 22:14:08 +0000 | [diff] [blame] | 826 |  | 
| Konstantin Zhuravlyov | bb80d3e | 2017-07-11 22:23:00 +0000 | [diff] [blame] | 827 | printSyncScope(Context, Op.getSyncScopeID()); | 
| Tim Northover | b73e309 | 2017-02-13 22:14:08 +0000 | [diff] [blame] | 828 |  | 
|  | 829 | if (Op.getOrdering() != AtomicOrdering::NotAtomic) | 
|  | 830 | OS << toIRString(Op.getOrdering()) << ' '; | 
|  | 831 | if (Op.getFailureOrdering() != AtomicOrdering::NotAtomic) | 
|  | 832 | OS << toIRString(Op.getFailureOrdering()) << ' '; | 
|  | 833 |  | 
| Matthias Braun | c25c9cc | 2016-06-04 00:06:31 +0000 | [diff] [blame] | 834 | OS << Op.getSize(); | 
| Alex Lorenz | 91097a3 | 2015-08-12 20:33:26 +0000 | [diff] [blame] | 835 | if (const Value *Val = Op.getValue()) { | 
| Daniel Sanders | 17d277b | 2017-11-28 18:57:02 +0000 | [diff] [blame] | 836 | OS << ((Op.isLoad() && Op.isStore()) ? " on " | 
|  | 837 | : Op.isLoad() ? " from " : " into "); | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 838 | printIRValueReference(*Val); | 
| Matthias Braun | c25c9cc | 2016-06-04 00:06:31 +0000 | [diff] [blame] | 839 | } else if (const PseudoSourceValue *PVal = Op.getPseudoValue()) { | 
| Daniel Sanders | 17d277b | 2017-11-28 18:57:02 +0000 | [diff] [blame] | 840 | OS << ((Op.isLoad() && Op.isStore()) ? " on " | 
|  | 841 | : Op.isLoad() ? " from " : " into "); | 
| Alex Lorenz | 91097a3 | 2015-08-12 20:33:26 +0000 | [diff] [blame] | 842 | assert(PVal && "Expected a pseudo source value"); | 
|  | 843 | switch (PVal->kind()) { | 
| Alex Lorenz | 46e9558 | 2015-08-12 20:44:16 +0000 | [diff] [blame] | 844 | case PseudoSourceValue::Stack: | 
|  | 845 | OS << "stack"; | 
|  | 846 | break; | 
| Alex Lorenz | d858f87 | 2015-08-12 21:00:22 +0000 | [diff] [blame] | 847 | case PseudoSourceValue::GOT: | 
|  | 848 | OS << "got"; | 
|  | 849 | break; | 
| Alex Lorenz | 4be56e9 | 2015-08-12 21:11:08 +0000 | [diff] [blame] | 850 | case PseudoSourceValue::JumpTable: | 
|  | 851 | OS << "jump-table"; | 
|  | 852 | break; | 
| Alex Lorenz | 91097a3 | 2015-08-12 20:33:26 +0000 | [diff] [blame] | 853 | case PseudoSourceValue::ConstantPool: | 
|  | 854 | OS << "constant-pool"; | 
|  | 855 | break; | 
| Alex Lorenz | 0cc671b | 2015-08-12 21:23:17 +0000 | [diff] [blame] | 856 | case PseudoSourceValue::FixedStack: | 
|  | 857 | printStackObjectReference( | 
|  | 858 | cast<FixedStackPseudoSourceValue>(PVal)->getFrameIndex()); | 
|  | 859 | break; | 
| Alex Lorenz | 50b826f | 2015-08-14 21:08:30 +0000 | [diff] [blame] | 860 | case PseudoSourceValue::GlobalValueCallEntry: | 
| Alex Lorenz | 0d00964 | 2015-08-20 00:12:57 +0000 | [diff] [blame] | 861 | OS << "call-entry "; | 
| Alex Lorenz | 50b826f | 2015-08-14 21:08:30 +0000 | [diff] [blame] | 862 | cast<GlobalValuePseudoSourceValue>(PVal)->getValue()->printAsOperand( | 
|  | 863 | OS, /*PrintType=*/false, MST); | 
|  | 864 | break; | 
| Alex Lorenz | c3ba750 | 2015-08-14 21:14:50 +0000 | [diff] [blame] | 865 | case PseudoSourceValue::ExternalSymbolCallEntry: | 
| Puyan Lotfi | fe6c9cb | 2018-01-10 00:56:48 +0000 | [diff] [blame] | 866 | OS << "call-entry &"; | 
| Alex Lorenz | c3ba750 | 2015-08-14 21:14:50 +0000 | [diff] [blame] | 867 | printLLVMNameWithoutPrefix( | 
|  | 868 | OS, cast<ExternalSymbolPseudoSourceValue>(PVal)->getSymbol()); | 
| Alex Lorenz | 91097a3 | 2015-08-12 20:33:26 +0000 | [diff] [blame] | 869 | break; | 
| Tom Stellard | 7761abb | 2016-12-17 04:41:53 +0000 | [diff] [blame] | 870 | case PseudoSourceValue::TargetCustom: | 
|  | 871 | llvm_unreachable("TargetCustom pseudo source values are not supported"); | 
|  | 872 | break; | 
| Alex Lorenz | 91097a3 | 2015-08-12 20:33:26 +0000 | [diff] [blame] | 873 | } | 
|  | 874 | } | 
| Francis Visoiu Mistrih | 8122660 | 2017-12-19 21:46:55 +0000 | [diff] [blame] | 875 | MachineOperand::printOperandOffset(OS, Op.getOffset()); | 
| Alex Lorenz | 61420f7 | 2015-08-07 20:48:30 +0000 | [diff] [blame] | 876 | if (Op.getBaseAlignment() != Op.getSize()) | 
|  | 877 | OS << ", align " << Op.getBaseAlignment(); | 
| Alex Lorenz | a617c91 | 2015-08-17 22:05:15 +0000 | [diff] [blame] | 878 | auto AAInfo = Op.getAAInfo(); | 
|  | 879 | if (AAInfo.TBAA) { | 
|  | 880 | OS << ", !tbaa "; | 
|  | 881 | AAInfo.TBAA->printAsOperand(OS, MST); | 
|  | 882 | } | 
| Alex Lorenz | a16f624 | 2015-08-17 22:06:40 +0000 | [diff] [blame] | 883 | if (AAInfo.Scope) { | 
|  | 884 | OS << ", !alias.scope "; | 
|  | 885 | AAInfo.Scope->printAsOperand(OS, MST); | 
|  | 886 | } | 
| Alex Lorenz | 03e940d | 2015-08-17 22:08:02 +0000 | [diff] [blame] | 887 | if (AAInfo.NoAlias) { | 
|  | 888 | OS << ", !noalias "; | 
|  | 889 | AAInfo.NoAlias->printAsOperand(OS, MST); | 
|  | 890 | } | 
| Alex Lorenz | eb62568 | 2015-08-17 22:09:52 +0000 | [diff] [blame] | 891 | if (Op.getRanges()) { | 
|  | 892 | OS << ", !range "; | 
|  | 893 | Op.getRanges()->printAsOperand(OS, MST); | 
|  | 894 | } | 
| Alex Lorenz | 4af7e61 | 2015-08-03 23:08:19 +0000 | [diff] [blame] | 895 | OS << ')'; | 
|  | 896 | } | 
|  | 897 |  | 
| Konstantin Zhuravlyov | bb80d3e | 2017-07-11 22:23:00 +0000 | [diff] [blame] | 898 | void MIPrinter::printSyncScope(const LLVMContext &Context, SyncScope::ID SSID) { | 
|  | 899 | switch (SSID) { | 
|  | 900 | case SyncScope::System: { | 
|  | 901 | break; | 
|  | 902 | } | 
|  | 903 | default: { | 
|  | 904 | if (SSNs.empty()) | 
|  | 905 | Context.getSyncScopeNames(SSNs); | 
|  | 906 |  | 
|  | 907 | OS << "syncscope(\""; | 
|  | 908 | PrintEscapedString(SSNs[SSID], OS); | 
|  | 909 | OS << "\") "; | 
|  | 910 | break; | 
|  | 911 | } | 
|  | 912 | } | 
|  | 913 | } | 
|  | 914 |  | 
| Alex Lorenz | 345c144 | 2015-06-15 23:52:35 +0000 | [diff] [blame] | 915 | void llvm::printMIR(raw_ostream &OS, const Module &M) { | 
|  | 916 | yaml::Output Out(OS); | 
|  | 917 | Out << const_cast<Module &>(M); | 
|  | 918 | } | 
|  | 919 |  | 
|  | 920 | void llvm::printMIR(raw_ostream &OS, const MachineFunction &MF) { | 
|  | 921 | MIRPrinter Printer(OS); | 
|  | 922 | Printer.print(MF); | 
|  | 923 | } |