MIR Serialization: Serialize the jump table pseudo source values.
[oota-llvm.git] / lib / CodeGen / MIRParser / MILexer.h
1 //===- MILexer.h - Lexer for machine instructions -------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares the function that lexes the machine instruction source
11 // string.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
16 #define LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
17
18 #include "llvm/ADT/APSInt.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/ADT/STLExtras.h"
21 #include <functional>
22
23 namespace llvm {
24
25 class Twine;
26
27 /// A token produced by the machine instruction lexer.
28 struct MIToken {
29   enum TokenKind {
30     // Markers
31     Eof,
32     Error,
33
34     // Tokens with no info.
35     comma,
36     equal,
37     underscore,
38     colon,
39     coloncolon,
40     exclaim,
41     lparen,
42     rparen,
43     plus,
44     minus,
45
46     // Keywords
47     kw_implicit,
48     kw_implicit_define,
49     kw_dead,
50     kw_killed,
51     kw_undef,
52     kw_early_clobber,
53     kw_debug_use,
54     kw_frame_setup,
55     kw_debug_location,
56     kw_cfi_offset,
57     kw_cfi_def_cfa_register,
58     kw_cfi_def_cfa_offset,
59     kw_cfi_def_cfa,
60     kw_blockaddress,
61     kw_target_index,
62     kw_half,
63     kw_float,
64     kw_double,
65     kw_x86_fp80,
66     kw_fp128,
67     kw_ppc_fp128,
68     kw_target_flags,
69     kw_volatile,
70     kw_non_temporal,
71     kw_invariant,
72     kw_align,
73     kw_stack,
74     kw_got,
75     kw_jump_table,
76     kw_constant_pool,
77     kw_liveout,
78
79     // Identifier tokens
80     Identifier,
81     IntegerType,
82     NamedRegister,
83     MachineBasicBlock,
84     StackObject,
85     FixedStackObject,
86     NamedGlobalValue,
87     GlobalValue,
88     ExternalSymbol,
89
90     // Other tokens
91     IntegerLiteral,
92     FloatingPointLiteral,
93     VirtualRegister,
94     ConstantPoolItem,
95     JumpTableIndex,
96     NamedIRBlock,
97     IRBlock,
98     NamedIRValue,
99   };
100
101 private:
102   TokenKind Kind;
103   StringRef Range;
104   StringRef StringValue;
105   std::string StringValueStorage;
106   APSInt IntVal;
107
108 public:
109   MIToken() : Kind(Error) {}
110
111   MIToken &reset(TokenKind Kind, StringRef Range);
112
113   MIToken &setStringValue(StringRef StrVal);
114   MIToken &setOwnedStringValue(std::string StrVal);
115   MIToken &setIntegerValue(APSInt IntVal);
116
117   TokenKind kind() const { return Kind; }
118
119   bool isError() const { return Kind == Error; }
120
121   bool isRegister() const {
122     return Kind == NamedRegister || Kind == underscore ||
123            Kind == VirtualRegister;
124   }
125
126   bool isRegisterFlag() const {
127     return Kind == kw_implicit || Kind == kw_implicit_define ||
128            Kind == kw_dead || Kind == kw_killed || Kind == kw_undef ||
129            Kind == kw_early_clobber || Kind == kw_debug_use;
130   }
131
132   bool isMemoryOperandFlag() const {
133     return Kind == kw_volatile || Kind == kw_non_temporal ||
134            Kind == kw_invariant;
135   }
136
137   bool is(TokenKind K) const { return Kind == K; }
138
139   bool isNot(TokenKind K) const { return Kind != K; }
140
141   StringRef::iterator location() const { return Range.begin(); }
142
143   StringRef range() const { return Range; }
144
145   /// Return the token's string value.
146   StringRef stringValue() const { return StringValue; }
147
148   const APSInt &integerValue() const { return IntVal; }
149
150   bool hasIntegerValue() const {
151     return Kind == IntegerLiteral || Kind == MachineBasicBlock ||
152            Kind == StackObject || Kind == FixedStackObject ||
153            Kind == GlobalValue || Kind == VirtualRegister ||
154            Kind == ConstantPoolItem || Kind == JumpTableIndex ||
155            Kind == IRBlock;
156   }
157 };
158
159 /// Consume a single machine instruction token in the given source and return
160 /// the remaining source string.
161 StringRef lexMIToken(
162     StringRef Source, MIToken &Token,
163     function_ref<void(StringRef::iterator, const Twine &)> ErrorCallback);
164
165 } // end namespace llvm
166
167 #endif