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