diff options
Diffstat (limited to 'lib/CodeGen/MIRPrinter.cpp')
| -rw-r--r-- | lib/CodeGen/MIRPrinter.cpp | 54 | 
1 files changed, 48 insertions, 6 deletions
diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index c524a9835f338..ddeacf1d1bfb1 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -18,6 +18,7 @@  #include "llvm/ADT/SmallPtrSet.h"  #include "llvm/ADT/SmallVector.h"  #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h"  #include "llvm/ADT/StringRef.h"  #include "llvm/ADT/Twine.h"  #include "llvm/CodeGen/GlobalISel/RegisterBank.h" @@ -139,6 +140,8 @@ class MIPrinter {    ModuleSlotTracker &MST;    const DenseMap<const uint32_t *, unsigned> &RegisterMaskIds;    const DenseMap<int, FrameIndexOperand> &StackObjectOperandMapping; +  /// Synchronization scope names registered with LLVMContext. +  SmallVector<StringRef, 8> SSNs;    bool canPredictBranchProbabilities(const MachineBasicBlock &MBB) const;    bool canPredictSuccessors(const MachineBasicBlock &MBB) const; @@ -162,7 +165,9 @@ public:    void print(const MachineOperand &Op, const TargetRegisterInfo *TRI,               unsigned I, bool ShouldPrintRegisterTies,               LLT TypeToPrint, bool IsDef = false); -  void print(const MachineMemOperand &Op); +  void print(const LLVMContext &Context, const TargetInstrInfo &TII, +             const MachineMemOperand &Op); +  void printSyncScope(const LLVMContext &Context, SyncScope::ID SSID);    void print(const MCCFIInstruction &CFI, const TargetRegisterInfo *TRI);  }; @@ -731,11 +736,12 @@ void MIPrinter::print(const MachineInstr &MI) {    if (!MI.memoperands_empty()) {      OS << " :: "; +    const LLVMContext &Context = MF->getFunction()->getContext();      bool NeedComma = false;      for (const auto *Op : MI.memoperands()) {        if (NeedComma)          OS << ", "; -      print(*Op); +      print(Context, *TII, *Op);        NeedComma = true;      }    } @@ -1031,9 +1037,20 @@ void MIPrinter::print(const MachineOperand &Op, const TargetRegisterInfo *TRI,    }  } -void MIPrinter::print(const MachineMemOperand &Op) { +static const char *getTargetMMOFlagName(const TargetInstrInfo &TII, +                                        unsigned TMMOFlag) { +  auto Flags = TII.getSerializableMachineMemOperandTargetFlags(); +  for (const auto &I : Flags) { +    if (I.first == TMMOFlag) { +      return I.second; +    } +  } +  return nullptr; +} + +void MIPrinter::print(const LLVMContext &Context, const TargetInstrInfo &TII, +                      const MachineMemOperand &Op) {    OS << '('; -  // TODO: Print operand's target specific flags.    if (Op.isVolatile())      OS << "volatile ";    if (Op.isNonTemporal()) @@ -1042,6 +1059,15 @@ void MIPrinter::print(const MachineMemOperand &Op) {      OS << "dereferenceable ";    if (Op.isInvariant())      OS << "invariant "; +  if (Op.getFlags() & MachineMemOperand::MOTargetFlag1) +    OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag1) +       << "\" "; +  if (Op.getFlags() & MachineMemOperand::MOTargetFlag2) +    OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag2) +       << "\" "; +  if (Op.getFlags() & MachineMemOperand::MOTargetFlag3) +    OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag3) +       << "\" ";    if (Op.isLoad())      OS << "load ";    else { @@ -1049,8 +1075,7 @@ void MIPrinter::print(const MachineMemOperand &Op) {      OS << "store ";    } -  if (Op.getSynchScope() == SynchronizationScope::SingleThread) -    OS << "singlethread "; +  printSyncScope(Context, Op.getSyncScopeID());    if (Op.getOrdering() != AtomicOrdering::NotAtomic)      OS << toIRString(Op.getOrdering()) << ' '; @@ -1119,6 +1144,23 @@ void MIPrinter::print(const MachineMemOperand &Op) {    OS << ')';  } +void MIPrinter::printSyncScope(const LLVMContext &Context, SyncScope::ID SSID) { +  switch (SSID) { +  case SyncScope::System: { +    break; +  } +  default: { +    if (SSNs.empty()) +      Context.getSyncScopeNames(SSNs); + +    OS << "syncscope(\""; +    PrintEscapedString(SSNs[SSID], OS); +    OS << "\") "; +    break; +  } +  } +} +  static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,                               const TargetRegisterInfo *TRI) {    int Reg = TRI->getLLVMRegNum(DwarfReg, true);  | 
