1//===- MILexer.h - Lexer for machine instructions ---------------*- 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// This file declares the function that lexes the machine instruction source
10// string.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
15#define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
16
17#include "llvm/ADT/APSInt.h"
18#include "llvm/ADT/StringRef.h"
19#include <string>
20
21namespace llvm {
22
23class Twine;
24
25/// A token produced by the machine instruction lexer.
26struct MIToken {
27 enum TokenKind {
28 // Markers
29 Eof,
30 Error,
31 Newline,
32
33 // Tokens with no info.
34 comma,
35 equal,
36 underscore,
37 colon,
38 coloncolon,
39 dot,
40 exclaim,
41 lparen,
42 rparen,
43 lbrace,
44 rbrace,
45 plus,
46 minus,
47 less,
48 greater,
49
50 // Keywords
51 kw_implicit,
52 kw_implicit_define,
53 kw_def,
54 kw_dead,
55 kw_dereferenceable,
56 kw_killed,
57 kw_undef,
58 kw_internal,
59 kw_early_clobber,
60 kw_debug_use,
61 kw_renamable,
62 kw_tied_def,
63 kw_frame_setup,
64 kw_frame_destroy,
65 kw_nnan,
66 kw_ninf,
67 kw_nsz,
68 kw_arcp,
69 kw_contract,
70 kw_afn,
71 kw_reassoc,
72 kw_nusw,
73 kw_nuw,
74 kw_nsw,
75 kw_exact,
76 kw_nofpexcept,
77 kw_unpredictable,
78 kw_nneg,
79 kw_disjoint,
80 kw_samesign,
81 kw_inbounds,
82 kw_debug_location,
83 kw_debug_instr_number,
84 kw_dbg_instr_ref,
85 kw_cfi_same_value,
86 kw_cfi_offset,
87 kw_cfi_rel_offset,
88 kw_cfi_def_cfa_register,
89 kw_cfi_def_cfa_offset,
90 kw_cfi_adjust_cfa_offset,
91 kw_cfi_escape,
92 kw_cfi_def_cfa,
93 kw_cfi_llvm_def_aspace_cfa,
94 kw_cfi_register,
95 kw_cfi_remember_state,
96 kw_cfi_restore,
97 kw_cfi_restore_state,
98 kw_cfi_undefined,
99 kw_cfi_window_save,
100 kw_cfi_aarch64_negate_ra_sign_state,
101 kw_cfi_aarch64_negate_ra_sign_state_with_pc,
102 kw_blockaddress,
103 kw_intrinsic,
104 kw_target_index,
105 kw_half,
106 kw_bfloat,
107 kw_float,
108 kw_double,
109 kw_x86_fp80,
110 kw_fp128,
111 kw_ppc_fp128,
112 kw_target_flags,
113 kw_volatile,
114 kw_non_temporal,
115 kw_invariant,
116 kw_align,
117 kw_basealign,
118 kw_addrspace,
119 kw_stack,
120 kw_got,
121 kw_jump_table,
122 kw_constant_pool,
123 kw_call_entry,
124 kw_custom,
125 kw_lanemask,
126 kw_liveout,
127 kw_landing_pad,
128 kw_inlineasm_br_indirect_target,
129 kw_ehscope_entry,
130 kw_ehfunclet_entry,
131 kw_liveins,
132 kw_successors,
133 kw_floatpred,
134 kw_intpred,
135 kw_shufflemask,
136 kw_pre_instr_symbol,
137 kw_post_instr_symbol,
138 kw_heap_alloc_marker,
139 kw_pcsections,
140 kw_cfi_type,
141 kw_deactivation_symbol,
142 kw_bbsections,
143 kw_bb_id,
144 kw_unknown_size,
145 kw_unknown_address,
146 kw_ir_block_address_taken,
147 kw_machine_block_address_taken,
148 kw_call_frame_size,
149 kw_noconvergent,
150
151 // Metadata types.
152 kw_distinct,
153
154 // Named metadata keywords
155 md_tbaa,
156 md_alias_scope,
157 md_noalias,
158 md_noalias_addrspace,
159 md_range,
160 md_diexpr,
161 md_dilocation,
162
163 // Identifier tokens
164 Identifier,
165 NamedRegister,
166 NamedVirtualRegister,
167 MachineBasicBlockLabel,
168 MachineBasicBlock,
169 StackObject,
170 FixedStackObject,
171 NamedGlobalValue,
172 GlobalValue,
173 ExternalSymbol,
174 MCSymbol,
175
176 // Other tokens
177 IntegerLiteral,
178 FloatingPointLiteral,
179 HexLiteral,
180 VectorLiteral,
181 VirtualRegister,
182 ConstantPoolItem,
183 JumpTableIndex,
184 NamedIRBlock,
185 IRBlock,
186 NamedIRValue,
187 IRValue,
188 QuotedIRValue, // `<constant value>`
189 SubRegisterIndex,
190 StringConstant
191 };
192
193private:
194 TokenKind Kind = Error;
195 StringRef Range;
196 StringRef StringValue;
197 std::string StringValueStorage;
198 APSInt IntVal;
199
200public:
201 MIToken() = default;
202
203 MIToken &reset(TokenKind Kind, StringRef Range);
204
205 MIToken &setStringValue(StringRef StrVal);
206 MIToken &setOwnedStringValue(std::string StrVal);
207 MIToken &setIntegerValue(APSInt IntVal);
208
209 TokenKind kind() const { return Kind; }
210
211 bool isError() const { return Kind == Error; }
212
213 bool isNewlineOrEOF() const { return Kind == Newline || Kind == Eof; }
214
215 bool isErrorOrEOF() const { return Kind == Error || Kind == Eof; }
216
217 bool isRegister() const {
218 return Kind == NamedRegister || Kind == underscore ||
219 Kind == NamedVirtualRegister || Kind == VirtualRegister;
220 }
221
222 bool isRegisterFlag() const {
223 return Kind == kw_implicit || Kind == kw_implicit_define ||
224 Kind == kw_def || Kind == kw_dead || Kind == kw_killed ||
225 Kind == kw_undef || Kind == kw_internal ||
226 Kind == kw_early_clobber || Kind == kw_debug_use ||
227 Kind == kw_renamable;
228 }
229
230 bool isMemoryOperandFlag() const {
231 return Kind == kw_volatile || Kind == kw_non_temporal ||
232 Kind == kw_dereferenceable || Kind == kw_invariant ||
233 Kind == StringConstant;
234 }
235
236 bool is(TokenKind K) const { return Kind == K; }
237
238 bool isNot(TokenKind K) const { return Kind != K; }
239
240 StringRef::iterator location() const { return Range.begin(); }
241
242 StringRef range() const { return Range; }
243
244 /// Return the token's string value.
245 StringRef stringValue() const { return StringValue; }
246
247 const APSInt &integerValue() const { return IntVal; }
248
249 bool hasIntegerValue() const {
250 return Kind == IntegerLiteral || Kind == MachineBasicBlock ||
251 Kind == MachineBasicBlockLabel || Kind == StackObject ||
252 Kind == FixedStackObject || Kind == GlobalValue ||
253 Kind == VirtualRegister || Kind == ConstantPoolItem ||
254 Kind == JumpTableIndex || Kind == IRBlock || Kind == IRValue;
255 }
256};
257
258/// Consume a single machine instruction token in the given source and return
259/// the remaining source string.
260StringRef lexMIToken(
261 StringRef Source, MIToken &Token,
262 function_ref<void(StringRef::iterator, const Twine &)> ErrorCallback);
263
264} // end namespace llvm
265
266#endif // LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
267