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