106f32e7eSjoerg //===- MILexer.h - Lexer for machine instructions ---------------*- C++ -*-===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg // This file declares the function that lexes the machine instruction source
1006f32e7eSjoerg // string.
1106f32e7eSjoerg //
1206f32e7eSjoerg //===----------------------------------------------------------------------===//
1306f32e7eSjoerg 
1406f32e7eSjoerg #ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
1506f32e7eSjoerg #define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
1606f32e7eSjoerg 
1706f32e7eSjoerg #include "llvm/ADT/APSInt.h"
1806f32e7eSjoerg #include "llvm/ADT/StringRef.h"
1906f32e7eSjoerg #include <string>
2006f32e7eSjoerg 
2106f32e7eSjoerg namespace llvm {
2206f32e7eSjoerg 
2306f32e7eSjoerg class Twine;
2406f32e7eSjoerg 
2506f32e7eSjoerg /// A token produced by the machine instruction lexer.
2606f32e7eSjoerg struct MIToken {
2706f32e7eSjoerg   enum TokenKind {
2806f32e7eSjoerg     // Markers
2906f32e7eSjoerg     Eof,
3006f32e7eSjoerg     Error,
3106f32e7eSjoerg     Newline,
3206f32e7eSjoerg 
3306f32e7eSjoerg     // Tokens with no info.
3406f32e7eSjoerg     comma,
3506f32e7eSjoerg     equal,
3606f32e7eSjoerg     underscore,
3706f32e7eSjoerg     colon,
3806f32e7eSjoerg     coloncolon,
3906f32e7eSjoerg     dot,
4006f32e7eSjoerg     exclaim,
4106f32e7eSjoerg     lparen,
4206f32e7eSjoerg     rparen,
4306f32e7eSjoerg     lbrace,
4406f32e7eSjoerg     rbrace,
4506f32e7eSjoerg     plus,
4606f32e7eSjoerg     minus,
4706f32e7eSjoerg     less,
4806f32e7eSjoerg     greater,
4906f32e7eSjoerg 
5006f32e7eSjoerg     // Keywords
5106f32e7eSjoerg     kw_implicit,
5206f32e7eSjoerg     kw_implicit_define,
5306f32e7eSjoerg     kw_def,
5406f32e7eSjoerg     kw_dead,
5506f32e7eSjoerg     kw_dereferenceable,
5606f32e7eSjoerg     kw_killed,
5706f32e7eSjoerg     kw_undef,
5806f32e7eSjoerg     kw_internal,
5906f32e7eSjoerg     kw_early_clobber,
6006f32e7eSjoerg     kw_debug_use,
6106f32e7eSjoerg     kw_renamable,
6206f32e7eSjoerg     kw_tied_def,
6306f32e7eSjoerg     kw_frame_setup,
6406f32e7eSjoerg     kw_frame_destroy,
6506f32e7eSjoerg     kw_nnan,
6606f32e7eSjoerg     kw_ninf,
6706f32e7eSjoerg     kw_nsz,
6806f32e7eSjoerg     kw_arcp,
6906f32e7eSjoerg     kw_contract,
7006f32e7eSjoerg     kw_afn,
7106f32e7eSjoerg     kw_reassoc,
7206f32e7eSjoerg     kw_nuw,
7306f32e7eSjoerg     kw_nsw,
7406f32e7eSjoerg     kw_exact,
75*da58b97aSjoerg     kw_nofpexcept,
7606f32e7eSjoerg     kw_debug_location,
77*da58b97aSjoerg     kw_debug_instr_number,
7806f32e7eSjoerg     kw_cfi_same_value,
7906f32e7eSjoerg     kw_cfi_offset,
8006f32e7eSjoerg     kw_cfi_rel_offset,
8106f32e7eSjoerg     kw_cfi_def_cfa_register,
8206f32e7eSjoerg     kw_cfi_def_cfa_offset,
8306f32e7eSjoerg     kw_cfi_adjust_cfa_offset,
8406f32e7eSjoerg     kw_cfi_escape,
8506f32e7eSjoerg     kw_cfi_def_cfa,
8606f32e7eSjoerg     kw_cfi_register,
8706f32e7eSjoerg     kw_cfi_remember_state,
8806f32e7eSjoerg     kw_cfi_restore,
8906f32e7eSjoerg     kw_cfi_restore_state,
9006f32e7eSjoerg     kw_cfi_undefined,
9106f32e7eSjoerg     kw_cfi_window_save,
9206f32e7eSjoerg     kw_cfi_aarch64_negate_ra_sign_state,
9306f32e7eSjoerg     kw_blockaddress,
9406f32e7eSjoerg     kw_intrinsic,
9506f32e7eSjoerg     kw_target_index,
9606f32e7eSjoerg     kw_half,
9706f32e7eSjoerg     kw_float,
9806f32e7eSjoerg     kw_double,
9906f32e7eSjoerg     kw_x86_fp80,
10006f32e7eSjoerg     kw_fp128,
10106f32e7eSjoerg     kw_ppc_fp128,
10206f32e7eSjoerg     kw_target_flags,
10306f32e7eSjoerg     kw_volatile,
10406f32e7eSjoerg     kw_non_temporal,
10506f32e7eSjoerg     kw_invariant,
10606f32e7eSjoerg     kw_align,
107*da58b97aSjoerg     kw_basealign,
10806f32e7eSjoerg     kw_addrspace,
10906f32e7eSjoerg     kw_stack,
11006f32e7eSjoerg     kw_got,
11106f32e7eSjoerg     kw_jump_table,
11206f32e7eSjoerg     kw_constant_pool,
11306f32e7eSjoerg     kw_call_entry,
114*da58b97aSjoerg     kw_custom,
11506f32e7eSjoerg     kw_liveout,
11606f32e7eSjoerg     kw_address_taken,
11706f32e7eSjoerg     kw_landing_pad,
118*da58b97aSjoerg     kw_ehfunclet_entry,
11906f32e7eSjoerg     kw_liveins,
12006f32e7eSjoerg     kw_successors,
12106f32e7eSjoerg     kw_floatpred,
12206f32e7eSjoerg     kw_intpred,
12306f32e7eSjoerg     kw_shufflemask,
12406f32e7eSjoerg     kw_pre_instr_symbol,
12506f32e7eSjoerg     kw_post_instr_symbol,
126*da58b97aSjoerg     kw_heap_alloc_marker,
127*da58b97aSjoerg     kw_bbsections,
12806f32e7eSjoerg     kw_unknown_size,
129*da58b97aSjoerg     kw_unknown_address,
13006f32e7eSjoerg 
13106f32e7eSjoerg     // Named metadata keywords
13206f32e7eSjoerg     md_tbaa,
13306f32e7eSjoerg     md_alias_scope,
13406f32e7eSjoerg     md_noalias,
13506f32e7eSjoerg     md_range,
13606f32e7eSjoerg     md_diexpr,
13706f32e7eSjoerg     md_dilocation,
13806f32e7eSjoerg 
13906f32e7eSjoerg     // Identifier tokens
14006f32e7eSjoerg     Identifier,
14106f32e7eSjoerg     NamedRegister,
14206f32e7eSjoerg     NamedVirtualRegister,
14306f32e7eSjoerg     MachineBasicBlockLabel,
14406f32e7eSjoerg     MachineBasicBlock,
14506f32e7eSjoerg     StackObject,
14606f32e7eSjoerg     FixedStackObject,
14706f32e7eSjoerg     NamedGlobalValue,
14806f32e7eSjoerg     GlobalValue,
14906f32e7eSjoerg     ExternalSymbol,
15006f32e7eSjoerg     MCSymbol,
15106f32e7eSjoerg 
15206f32e7eSjoerg     // Other tokens
15306f32e7eSjoerg     IntegerLiteral,
15406f32e7eSjoerg     FloatingPointLiteral,
15506f32e7eSjoerg     HexLiteral,
15606f32e7eSjoerg     VectorLiteral,
15706f32e7eSjoerg     VirtualRegister,
15806f32e7eSjoerg     ConstantPoolItem,
15906f32e7eSjoerg     JumpTableIndex,
16006f32e7eSjoerg     NamedIRBlock,
16106f32e7eSjoerg     IRBlock,
16206f32e7eSjoerg     NamedIRValue,
16306f32e7eSjoerg     IRValue,
16406f32e7eSjoerg     QuotedIRValue, // `<constant value>`
16506f32e7eSjoerg     SubRegisterIndex,
16606f32e7eSjoerg     StringConstant
16706f32e7eSjoerg   };
16806f32e7eSjoerg 
16906f32e7eSjoerg private:
17006f32e7eSjoerg   TokenKind Kind = Error;
17106f32e7eSjoerg   StringRef Range;
17206f32e7eSjoerg   StringRef StringValue;
17306f32e7eSjoerg   std::string StringValueStorage;
17406f32e7eSjoerg   APSInt IntVal;
17506f32e7eSjoerg 
17606f32e7eSjoerg public:
17706f32e7eSjoerg   MIToken() = default;
17806f32e7eSjoerg 
17906f32e7eSjoerg   MIToken &reset(TokenKind Kind, StringRef Range);
18006f32e7eSjoerg 
18106f32e7eSjoerg   MIToken &setStringValue(StringRef StrVal);
18206f32e7eSjoerg   MIToken &setOwnedStringValue(std::string StrVal);
18306f32e7eSjoerg   MIToken &setIntegerValue(APSInt IntVal);
18406f32e7eSjoerg 
kindMIToken18506f32e7eSjoerg   TokenKind kind() const { return Kind; }
18606f32e7eSjoerg 
isErrorMIToken18706f32e7eSjoerg   bool isError() const { return Kind == Error; }
18806f32e7eSjoerg 
isNewlineOrEOFMIToken18906f32e7eSjoerg   bool isNewlineOrEOF() const { return Kind == Newline || Kind == Eof; }
19006f32e7eSjoerg 
isErrorOrEOFMIToken19106f32e7eSjoerg   bool isErrorOrEOF() const { return Kind == Error || Kind == Eof; }
19206f32e7eSjoerg 
isRegisterMIToken19306f32e7eSjoerg   bool isRegister() const {
19406f32e7eSjoerg     return Kind == NamedRegister || Kind == underscore ||
19506f32e7eSjoerg            Kind == NamedVirtualRegister || Kind == VirtualRegister;
19606f32e7eSjoerg   }
19706f32e7eSjoerg 
isRegisterFlagMIToken19806f32e7eSjoerg   bool isRegisterFlag() const {
19906f32e7eSjoerg     return Kind == kw_implicit || Kind == kw_implicit_define ||
20006f32e7eSjoerg            Kind == kw_def || Kind == kw_dead || Kind == kw_killed ||
20106f32e7eSjoerg            Kind == kw_undef || Kind == kw_internal ||
20206f32e7eSjoerg            Kind == kw_early_clobber || Kind == kw_debug_use ||
20306f32e7eSjoerg            Kind == kw_renamable;
20406f32e7eSjoerg   }
20506f32e7eSjoerg 
isMemoryOperandFlagMIToken20606f32e7eSjoerg   bool isMemoryOperandFlag() const {
20706f32e7eSjoerg     return Kind == kw_volatile || Kind == kw_non_temporal ||
20806f32e7eSjoerg            Kind == kw_dereferenceable || Kind == kw_invariant ||
20906f32e7eSjoerg            Kind == StringConstant;
21006f32e7eSjoerg   }
21106f32e7eSjoerg 
isMIToken21206f32e7eSjoerg   bool is(TokenKind K) const { return Kind == K; }
21306f32e7eSjoerg 
isNotMIToken21406f32e7eSjoerg   bool isNot(TokenKind K) const { return Kind != K; }
21506f32e7eSjoerg 
locationMIToken21606f32e7eSjoerg   StringRef::iterator location() const { return Range.begin(); }
21706f32e7eSjoerg 
rangeMIToken21806f32e7eSjoerg   StringRef range() const { return Range; }
21906f32e7eSjoerg 
22006f32e7eSjoerg   /// Return the token's string value.
stringValueMIToken22106f32e7eSjoerg   StringRef stringValue() const { return StringValue; }
22206f32e7eSjoerg 
integerValueMIToken22306f32e7eSjoerg   const APSInt &integerValue() const { return IntVal; }
22406f32e7eSjoerg 
hasIntegerValueMIToken22506f32e7eSjoerg   bool hasIntegerValue() const {
22606f32e7eSjoerg     return Kind == IntegerLiteral || Kind == MachineBasicBlock ||
22706f32e7eSjoerg            Kind == MachineBasicBlockLabel || Kind == StackObject ||
22806f32e7eSjoerg            Kind == FixedStackObject || Kind == GlobalValue ||
22906f32e7eSjoerg            Kind == VirtualRegister || Kind == ConstantPoolItem ||
23006f32e7eSjoerg            Kind == JumpTableIndex || Kind == IRBlock || Kind == IRValue;
23106f32e7eSjoerg   }
23206f32e7eSjoerg };
23306f32e7eSjoerg 
23406f32e7eSjoerg /// Consume a single machine instruction token in the given source and return
23506f32e7eSjoerg /// the remaining source string.
23606f32e7eSjoerg StringRef lexMIToken(
23706f32e7eSjoerg     StringRef Source, MIToken &Token,
23806f32e7eSjoerg     function_ref<void(StringRef::iterator, const Twine &)> ErrorCallback);
23906f32e7eSjoerg 
24006f32e7eSjoerg } // end namespace llvm
24106f32e7eSjoerg 
24206f32e7eSjoerg #endif // LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
243