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 kw_mmra,
151
152 // Metadata types.
153 kw_distinct,
154
155 // Named metadata keywords
156 md_tbaa,
157 md_alias_scope,
158 md_noalias,
159 md_noalias_addrspace,
160 md_range,
161 md_diexpr,
162 md_dilocation,
163
164 // Identifier tokens
165 Identifier,
166 NamedRegister,
167 NamedVirtualRegister,
168 MachineBasicBlockLabel,
169 MachineBasicBlock,
170 StackObject,
171 FixedStackObject,
172 NamedGlobalValue,
173 GlobalValue,
174 ExternalSymbol,
175 MCSymbol,
176
177 // Other tokens
178 IntegerLiteral,
179 FloatingPointLiteral,
180 HexLiteral,
181 VectorLiteral,
182 VirtualRegister,
183 ConstantPoolItem,
184 JumpTableIndex,
185 NamedIRBlock,
186 IRBlock,
187 NamedIRValue,
188 IRValue,
189 QuotedIRValue, // `<constant value>`
190 SubRegisterIndex,
191 StringConstant
192 };
193
194private:
195 TokenKind Kind = Error;
196 StringRef Range;
197 StringRef StringValue;
198 std::string StringValueStorage;
199 APSInt IntVal;
200
201public:
202 MIToken() = default;
203
204 MIToken &reset(TokenKind Kind, StringRef Range);
205
206 MIToken &setStringValue(StringRef StrVal);
207 MIToken &setOwnedStringValue(std::string StrVal);
208 MIToken &setIntegerValue(APSInt IntVal);
209
210 TokenKind kind() const { return Kind; }
211
212 bool isError() const { return Kind == Error; }
213
214 bool isNewlineOrEOF() const { return Kind == Newline || Kind == Eof; }
215
216 bool isErrorOrEOF() const { return Kind == Error || Kind == Eof; }
217
218 bool isRegister() const {
219 return Kind == NamedRegister || Kind == underscore ||
220 Kind == NamedVirtualRegister || Kind == VirtualRegister;
221 }
222
223 bool isRegisterFlag() const {
224 return Kind == kw_implicit || Kind == kw_implicit_define ||
225 Kind == kw_def || Kind == kw_dead || Kind == kw_killed ||
226 Kind == kw_undef || Kind == kw_internal ||
227 Kind == kw_early_clobber || Kind == kw_debug_use ||
228 Kind == kw_renamable;
229 }
230
231 bool isMemoryOperandFlag() const {
232 return Kind == kw_volatile || Kind == kw_non_temporal ||
233 Kind == kw_dereferenceable || Kind == kw_invariant ||
234 Kind == StringConstant;
235 }
236
237 bool is(TokenKind K) const { return Kind == K; }
238
239 bool isNot(TokenKind K) const { return Kind != K; }
240
241 StringRef::iterator location() const { return Range.begin(); }
242
243 StringRef range() const { return Range; }
244
245 /// Return the token's string value.
246 StringRef stringValue() const { return StringValue; }
247
248 const APSInt &integerValue() const { return IntVal; }
249
250 bool hasIntegerValue() const {
251 return Kind == IntegerLiteral || Kind == MachineBasicBlock ||
252 Kind == MachineBasicBlockLabel || Kind == StackObject ||
253 Kind == FixedStackObject || Kind == GlobalValue ||
254 Kind == VirtualRegister || Kind == ConstantPoolItem ||
255 Kind == JumpTableIndex || Kind == IRBlock || Kind == IRValue;
256 }
257};
258
259/// Consume a single machine instruction token in the given source and return
260/// the remaining source string.
261StringRef lexMIToken(
262 StringRef Source, MIToken &Token,
263 function_ref<void(StringRef::iterator, const Twine &)> ErrorCallback);
264
265} // end namespace llvm
266
267#endif // LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
268