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