diff options
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser/MILexer.h')
| -rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h new file mode 100644 index 0000000000000..200f9d026cc8a --- /dev/null +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -0,0 +1,236 @@ +//===- MILexer.h - Lexer for machine instructions ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file declares the function that lexes the machine instruction source +// string. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H +#define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H + +#include "llvm/ADT/APSInt.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringRef.h" +#include <string> + +namespace llvm { + +class Twine; + +/// A token produced by the machine instruction lexer. +struct MIToken { + enum TokenKind { + // Markers + Eof, + Error, + Newline, + + // Tokens with no info. + comma, + equal, + underscore, + colon, + coloncolon, + dot, + exclaim, + lparen, + rparen, + lbrace, + rbrace, + plus, + minus, + less, + greater, + + // Keywords + kw_implicit, + kw_implicit_define, + kw_def, + kw_dead, + kw_dereferenceable, + kw_killed, + kw_undef, + kw_internal, + kw_early_clobber, + kw_debug_use, + kw_renamable, + kw_tied_def, + kw_frame_setup, + kw_frame_destroy, + kw_nnan, + kw_ninf, + kw_nsz, + kw_arcp, + kw_contract, + kw_afn, + kw_reassoc, + kw_nuw, + kw_nsw, + kw_exact, + kw_fpexcept, + kw_debug_location, + kw_cfi_same_value, + kw_cfi_offset, + kw_cfi_rel_offset, + kw_cfi_def_cfa_register, + kw_cfi_def_cfa_offset, + kw_cfi_adjust_cfa_offset, + kw_cfi_escape, + kw_cfi_def_cfa, + kw_cfi_register, + kw_cfi_remember_state, + kw_cfi_restore, + kw_cfi_restore_state, + kw_cfi_undefined, + kw_cfi_window_save, + kw_cfi_aarch64_negate_ra_sign_state, + kw_blockaddress, + kw_intrinsic, + kw_target_index, + kw_half, + kw_float, + kw_double, + kw_x86_fp80, + kw_fp128, + kw_ppc_fp128, + kw_target_flags, + kw_volatile, + kw_non_temporal, + kw_invariant, + kw_align, + kw_addrspace, + kw_stack, + kw_got, + kw_jump_table, + kw_constant_pool, + kw_call_entry, + kw_liveout, + kw_address_taken, + kw_landing_pad, + kw_liveins, + kw_successors, + kw_floatpred, + kw_intpred, + kw_shufflemask, + kw_pre_instr_symbol, + kw_post_instr_symbol, + kw_unknown_size, + + // Named metadata keywords + md_tbaa, + md_alias_scope, + md_noalias, + md_range, + md_diexpr, + md_dilocation, + + // Identifier tokens + Identifier, + NamedRegister, + NamedVirtualRegister, + MachineBasicBlockLabel, + MachineBasicBlock, + StackObject, + FixedStackObject, + NamedGlobalValue, + GlobalValue, + ExternalSymbol, + MCSymbol, + + // Other tokens + IntegerLiteral, + FloatingPointLiteral, + HexLiteral, + VectorLiteral, + VirtualRegister, + ConstantPoolItem, + JumpTableIndex, + NamedIRBlock, + IRBlock, + NamedIRValue, + IRValue, + QuotedIRValue, // `<constant value>` + SubRegisterIndex, + StringConstant + }; + +private: + TokenKind Kind = Error; + StringRef Range; + StringRef StringValue; + std::string StringValueStorage; + APSInt IntVal; + +public: + MIToken() = default; + + MIToken &reset(TokenKind Kind, StringRef Range); + + MIToken &setStringValue(StringRef StrVal); + MIToken &setOwnedStringValue(std::string StrVal); + MIToken &setIntegerValue(APSInt IntVal); + + TokenKind kind() const { return Kind; } + + bool isError() const { return Kind == Error; } + + bool isNewlineOrEOF() const { return Kind == Newline || Kind == Eof; } + + bool isErrorOrEOF() const { return Kind == Error || Kind == Eof; } + + bool isRegister() const { + return Kind == NamedRegister || Kind == underscore || + Kind == NamedVirtualRegister || Kind == VirtualRegister; + } + + bool isRegisterFlag() const { + return Kind == kw_implicit || Kind == kw_implicit_define || + Kind == kw_def || Kind == kw_dead || Kind == kw_killed || + Kind == kw_undef || Kind == kw_internal || + Kind == kw_early_clobber || Kind == kw_debug_use || + Kind == kw_renamable; + } + + bool isMemoryOperandFlag() const { + return Kind == kw_volatile || Kind == kw_non_temporal || + Kind == kw_dereferenceable || Kind == kw_invariant || + Kind == StringConstant; + } + + bool is(TokenKind K) const { return Kind == K; } + + bool isNot(TokenKind K) const { return Kind != K; } + + StringRef::iterator location() const { return Range.begin(); } + + StringRef range() const { return Range; } + + /// Return the token's string value. + StringRef stringValue() const { return StringValue; } + + const APSInt &integerValue() const { return IntVal; } + + bool hasIntegerValue() const { + return Kind == IntegerLiteral || Kind == MachineBasicBlock || + Kind == MachineBasicBlockLabel || Kind == StackObject || + Kind == FixedStackObject || Kind == GlobalValue || + Kind == VirtualRegister || Kind == ConstantPoolItem || + Kind == JumpTableIndex || Kind == IRBlock || Kind == IRValue; + } +}; + +/// Consume a single machine instruction token in the given source and return +/// the remaining source string. +StringRef lexMIToken( + StringRef Source, MIToken &Token, + function_ref<void(StringRef::iterator, const Twine &)> ErrorCallback); + +} // end namespace llvm + +#endif // LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H |
