/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/MC/MCInstPrinter.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===- MCInstPrinter.h - MCInst to target assembly syntax -------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #ifndef LLVM_MC_MCINSTPRINTER_H |
10 | | #define LLVM_MC_MCINSTPRINTER_H |
11 | | |
12 | | #include "llvm/Support/Format.h" |
13 | | #include <cstdint> |
14 | | |
15 | | namespace llvm { |
16 | | |
17 | | class MCAsmInfo; |
18 | | class MCInst; |
19 | | class MCInstrInfo; |
20 | | class MCRegisterInfo; |
21 | | class MCSubtargetInfo; |
22 | | class raw_ostream; |
23 | | class StringRef; |
24 | | |
25 | | /// Convert `Bytes' to a hex string and output to `OS' |
26 | | void dumpBytes(ArrayRef<uint8_t> Bytes, raw_ostream &OS); |
27 | | |
28 | | namespace HexStyle { |
29 | | |
30 | | enum Style { |
31 | | C, ///< 0xff |
32 | | Asm ///< 0ffh |
33 | | }; |
34 | | |
35 | | } // end namespace HexStyle |
36 | | |
37 | | /// This is an instance of a target assembly language printer that |
38 | | /// converts an MCInst to valid target assembly syntax. |
39 | | class MCInstPrinter { |
40 | | protected: |
41 | | /// A stream that comments can be emitted to if desired. Each comment |
42 | | /// must end with a newline. This will be null if verbose assembly emission |
43 | | /// is disabled. |
44 | | raw_ostream *CommentStream = nullptr; |
45 | | const MCAsmInfo &MAI; |
46 | | const MCInstrInfo &MII; |
47 | | const MCRegisterInfo &MRI; |
48 | | |
49 | | /// True if we are printing marked up assembly. |
50 | | bool UseMarkup = false; |
51 | | |
52 | | /// True if we are printing immediates as hex. |
53 | | bool PrintImmHex = false; |
54 | | |
55 | | /// Which style to use for printing hexadecimal values. |
56 | | HexStyle::Style PrintHexStyle = HexStyle::C; |
57 | | |
58 | | /// Utility function for printing annotations. |
59 | | void printAnnotation(raw_ostream &OS, StringRef Annot); |
60 | | |
61 | | public: |
62 | | MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii, |
63 | 30.1k | const MCRegisterInfo &mri) : MAI(mai), MII(mii), MRI(mri) {} |
64 | | |
65 | | virtual ~MCInstPrinter(); |
66 | | |
67 | | /// Customize the printer according to a command line option. |
68 | | /// @return true if the option is recognized and applied. |
69 | 0 | virtual bool applyTargetSpecificCLOption(StringRef Opt) { return false; } |
70 | | |
71 | | /// Specify a stream to emit comments to. |
72 | 26.2k | void setCommentStream(raw_ostream &OS) { CommentStream = &OS; } |
73 | | |
74 | | /// Print the specified MCInst to the specified raw_ostream. |
75 | | virtual void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot, |
76 | | const MCSubtargetInfo &STI) = 0; |
77 | | |
78 | | /// Return the name of the specified opcode enum (e.g. "MOV32ri") or |
79 | | /// empty if we can't resolve it. |
80 | | StringRef getOpcodeName(unsigned Opcode) const; |
81 | | |
82 | | /// Print the assembler register name. |
83 | | virtual void printRegName(raw_ostream &OS, unsigned RegNo) const; |
84 | | |
85 | 5.88M | bool getUseMarkup() const { return UseMarkup; } |
86 | | void setUseMarkup(bool Value) { UseMarkup = Value; } |
87 | | |
88 | | /// Utility functions to make adding mark ups simpler. |
89 | | StringRef markup(StringRef s) const; |
90 | | StringRef markup(StringRef a, StringRef b) const; |
91 | | |
92 | 579 | bool getPrintImmHex() const { return PrintImmHex; } |
93 | | void setPrintImmHex(bool Value) { PrintImmHex = Value; } |
94 | | |
95 | 0 | HexStyle::Style getPrintHexStyle() const { return PrintHexStyle; } |
96 | 0 | void setPrintHexStyle(HexStyle::Style Value) { PrintHexStyle = Value; } |
97 | | |
98 | | /// Utility function to print immediates in decimal or hex. |
99 | 602k | format_object<int64_t> formatImm(int64_t Value) const { |
100 | 602k | return PrintImmHex ? formatHex(Value)1.68k : formatDec(Value)600k ; |
101 | 602k | } |
102 | | |
103 | | /// Utility functions to print decimal/hexadecimal values. |
104 | | format_object<int64_t> formatDec(int64_t Value) const; |
105 | | format_object<int64_t> formatHex(int64_t Value) const; |
106 | | format_object<uint64_t> formatHex(uint64_t Value) const; |
107 | | }; |
108 | | |
109 | | } // end namespace llvm |
110 | | |
111 | | #endif // LLVM_MC_MCINSTPRINTER_H |