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 000000000000..200f9d026cc8 --- /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  | 
