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