1 //===- MILexer.h - Lexer for machine instructions ---------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares the function that lexes the machine instruction source
11 // string.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
16 #define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
17 
18 #include "llvm/ADT/APSInt.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/StringRef.h"
21 #include <string>
22 
23 namespace llvm {
24 
25 class Twine;
26 
27 /// A token produced by the machine instruction lexer.
28 struct MIToken {
29   enum TokenKind {
30     // Markers
31     Eof,
32     Error,
33     Newline,
34 
35     // Tokens with no info.
36     comma,
37     equal,
38     underscore,
39     colon,
40     coloncolon,
41     dot,
42     exclaim,
43     lparen,
44     rparen,
45     lbrace,
46     rbrace,
47     plus,
48     minus,
49     less,
50     greater,
51 
52     // Keywords
53     kw_implicit,
54     kw_implicit_define,
55     kw_def,
56     kw_dead,
57     kw_dereferenceable,
58     kw_killed,
59     kw_undef,
60     kw_internal,
61     kw_early_clobber,
62     kw_debug_use,
63     kw_renamable,
64     kw_tied_def,
65     kw_frame_setup,
66     kw_frame_destroy,
67     kw_nnan,
68     kw_ninf,
69     kw_nsz,
70     kw_arcp,
71     kw_contract,
72     kw_afn,
73     kw_reassoc,
74     kw_debug_location,
75     kw_cfi_same_value,
76     kw_cfi_offset,
77     kw_cfi_rel_offset,
78     kw_cfi_def_cfa_register,
79     kw_cfi_def_cfa_offset,
80     kw_cfi_adjust_cfa_offset,
81     kw_cfi_escape,
82     kw_cfi_def_cfa,
83     kw_cfi_register,
84     kw_cfi_remember_state,
85     kw_cfi_restore,
86     kw_cfi_restore_state,
87     kw_cfi_undefined,
88     kw_cfi_window_save,
89     kw_blockaddress,
90     kw_intrinsic,
91     kw_target_index,
92     kw_half,
93     kw_float,
94     kw_double,
95     kw_x86_fp80,
96     kw_fp128,
97     kw_ppc_fp128,
98     kw_target_flags,
99     kw_volatile,
100     kw_non_temporal,
101     kw_invariant,
102     kw_align,
103     kw_addrspace,
104     kw_stack,
105     kw_got,
106     kw_jump_table,
107     kw_constant_pool,
108     kw_call_entry,
109     kw_liveout,
110     kw_address_taken,
111     kw_landing_pad,
112     kw_liveins,
113     kw_successors,
114     kw_floatpred,
115     kw_intpred,
116 
117     // Named metadata keywords
118     md_tbaa,
119     md_alias_scope,
120     md_noalias,
121     md_range,
122     md_diexpr,
123 
124     // Identifier tokens
125     Identifier,
126     NamedRegister,
127     NamedVirtualRegister,
128     MachineBasicBlockLabel,
129     MachineBasicBlock,
130     StackObject,
131     FixedStackObject,
132     NamedGlobalValue,
133     GlobalValue,
134     ExternalSymbol,
135 
136     // Other tokens
137     IntegerLiteral,
138     FloatingPointLiteral,
139     HexLiteral,
140     VirtualRegister,
141     ConstantPoolItem,
142     JumpTableIndex,
143     NamedIRBlock,
144     IRBlock,
145     NamedIRValue,
146     IRValue,
147     QuotedIRValue, // `<constant value>`
148     SubRegisterIndex,
149     StringConstant
150   };
151 
152 private:
153   TokenKind Kind = Error;
154   StringRef Range;
155   StringRef StringValue;
156   std::string StringValueStorage;
157   APSInt IntVal;
158 
159 public:
160   MIToken() = default;
161 
162   MIToken &reset(TokenKind Kind, StringRef Range);
163 
164   MIToken &setStringValue(StringRef StrVal);
165   MIToken &setOwnedStringValue(std::string StrVal);
166   MIToken &setIntegerValue(APSInt IntVal);
167 
kindMIToken168   TokenKind kind() const { return Kind; }
169 
isErrorMIToken170   bool isError() const { return Kind == Error; }
171 
isNewlineOrEOFMIToken172   bool isNewlineOrEOF() const { return Kind == Newline || Kind == Eof; }
173 
isErrorOrEOFMIToken174   bool isErrorOrEOF() const { return Kind == Error || Kind == Eof; }
175 
isRegisterMIToken176   bool isRegister() const {
177     return Kind == NamedRegister || Kind == underscore ||
178            Kind == NamedVirtualRegister || Kind == VirtualRegister;
179   }
180 
isRegisterFlagMIToken181   bool isRegisterFlag() const {
182     return Kind == kw_implicit || Kind == kw_implicit_define ||
183            Kind == kw_def || Kind == kw_dead || Kind == kw_killed ||
184            Kind == kw_undef || Kind == kw_internal ||
185            Kind == kw_early_clobber || Kind == kw_debug_use ||
186            Kind == kw_renamable;
187   }
188 
isMemoryOperandFlagMIToken189   bool isMemoryOperandFlag() const {
190     return Kind == kw_volatile || Kind == kw_non_temporal ||
191            Kind == kw_dereferenceable || Kind == kw_invariant ||
192            Kind == StringConstant;
193   }
194 
isMIToken195   bool is(TokenKind K) const { return Kind == K; }
196 
isNotMIToken197   bool isNot(TokenKind K) const { return Kind != K; }
198 
locationMIToken199   StringRef::iterator location() const { return Range.begin(); }
200 
rangeMIToken201   StringRef range() const { return Range; }
202 
203   /// Return the token's string value.
stringValueMIToken204   StringRef stringValue() const { return StringValue; }
205 
integerValueMIToken206   const APSInt &integerValue() const { return IntVal; }
207 
hasIntegerValueMIToken208   bool hasIntegerValue() const {
209     return Kind == IntegerLiteral || Kind == MachineBasicBlock ||
210            Kind == MachineBasicBlockLabel || Kind == StackObject ||
211            Kind == FixedStackObject || Kind == GlobalValue ||
212            Kind == VirtualRegister || Kind == ConstantPoolItem ||
213            Kind == JumpTableIndex || Kind == IRBlock || Kind == IRValue;
214   }
215 };
216 
217 /// Consume a single machine instruction token in the given source and return
218 /// the remaining source string.
219 StringRef lexMIToken(
220     StringRef Source, MIToken &Token,
221     function_ref<void(StringRef::iterator, const Twine &)> ErrorCallback);
222 
223 } // end namespace llvm
224 
225 #endif // LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
226