xref: /aosp_15_r20/external/llvm/lib/CodeGen/MIRParser/MILexer.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- MILexer.h - Lexer for machine instructions -------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file declares the function that lexes the machine instruction source
11*9880d681SAndroid Build Coastguard Worker // string.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
16*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/APSInt.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
21*9880d681SAndroid Build Coastguard Worker #include <functional>
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker namespace llvm {
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker class Twine;
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker /// A token produced by the machine instruction lexer.
28*9880d681SAndroid Build Coastguard Worker struct MIToken {
29*9880d681SAndroid Build Coastguard Worker   enum TokenKind {
30*9880d681SAndroid Build Coastguard Worker     // Markers
31*9880d681SAndroid Build Coastguard Worker     Eof,
32*9880d681SAndroid Build Coastguard Worker     Error,
33*9880d681SAndroid Build Coastguard Worker     Newline,
34*9880d681SAndroid Build Coastguard Worker 
35*9880d681SAndroid Build Coastguard Worker     // Tokens with no info.
36*9880d681SAndroid Build Coastguard Worker     comma,
37*9880d681SAndroid Build Coastguard Worker     equal,
38*9880d681SAndroid Build Coastguard Worker     underscore,
39*9880d681SAndroid Build Coastguard Worker     colon,
40*9880d681SAndroid Build Coastguard Worker     coloncolon,
41*9880d681SAndroid Build Coastguard Worker     exclaim,
42*9880d681SAndroid Build Coastguard Worker     lparen,
43*9880d681SAndroid Build Coastguard Worker     rparen,
44*9880d681SAndroid Build Coastguard Worker     lbrace,
45*9880d681SAndroid Build Coastguard Worker     rbrace,
46*9880d681SAndroid Build Coastguard Worker     plus,
47*9880d681SAndroid Build Coastguard Worker     minus,
48*9880d681SAndroid Build Coastguard Worker     less,
49*9880d681SAndroid Build Coastguard Worker     greater,
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker     // Keywords
52*9880d681SAndroid Build Coastguard Worker     kw_implicit,
53*9880d681SAndroid Build Coastguard Worker     kw_implicit_define,
54*9880d681SAndroid Build Coastguard Worker     kw_def,
55*9880d681SAndroid Build Coastguard Worker     kw_dead,
56*9880d681SAndroid Build Coastguard Worker     kw_killed,
57*9880d681SAndroid Build Coastguard Worker     kw_undef,
58*9880d681SAndroid Build Coastguard Worker     kw_internal,
59*9880d681SAndroid Build Coastguard Worker     kw_early_clobber,
60*9880d681SAndroid Build Coastguard Worker     kw_debug_use,
61*9880d681SAndroid Build Coastguard Worker     kw_tied_def,
62*9880d681SAndroid Build Coastguard Worker     kw_frame_setup,
63*9880d681SAndroid Build Coastguard Worker     kw_debug_location,
64*9880d681SAndroid Build Coastguard Worker     kw_cfi_same_value,
65*9880d681SAndroid Build Coastguard Worker     kw_cfi_offset,
66*9880d681SAndroid Build Coastguard Worker     kw_cfi_def_cfa_register,
67*9880d681SAndroid Build Coastguard Worker     kw_cfi_def_cfa_offset,
68*9880d681SAndroid Build Coastguard Worker     kw_cfi_def_cfa,
69*9880d681SAndroid Build Coastguard Worker     kw_blockaddress,
70*9880d681SAndroid Build Coastguard Worker     kw_target_index,
71*9880d681SAndroid Build Coastguard Worker     kw_half,
72*9880d681SAndroid Build Coastguard Worker     kw_float,
73*9880d681SAndroid Build Coastguard Worker     kw_double,
74*9880d681SAndroid Build Coastguard Worker     kw_x86_fp80,
75*9880d681SAndroid Build Coastguard Worker     kw_fp128,
76*9880d681SAndroid Build Coastguard Worker     kw_ppc_fp128,
77*9880d681SAndroid Build Coastguard Worker     kw_target_flags,
78*9880d681SAndroid Build Coastguard Worker     kw_volatile,
79*9880d681SAndroid Build Coastguard Worker     kw_non_temporal,
80*9880d681SAndroid Build Coastguard Worker     kw_invariant,
81*9880d681SAndroid Build Coastguard Worker     kw_align,
82*9880d681SAndroid Build Coastguard Worker     kw_stack,
83*9880d681SAndroid Build Coastguard Worker     kw_got,
84*9880d681SAndroid Build Coastguard Worker     kw_jump_table,
85*9880d681SAndroid Build Coastguard Worker     kw_constant_pool,
86*9880d681SAndroid Build Coastguard Worker     kw_call_entry,
87*9880d681SAndroid Build Coastguard Worker     kw_liveout,
88*9880d681SAndroid Build Coastguard Worker     kw_address_taken,
89*9880d681SAndroid Build Coastguard Worker     kw_landing_pad,
90*9880d681SAndroid Build Coastguard Worker     kw_liveins,
91*9880d681SAndroid Build Coastguard Worker     kw_successors,
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker     // Named metadata keywords
94*9880d681SAndroid Build Coastguard Worker     md_tbaa,
95*9880d681SAndroid Build Coastguard Worker     md_alias_scope,
96*9880d681SAndroid Build Coastguard Worker     md_noalias,
97*9880d681SAndroid Build Coastguard Worker     md_range,
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker     // Identifier tokens
100*9880d681SAndroid Build Coastguard Worker     Identifier,
101*9880d681SAndroid Build Coastguard Worker     IntegerType,
102*9880d681SAndroid Build Coastguard Worker     NamedRegister,
103*9880d681SAndroid Build Coastguard Worker     MachineBasicBlockLabel,
104*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock,
105*9880d681SAndroid Build Coastguard Worker     StackObject,
106*9880d681SAndroid Build Coastguard Worker     FixedStackObject,
107*9880d681SAndroid Build Coastguard Worker     NamedGlobalValue,
108*9880d681SAndroid Build Coastguard Worker     GlobalValue,
109*9880d681SAndroid Build Coastguard Worker     ExternalSymbol,
110*9880d681SAndroid Build Coastguard Worker 
111*9880d681SAndroid Build Coastguard Worker     // Other tokens
112*9880d681SAndroid Build Coastguard Worker     IntegerLiteral,
113*9880d681SAndroid Build Coastguard Worker     FloatingPointLiteral,
114*9880d681SAndroid Build Coastguard Worker     VirtualRegister,
115*9880d681SAndroid Build Coastguard Worker     ConstantPoolItem,
116*9880d681SAndroid Build Coastguard Worker     JumpTableIndex,
117*9880d681SAndroid Build Coastguard Worker     NamedIRBlock,
118*9880d681SAndroid Build Coastguard Worker     IRBlock,
119*9880d681SAndroid Build Coastguard Worker     NamedIRValue,
120*9880d681SAndroid Build Coastguard Worker     IRValue,
121*9880d681SAndroid Build Coastguard Worker     QuotedIRValue, // `<constant value>`
122*9880d681SAndroid Build Coastguard Worker     SubRegisterIndex
123*9880d681SAndroid Build Coastguard Worker   };
124*9880d681SAndroid Build Coastguard Worker 
125*9880d681SAndroid Build Coastguard Worker private:
126*9880d681SAndroid Build Coastguard Worker   TokenKind Kind;
127*9880d681SAndroid Build Coastguard Worker   StringRef Range;
128*9880d681SAndroid Build Coastguard Worker   StringRef StringValue;
129*9880d681SAndroid Build Coastguard Worker   std::string StringValueStorage;
130*9880d681SAndroid Build Coastguard Worker   APSInt IntVal;
131*9880d681SAndroid Build Coastguard Worker 
132*9880d681SAndroid Build Coastguard Worker public:
MITokenMIToken133*9880d681SAndroid Build Coastguard Worker   MIToken() : Kind(Error) {}
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker   MIToken &reset(TokenKind Kind, StringRef Range);
136*9880d681SAndroid Build Coastguard Worker 
137*9880d681SAndroid Build Coastguard Worker   MIToken &setStringValue(StringRef StrVal);
138*9880d681SAndroid Build Coastguard Worker   MIToken &setOwnedStringValue(std::string StrVal);
139*9880d681SAndroid Build Coastguard Worker   MIToken &setIntegerValue(APSInt IntVal);
140*9880d681SAndroid Build Coastguard Worker 
kindMIToken141*9880d681SAndroid Build Coastguard Worker   TokenKind kind() const { return Kind; }
142*9880d681SAndroid Build Coastguard Worker 
isErrorMIToken143*9880d681SAndroid Build Coastguard Worker   bool isError() const { return Kind == Error; }
144*9880d681SAndroid Build Coastguard Worker 
isNewlineOrEOFMIToken145*9880d681SAndroid Build Coastguard Worker   bool isNewlineOrEOF() const { return Kind == Newline || Kind == Eof; }
146*9880d681SAndroid Build Coastguard Worker 
isErrorOrEOFMIToken147*9880d681SAndroid Build Coastguard Worker   bool isErrorOrEOF() const { return Kind == Error || Kind == Eof; }
148*9880d681SAndroid Build Coastguard Worker 
isRegisterMIToken149*9880d681SAndroid Build Coastguard Worker   bool isRegister() const {
150*9880d681SAndroid Build Coastguard Worker     return Kind == NamedRegister || Kind == underscore ||
151*9880d681SAndroid Build Coastguard Worker            Kind == VirtualRegister;
152*9880d681SAndroid Build Coastguard Worker   }
153*9880d681SAndroid Build Coastguard Worker 
isRegisterFlagMIToken154*9880d681SAndroid Build Coastguard Worker   bool isRegisterFlag() const {
155*9880d681SAndroid Build Coastguard Worker     return Kind == kw_implicit || Kind == kw_implicit_define ||
156*9880d681SAndroid Build Coastguard Worker            Kind == kw_def || Kind == kw_dead || Kind == kw_killed ||
157*9880d681SAndroid Build Coastguard Worker            Kind == kw_undef || Kind == kw_internal ||
158*9880d681SAndroid Build Coastguard Worker            Kind == kw_early_clobber || Kind == kw_debug_use;
159*9880d681SAndroid Build Coastguard Worker   }
160*9880d681SAndroid Build Coastguard Worker 
isMemoryOperandFlagMIToken161*9880d681SAndroid Build Coastguard Worker   bool isMemoryOperandFlag() const {
162*9880d681SAndroid Build Coastguard Worker     return Kind == kw_volatile || Kind == kw_non_temporal ||
163*9880d681SAndroid Build Coastguard Worker            Kind == kw_invariant;
164*9880d681SAndroid Build Coastguard Worker   }
165*9880d681SAndroid Build Coastguard Worker 
isMIToken166*9880d681SAndroid Build Coastguard Worker   bool is(TokenKind K) const { return Kind == K; }
167*9880d681SAndroid Build Coastguard Worker 
isNotMIToken168*9880d681SAndroid Build Coastguard Worker   bool isNot(TokenKind K) const { return Kind != K; }
169*9880d681SAndroid Build Coastguard Worker 
locationMIToken170*9880d681SAndroid Build Coastguard Worker   StringRef::iterator location() const { return Range.begin(); }
171*9880d681SAndroid Build Coastguard Worker 
rangeMIToken172*9880d681SAndroid Build Coastguard Worker   StringRef range() const { return Range; }
173*9880d681SAndroid Build Coastguard Worker 
174*9880d681SAndroid Build Coastguard Worker   /// Return the token's string value.
stringValueMIToken175*9880d681SAndroid Build Coastguard Worker   StringRef stringValue() const { return StringValue; }
176*9880d681SAndroid Build Coastguard Worker 
integerValueMIToken177*9880d681SAndroid Build Coastguard Worker   const APSInt &integerValue() const { return IntVal; }
178*9880d681SAndroid Build Coastguard Worker 
hasIntegerValueMIToken179*9880d681SAndroid Build Coastguard Worker   bool hasIntegerValue() const {
180*9880d681SAndroid Build Coastguard Worker     return Kind == IntegerLiteral || Kind == MachineBasicBlock ||
181*9880d681SAndroid Build Coastguard Worker            Kind == MachineBasicBlockLabel || Kind == StackObject ||
182*9880d681SAndroid Build Coastguard Worker            Kind == FixedStackObject || Kind == GlobalValue ||
183*9880d681SAndroid Build Coastguard Worker            Kind == VirtualRegister || Kind == ConstantPoolItem ||
184*9880d681SAndroid Build Coastguard Worker            Kind == JumpTableIndex || Kind == IRBlock || Kind == IRValue;
185*9880d681SAndroid Build Coastguard Worker   }
186*9880d681SAndroid Build Coastguard Worker };
187*9880d681SAndroid Build Coastguard Worker 
188*9880d681SAndroid Build Coastguard Worker /// Consume a single machine instruction token in the given source and return
189*9880d681SAndroid Build Coastguard Worker /// the remaining source string.
190*9880d681SAndroid Build Coastguard Worker StringRef lexMIToken(
191*9880d681SAndroid Build Coastguard Worker     StringRef Source, MIToken &Token,
192*9880d681SAndroid Build Coastguard Worker     function_ref<void(StringRef::iterator, const Twine &)> ErrorCallback);
193*9880d681SAndroid Build Coastguard Worker 
194*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
195*9880d681SAndroid Build Coastguard Worker 
196*9880d681SAndroid Build Coastguard Worker #endif
197