197 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- MILexer.h - Lexer for machine instructions -------------------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // 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/StringRef.h"
 | |
| #include "llvm/ADT/STLExtras.h"
 | |
| #include <functional>
 | |
| 
 | |
| 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,
 | |
|     exclaim,
 | |
|     lparen,
 | |
|     rparen,
 | |
|     lbrace,
 | |
|     rbrace,
 | |
|     plus,
 | |
|     minus,
 | |
|     less,
 | |
|     greater,
 | |
| 
 | |
|     // Keywords
 | |
|     kw_implicit,
 | |
|     kw_implicit_define,
 | |
|     kw_def,
 | |
|     kw_dead,
 | |
|     kw_killed,
 | |
|     kw_undef,
 | |
|     kw_internal,
 | |
|     kw_early_clobber,
 | |
|     kw_debug_use,
 | |
|     kw_tied_def,
 | |
|     kw_frame_setup,
 | |
|     kw_debug_location,
 | |
|     kw_cfi_same_value,
 | |
|     kw_cfi_offset,
 | |
|     kw_cfi_def_cfa_register,
 | |
|     kw_cfi_def_cfa_offset,
 | |
|     kw_cfi_def_cfa,
 | |
|     kw_blockaddress,
 | |
|     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_stack,
 | |
|     kw_got,
 | |
|     kw_jump_table,
 | |
|     kw_constant_pool,
 | |
|     kw_call_entry,
 | |
|     kw_liveout,
 | |
|     kw_address_taken,
 | |
|     kw_landing_pad,
 | |
|     kw_liveins,
 | |
|     kw_successors,
 | |
| 
 | |
|     // Named metadata keywords
 | |
|     md_tbaa,
 | |
|     md_alias_scope,
 | |
|     md_noalias,
 | |
|     md_range,
 | |
| 
 | |
|     // Identifier tokens
 | |
|     Identifier,
 | |
|     IntegerType,
 | |
|     NamedRegister,
 | |
|     MachineBasicBlockLabel,
 | |
|     MachineBasicBlock,
 | |
|     StackObject,
 | |
|     FixedStackObject,
 | |
|     NamedGlobalValue,
 | |
|     GlobalValue,
 | |
|     ExternalSymbol,
 | |
| 
 | |
|     // Other tokens
 | |
|     IntegerLiteral,
 | |
|     FloatingPointLiteral,
 | |
|     VirtualRegister,
 | |
|     ConstantPoolItem,
 | |
|     JumpTableIndex,
 | |
|     NamedIRBlock,
 | |
|     IRBlock,
 | |
|     NamedIRValue,
 | |
|     IRValue,
 | |
|     QuotedIRValue, // `<constant value>`
 | |
|     SubRegisterIndex
 | |
|   };
 | |
| 
 | |
| private:
 | |
|   TokenKind Kind;
 | |
|   StringRef Range;
 | |
|   StringRef StringValue;
 | |
|   std::string StringValueStorage;
 | |
|   APSInt IntVal;
 | |
| 
 | |
| public:
 | |
|   MIToken() : Kind(Error) {}
 | |
| 
 | |
|   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 == 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;
 | |
|   }
 | |
| 
 | |
|   bool isMemoryOperandFlag() const {
 | |
|     return Kind == kw_volatile || Kind == kw_non_temporal ||
 | |
|            Kind == kw_invariant;
 | |
|   }
 | |
| 
 | |
|   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
 |