137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===- MCInstPrinter.h - MCInst to target assembly syntax -------*- C++ -*-===//
265b0b297db16252835ab4d78f33578baa3ace28aChris Lattner//
365b0b297db16252835ab4d78f33578baa3ace28aChris Lattner//                     The LLVM Compiler Infrastructure
465b0b297db16252835ab4d78f33578baa3ace28aChris Lattner//
565b0b297db16252835ab4d78f33578baa3ace28aChris Lattner// This file is distributed under the University of Illinois Open Source
665b0b297db16252835ab4d78f33578baa3ace28aChris Lattner// License. See LICENSE.TXT for details.
765b0b297db16252835ab4d78f33578baa3ace28aChris Lattner//
865b0b297db16252835ab4d78f33578baa3ace28aChris Lattner//===----------------------------------------------------------------------===//
965b0b297db16252835ab4d78f33578baa3ace28aChris Lattner
1065b0b297db16252835ab4d78f33578baa3ace28aChris Lattner#ifndef LLVM_MC_MCINSTPRINTER_H
1165b0b297db16252835ab4d78f33578baa3ace28aChris Lattner#define LLVM_MC_MCINSTPRINTER_H
1265b0b297db16252835ab4d78f33578baa3ace28aChris Lattner
136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/ADT/ArrayRef.h"
14d9791538156702ac1f92ca2984a8ab536deda4f1Benjamin Kramer#include "llvm/Support/DataTypes.h"
1514ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby#include "llvm/Support/Format.h"
1614ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby
1765b0b297db16252835ab4d78f33578baa3ace28aChris Lattnernamespace llvm {
1865b0b297db16252835ab4d78f33578baa3ace28aChris Lattnerclass MCInst;
1965b0b297db16252835ab4d78f33578baa3ace28aChris Lattnerclass raw_ostream;
20c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattnerclass MCAsmInfo;
2117463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topperclass MCInstrInfo;
22c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbachclass MCRegisterInfo;
230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass MCSubtargetInfo;
247e85180d15c4d5a451fbc078f7194a41c6230a57Chris Lattnerclass StringRef;
25c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattner
266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// Convert `Bytes' to a hex string and output to `OS'
276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid dumpBytes(ArrayRef<uint8_t> Bytes, raw_ostream &OS);
286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2944c8e346c79cc2affa31385df254b85aa0f5c869Daniel Maleanamespace HexStyle {
306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarenum Style {
316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  C,  ///< 0xff
326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Asm ///< 0ffh
336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
3444c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea}
3544c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea
366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// \brief This is an instance of a target assembly language printer that
376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// converts an MCInst to valid target assembly syntax.
3865b0b297db16252835ab4d78f33578baa3ace28aChris Lattnerclass MCInstPrinter {
39c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattnerprotected:
406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief A stream that comments can be emitted to if desired.  Each comment
416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// must end with a newline.  This will be null if verbose assembly emission
426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// is disable.
435d672cfab096390690a1a5f33b0057c4cf252c55Chris Lattner  raw_ostream *CommentStream;
44c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattner  const MCAsmInfo &MAI;
4517463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper  const MCInstrInfo &MII;
46c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach  const MCRegisterInfo &MRI;
4744dcfd36253570ccd5f00189eb918604473135e0Bill Wendling
483ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby  /// True if we are printing marked up assembly.
493ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby  bool UseMarkup;
503ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby
5114ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby  /// True if we are printing immediates as hex.
5214ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby  bool PrintImmHex;
5314ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby
5444c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea  /// Which style to use for printing hexadecimal values.
5544c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea  HexStyle::Style PrintHexStyle;
5644c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea
5798c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson  /// Utility function for printing annotations.
5898c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson  void printAnnotation(raw_ostream &OS, StringRef Annot);
596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6065b0b297db16252835ab4d78f33578baa3ace28aChris Lattnerpublic:
6117463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper  MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii,
6217463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                const MCRegisterInfo &mri)
636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      : CommentStream(nullptr), MAI(mai), MII(mii), MRI(mri), UseMarkup(0),
646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        PrintImmHex(0), PrintHexStyle(HexStyle::C) {}
65fd2eaed4f0a9375071a448993c573a124370ed34Jim Grosbach
6665b0b297db16252835ab4d78f33578baa3ace28aChris Lattner  virtual ~MCInstPrinter();
675d672cfab096390690a1a5f33b0057c4cf252c55Chris Lattner
686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Specify a stream to emit comments to.
695d672cfab096390690a1a5f33b0057c4cf252c55Chris Lattner  void setCommentStream(raw_ostream &OS) { CommentStream = &OS; }
70fd2eaed4f0a9375071a448993c573a124370ed34Jim Grosbach
716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Print the specified MCInst to the specified raw_ostream.
726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  virtual void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot,
736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                         const MCSubtargetInfo &STI) = 0;
74ede042dc8d59ff48a48ef8e2271f2a7ee8324ba5Owen Anderson
756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Return the name of the specified opcode enum (e.g. "MOV32ri") or
766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// empty if we can't resolve it.
77c97ef618d2d849a272a353c2b4343fc5902cd921Benjamin Kramer  StringRef getOpcodeName(unsigned Opcode) const;
7857caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov
796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// \brief Print the assembler register name.
80cde4ce411b1ace4a80ea1dd38df97e8508aed0c9Rafael Espindola  virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
8144dcfd36253570ccd5f00189eb918604473135e0Bill Wendling
823ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby  bool getUseMarkup() const { return UseMarkup; }
833ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby  void setUseMarkup(bool Value) { UseMarkup = Value; }
84e1d4a8813427b76c5f59cf5b70a9df734b7e9284Kevin Enderby
85e1d4a8813427b76c5f59cf5b70a9df734b7e9284Kevin Enderby  /// Utility functions to make adding mark ups simpler.
86e1d4a8813427b76c5f59cf5b70a9df734b7e9284Kevin Enderby  StringRef markup(StringRef s) const;
87e1d4a8813427b76c5f59cf5b70a9df734b7e9284Kevin Enderby  StringRef markup(StringRef a, StringRef b) const;
8814ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby
8914ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby  bool getPrintImmHex() const { return PrintImmHex; }
9014ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby  void setPrintImmHex(bool Value) { PrintImmHex = Value; }
9114ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby
926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  HexStyle::Style getPrintHexStyle() const { return PrintHexStyle; }
936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void setPrintHexStyle(HexStyle::Style Value) { PrintHexStyle = Value; }
9444c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea
9514ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby  /// Utility function to print immediates in decimal or hex.
96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  format_object<int64_t> formatImm(int64_t Value) const {
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return PrintImmHex ? formatHex(Value) : formatDec(Value);
98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
9944c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea
10044c8e346c79cc2affa31385df254b85aa0f5c869Daniel Malea  /// Utility functions to print decimal/hexadecimal values.
101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  format_object<int64_t> formatDec(int64_t Value) const;
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  format_object<int64_t> formatHex(int64_t Value) const;
103ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  format_object<uint64_t> formatHex(uint64_t Value) const;
10465b0b297db16252835ab4d78f33578baa3ace28aChris Lattner};
105fd2eaed4f0a9375071a448993c573a124370ed34Jim Grosbach
10665b0b297db16252835ab4d78f33578baa3ace28aChris Lattner} // namespace llvm
10765b0b297db16252835ab4d78f33578baa3ace28aChris Lattner
10865b0b297db16252835ab4d78f33578baa3ace28aChris Lattner#endif
109