1 //===- MCInstPrinter.h - MCInst to target assembly syntax -------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_MC_MCINSTPRINTER_H
11 #define LLVM_MC_MCINSTPRINTER_H
13 #include "llvm/Support/Format.h"
18 template <typename T> class ArrayRef;
23 class MCSubtargetInfo;
27 /// Convert `Bytes' to a hex string and output to `OS'
28 void dumpBytes(ArrayRef<uint8_t> Bytes, raw_ostream &OS);
37 } // end namespace HexStyle
39 /// \brief This is an instance of a target assembly language printer that
40 /// converts an MCInst to valid target assembly syntax.
43 /// \brief A stream that comments can be emitted to if desired. Each comment
44 /// must end with a newline. This will be null if verbose assembly emission
46 raw_ostream *CommentStream = nullptr;
48 const MCInstrInfo &MII;
49 const MCRegisterInfo &MRI;
51 /// True if we are printing marked up assembly.
52 bool UseMarkup = false;
54 /// True if we are printing immediates as hex.
55 bool PrintImmHex = false;
57 /// Which style to use for printing hexadecimal values.
58 HexStyle::Style PrintHexStyle = HexStyle::C;
60 /// Utility function for printing annotations.
61 void printAnnotation(raw_ostream &OS, StringRef Annot);
64 MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii,
65 const MCRegisterInfo &mri) : MAI(mai), MII(mii), MRI(mri) {}
67 virtual ~MCInstPrinter();
69 /// \brief Specify a stream to emit comments to.
70 void setCommentStream(raw_ostream &OS) { CommentStream = &OS; }
72 /// \brief Print the specified MCInst to the specified raw_ostream.
73 virtual void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot,
74 const MCSubtargetInfo &STI) = 0;
76 /// \brief Return the name of the specified opcode enum (e.g. "MOV32ri") or
77 /// empty if we can't resolve it.
78 StringRef getOpcodeName(unsigned Opcode) const;
80 /// \brief Print the assembler register name.
81 virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
83 bool getUseMarkup() const { return UseMarkup; }
84 void setUseMarkup(bool Value) { UseMarkup = Value; }
86 /// Utility functions to make adding mark ups simpler.
87 StringRef markup(StringRef s) const;
88 StringRef markup(StringRef a, StringRef b) const;
90 bool getPrintImmHex() const { return PrintImmHex; }
91 void setPrintImmHex(bool Value) { PrintImmHex = Value; }
93 HexStyle::Style getPrintHexStyle() const { return PrintHexStyle; }
94 void setPrintHexStyle(HexStyle::Style Value) { PrintHexStyle = Value; }
96 /// Utility function to print immediates in decimal or hex.
97 format_object<int64_t> formatImm(int64_t Value) const {
98 return PrintImmHex ? formatHex(Value) : formatDec(Value);
101 /// Utility functions to print decimal/hexadecimal values.
102 format_object<int64_t> formatDec(int64_t Value) const;
103 format_object<int64_t> formatHex(int64_t Value) const;
104 format_object<uint64_t> formatHex(uint64_t Value) const;
107 } // end namespace llvm
109 #endif // LLVM_MC_MCINSTPRINTER_H