MCInstPrinter.h revision 14ccc9007a932a23201251ced4be4c898a62d6a5
1//===-- MCInstPrinter.h - Convert an MCInst to target assembly syntax -----===//
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#ifndef LLVM_MC_MCINSTPRINTER_H
11#define LLVM_MC_MCINSTPRINTER_H
12
13#include "llvm/Support/Format.h"
14
15namespace llvm {
16class MCInst;
17class raw_ostream;
18class MCAsmInfo;
19class MCInstrInfo;
20class MCRegisterInfo;
21class StringRef;
22
23/// MCInstPrinter - This is an instance of a target assembly language printer
24/// that converts an MCInst to valid target assembly syntax.
25class MCInstPrinter {
26protected:
27  /// CommentStream - a stream that comments can be emitted to if desired.
28  /// Each comment must end with a newline.  This will be null if verbose
29  /// assembly emission is disable.
30  raw_ostream *CommentStream;
31  const MCAsmInfo &MAI;
32  const MCInstrInfo &MII;
33  const MCRegisterInfo &MRI;
34
35  /// The current set of available features.
36  unsigned AvailableFeatures;
37
38  /// True if we are printing marked up assembly.
39  bool UseMarkup;
40
41  /// True if we are printing immediates as hex.
42  bool PrintImmHex;
43
44  /// Utility function for printing annotations.
45  void printAnnotation(raw_ostream &OS, StringRef Annot);
46public:
47  MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii,
48                const MCRegisterInfo &mri)
49    : CommentStream(0), MAI(mai), MII(mii), MRI(mri), AvailableFeatures(0),
50      UseMarkup(0), PrintImmHex(0) {}
51
52  virtual ~MCInstPrinter();
53
54  /// setCommentStream - Specify a stream to emit comments to.
55  void setCommentStream(raw_ostream &OS) { CommentStream = &OS; }
56
57  /// printInst - Print the specified MCInst to the specified raw_ostream.
58  ///
59  virtual void printInst(const MCInst *MI, raw_ostream &OS,
60                         StringRef Annot) = 0;
61
62  /// getOpcodeName - Return the name of the specified opcode enum (e.g.
63  /// "MOV32ri") or empty if we can't resolve it.
64  StringRef getOpcodeName(unsigned Opcode) const;
65
66  /// printRegName - Print the assembler register name.
67  virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
68
69  unsigned getAvailableFeatures() const { return AvailableFeatures; }
70  void setAvailableFeatures(unsigned Value) { AvailableFeatures = Value; }
71
72  bool getUseMarkup() const { return UseMarkup; }
73  void setUseMarkup(bool Value) { UseMarkup = Value; }
74
75  /// Utility functions to make adding mark ups simpler.
76  StringRef markup(StringRef s) const;
77  StringRef markup(StringRef a, StringRef b) const;
78
79  bool getPrintImmHex() const { return PrintImmHex; }
80  void setPrintImmHex(bool Value) { PrintImmHex = Value; }
81
82  /// Utility function to print immediates in decimal or hex.
83  format_object1<int64_t> formatImm(const int64_t Value) const;
84};
85
86} // namespace llvm
87
88#endif
89