blob: 8b9ef178e33c1bdbe1ceaaef989b900f305a4b4c [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- MCInstPrinter.h - MCInst to target assembly syntax -------*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
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
15namespace llvm {
16
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010017class MCAsmInfo;
18class MCInst;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020019class MCOperand;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010020class MCInstrInfo;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020021class MCInstrAnalysis;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010022class MCRegisterInfo;
23class MCSubtargetInfo;
24class raw_ostream;
25class StringRef;
26
27/// Convert `Bytes' to a hex string and output to `OS'
28void dumpBytes(ArrayRef<uint8_t> Bytes, raw_ostream &OS);
29
30namespace HexStyle {
31
32enum Style {
33 C, ///< 0xff
34 Asm ///< 0ffh
35};
36
37} // end namespace HexStyle
38
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020039struct AliasMatchingData;
40
Andrew Scullcdfcccc2018-10-05 20:58:37 +010041/// This is an instance of a target assembly language printer that
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010042/// converts an MCInst to valid target assembly syntax.
43class MCInstPrinter {
44protected:
Andrew Scullcdfcccc2018-10-05 20:58:37 +010045 /// A stream that comments can be emitted to if desired. Each comment
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010046 /// must end with a newline. This will be null if verbose assembly emission
Andrew Scullcdfcccc2018-10-05 20:58:37 +010047 /// is disabled.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010048 raw_ostream *CommentStream = nullptr;
49 const MCAsmInfo &MAI;
50 const MCInstrInfo &MII;
51 const MCRegisterInfo &MRI;
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020052 const MCInstrAnalysis *MIA = nullptr;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010053
54 /// True if we are printing marked up assembly.
55 bool UseMarkup = false;
56
57 /// True if we are printing immediates as hex.
58 bool PrintImmHex = false;
59
60 /// Which style to use for printing hexadecimal values.
61 HexStyle::Style PrintHexStyle = HexStyle::C;
62
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020063 /// If true, a branch immediate (e.g. bl 4) will be printed as a hexadecimal
64 /// address (e.g. bl 0x20004). This is useful for a stream disassembler
65 /// (llvm-objdump -d).
66 bool PrintBranchImmAsAddress = false;
67
68 /// If true, symbolize branch target and memory reference operands.
69 bool SymbolizeOperands = false;
70
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010071 /// Utility function for printing annotations.
72 void printAnnotation(raw_ostream &OS, StringRef Annot);
73
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020074 /// Helper for matching MCInsts to alias patterns when printing instructions.
75 const char *matchAliasPatterns(const MCInst *MI, const MCSubtargetInfo *STI,
76 const AliasMatchingData &M);
77
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010078public:
79 MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii,
80 const MCRegisterInfo &mri) : MAI(mai), MII(mii), MRI(mri) {}
81
82 virtual ~MCInstPrinter();
83
Andrew Walbran3d2c1972020-04-07 12:24:26 +010084 /// Customize the printer according to a command line option.
85 /// @return true if the option is recognized and applied.
86 virtual bool applyTargetSpecificCLOption(StringRef Opt) { return false; }
87
Andrew Scullcdfcccc2018-10-05 20:58:37 +010088 /// Specify a stream to emit comments to.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010089 void setCommentStream(raw_ostream &OS) { CommentStream = &OS; }
90
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020091 /// Returns a pair containing the mnemonic for \p MI and the number of bits
92 /// left for further processing by printInstruction (generated by tablegen).
93 virtual std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) = 0;
94
Andrew Scullcdfcccc2018-10-05 20:58:37 +010095 /// Print the specified MCInst to the specified raw_ostream.
Olivier Deprezf4ef2d02021-04-20 13:36:24 +020096 ///
97 /// \p Address the address of current instruction on most targets, used to
98 /// print a PC relative immediate as the target address. On targets where a PC
99 /// relative immediate is relative to the next instruction and the length of a
100 /// MCInst is difficult to measure (e.g. x86), this is the address of the next
101 /// instruction. If Address is 0, the immediate will be printed.
102 virtual void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
103 const MCSubtargetInfo &STI, raw_ostream &OS) = 0;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100104
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100105 /// Return the name of the specified opcode enum (e.g. "MOV32ri") or
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100106 /// empty if we can't resolve it.
107 StringRef getOpcodeName(unsigned Opcode) const;
108
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100109 /// Print the assembler register name.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100110 virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
111
112 bool getUseMarkup() const { return UseMarkup; }
113 void setUseMarkup(bool Value) { UseMarkup = Value; }
114
115 /// Utility functions to make adding mark ups simpler.
116 StringRef markup(StringRef s) const;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100117
118 bool getPrintImmHex() const { return PrintImmHex; }
119 void setPrintImmHex(bool Value) { PrintImmHex = Value; }
120
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100121 void setPrintHexStyle(HexStyle::Style Value) { PrintHexStyle = Value; }
122
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200123 void setPrintBranchImmAsAddress(bool Value) {
124 PrintBranchImmAsAddress = Value;
125 }
126
127 void setSymbolizeOperands(bool Value) { SymbolizeOperands = Value; }
128 void setMCInstrAnalysis(const MCInstrAnalysis *Value) { MIA = Value; }
129
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100130 /// Utility function to print immediates in decimal or hex.
131 format_object<int64_t> formatImm(int64_t Value) const {
132 return PrintImmHex ? formatHex(Value) : formatDec(Value);
133 }
134
135 /// Utility functions to print decimal/hexadecimal values.
136 format_object<int64_t> formatDec(int64_t Value) const;
137 format_object<int64_t> formatHex(int64_t Value) const;
138 format_object<uint64_t> formatHex(uint64_t Value) const;
139};
140
Olivier Deprezf4ef2d02021-04-20 13:36:24 +0200141/// Map from opcode to pattern list by binary search.
142struct PatternsForOpcode {
143 uint32_t Opcode;
144 uint16_t PatternStart;
145 uint16_t NumPatterns;
146};
147
148/// Data for each alias pattern. Includes feature bits, string, number of
149/// operands, and a variadic list of conditions to check.
150struct AliasPattern {
151 uint32_t AsmStrOffset;
152 uint32_t AliasCondStart;
153 uint8_t NumOperands;
154 uint8_t NumConds;
155};
156
157struct AliasPatternCond {
158 enum CondKind : uint8_t {
159 K_Feature, // Match only if a feature is enabled.
160 K_NegFeature, // Match only if a feature is disabled.
161 K_OrFeature, // Match only if one of a set of features is enabled.
162 K_OrNegFeature, // Match only if one of a set of features is disabled.
163 K_EndOrFeatures, // Note end of list of K_Or(Neg)?Features.
164 K_Ignore, // Match any operand.
165 K_Reg, // Match a specific register.
166 K_TiedReg, // Match another already matched register.
167 K_Imm, // Match a specific immediate.
168 K_RegClass, // Match registers in a class.
169 K_Custom, // Call custom matcher by index.
170 };
171
172 CondKind Kind;
173 uint32_t Value;
174};
175
176/// Tablegenerated data structures needed to match alias patterns.
177struct AliasMatchingData {
178 ArrayRef<PatternsForOpcode> OpToPatterns;
179 ArrayRef<AliasPattern> Patterns;
180 ArrayRef<AliasPatternCond> PatternConds;
181 StringRef AsmStrings;
182 bool (*ValidateMCOperand)(const MCOperand &MCOp, const MCSubtargetInfo &STI,
183 unsigned PredicateIndex);
184};
185
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100186} // end namespace llvm
187
188#endif // LLVM_MC_MCINSTPRINTER_H