1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- MCInstPrinter.h - MCInst to target assembly syntax -------*- C++ -*-===//
2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//                     The LLVM Compiler Infrastructure
4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source
6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details.
7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//
8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===//
9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_MC_MCINSTPRINTER_H
11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_MC_MCINSTPRINTER_H
12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/Format.h"
14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cstdint>
15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace llvm {
17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robottemplate <typename T> class ArrayRef;
19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MCAsmInfo;
20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MCInst;
21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MCInstrInfo;
22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MCRegisterInfo;
23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MCSubtargetInfo;
24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass raw_ostream;
25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass StringRef;
26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Convert `Bytes' to a hex string and output to `OS'
28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotvoid dumpBytes(ArrayRef<uint8_t> Bytes, raw_ostream &OS);
29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace HexStyle {
31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotenum Style {
33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  C,  ///< 0xff
34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  Asm ///< 0ffh
35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace HexStyle
38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief This is an instance of a target assembly language printer that
40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// converts an MCInst to valid target assembly syntax.
41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MCInstPrinter {
42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprotected:
43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief A stream that comments can be emitted to if desired.  Each comment
44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// must end with a newline.  This will be null if verbose assembly emission
45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// is disable.
46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  raw_ostream *CommentStream = nullptr;
47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const MCAsmInfo &MAI;
48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const MCInstrInfo &MII;
49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  const MCRegisterInfo &MRI;
50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// True if we are printing marked up assembly.
52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool UseMarkup = false;
53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// True if we are printing immediates as hex.
55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool PrintImmHex = false;
56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Which style to use for printing hexadecimal values.
58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  HexStyle::Style PrintHexStyle = HexStyle::C;
59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Utility function for printing annotations.
61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void printAnnotation(raw_ostream &OS, StringRef Annot);
62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic:
64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii,
65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                const MCRegisterInfo &mri) : MAI(mai), MII(mii), MRI(mri) {}
66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  virtual ~MCInstPrinter();
68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief Specify a stream to emit comments to.
70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setCommentStream(raw_ostream &OS) { CommentStream = &OS; }
71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief Print the specified MCInst to the specified raw_ostream.
73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  virtual void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot,
74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot                         const MCSubtargetInfo &STI) = 0;
75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief Return the name of the specified opcode enum (e.g. "MOV32ri") or
77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// empty if we can't resolve it.
78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StringRef getOpcodeName(unsigned Opcode) const;
79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// \brief Print the assembler register name.
81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getUseMarkup() const { return UseMarkup; }
84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setUseMarkup(bool Value) { UseMarkup = Value; }
85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Utility functions to make adding mark ups simpler.
87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StringRef markup(StringRef s) const;
88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  StringRef markup(StringRef a, StringRef b) const;
89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  bool getPrintImmHex() const { return PrintImmHex; }
91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setPrintImmHex(bool Value) { PrintImmHex = Value; }
92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  HexStyle::Style getPrintHexStyle() const { return PrintHexStyle; }
94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  void setPrintHexStyle(HexStyle::Style Value) { PrintHexStyle = Value; }
95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Utility function to print immediates in decimal or hex.
97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  format_object<int64_t> formatImm(int64_t Value) const {
98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot    return PrintImmHex ? formatHex(Value) : formatDec(Value);
99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  }
100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  /// Utility functions to print decimal/hexadecimal values.
102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  format_object<int64_t> formatDec(int64_t Value) const;
103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  format_object<int64_t> formatHex(int64_t Value) const;
104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot  format_object<uint64_t> formatHex(uint64_t Value) const;
105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot};
106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace llvm
108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot
109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif // LLVM_MC_MCINSTPRINTER_H
110