| Chris Lattner | db3b202 | 2002-08-14 17:12:33 +0000 | [diff] [blame] | 1 | /*===-- Lexer.l - Scanner for llvm assembly files --------------*- C++ -*--===// | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 2 | // | 
| John Criswell | 29265fe | 2003-10-21 15:17:13 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file was developed by the LLVM research group and is distributed under | 
|  | 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 7 | // | 
| John Criswell | 29265fe | 2003-10-21 15:17:13 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 9 | // | 
|  | 10 | //  This file implements the flex scanner for LLVM assembly languages files. | 
|  | 11 | // | 
| Chris Lattner | db3b202 | 2002-08-14 17:12:33 +0000 | [diff] [blame] | 12 | //===----------------------------------------------------------------------===*/ | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 13 |  | 
|  | 14 | %option prefix="llvmAsm" | 
|  | 15 | %option yylineno | 
|  | 16 | %option nostdinit | 
|  | 17 | %option never-interactive | 
|  | 18 | %option batch | 
|  | 19 | %option noyywrap | 
|  | 20 | %option nodefault | 
|  | 21 | %option 8bit | 
|  | 22 | %option outfile="Lexer.cpp" | 
|  | 23 | %option ecs | 
|  | 24 | %option noreject | 
|  | 25 | %option noyymore | 
|  | 26 |  | 
|  | 27 | %{ | 
|  | 28 | #include "ParserInternals.h" | 
| Chris Lattner | 2012613 | 2003-04-22 19:07:06 +0000 | [diff] [blame] | 29 | #include "llvm/Module.h" | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 30 | #include <list> | 
|  | 31 | #include "llvmAsmParser.h" | 
| Brian Gaeke | bc12709 | 2003-10-10 19:12:08 +0000 | [diff] [blame] | 32 | #include <cctype> | 
|  | 33 | #include <cstdlib> | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 34 |  | 
| Chris Lattner | 416a0d4 | 2005-05-20 03:25:47 +0000 | [diff] [blame] | 35 | void set_scan_file(FILE * F){ | 
|  | 36 | yy_switch_to_buffer(yy_create_buffer( F, YY_BUF_SIZE ) ); | 
|  | 37 | } | 
|  | 38 | void set_scan_string (const char * str) { | 
|  | 39 | yy_scan_string (str); | 
|  | 40 | } | 
|  | 41 |  | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 42 | #define RET_TOK(type, Enum, sym) \ | 
|  | 43 | llvmAsmlval.type = Instruction::Enum; return sym | 
|  | 44 |  | 
| Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 45 | namespace llvm { | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 46 |  | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 47 | // TODO: All of the static identifiers are figured out by the lexer, | 
| Chris Lattner | 47af30c | 2001-09-07 16:32:43 +0000 | [diff] [blame] | 48 | // these should be hashed to reduce the lexer size | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 49 |  | 
|  | 50 |  | 
|  | 51 | // atoull - Convert an ascii string of decimal digits into the unsigned long | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 52 | // long representation... this does not have to do input error checking, | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 53 | // because we know that the input will be matched by a suitable regex... | 
|  | 54 | // | 
| Chris Lattner | 1b34374 | 2002-04-07 08:10:41 +0000 | [diff] [blame] | 55 | static uint64_t atoull(const char *Buffer) { | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 56 | uint64_t Result = 0; | 
|  | 57 | for (; *Buffer; Buffer++) { | 
|  | 58 | uint64_t OldRes = Result; | 
|  | 59 | Result *= 10; | 
|  | 60 | Result += *Buffer-'0'; | 
| Chris Lattner | 1b34374 | 2002-04-07 08:10:41 +0000 | [diff] [blame] | 61 | if (Result < OldRes)   // Uh, oh, overflow detected!!! | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 62 | ThrowException("constant bigger than 64 bits detected!"); | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 63 | } | 
|  | 64 | return Result; | 
|  | 65 | } | 
|  | 66 |  | 
| Chris Lattner | e509bd4 | 2003-04-17 22:17:32 +0000 | [diff] [blame] | 67 | static uint64_t HexIntToVal(const char *Buffer) { | 
| Chris Lattner | 1b34374 | 2002-04-07 08:10:41 +0000 | [diff] [blame] | 68 | uint64_t Result = 0; | 
|  | 69 | for (; *Buffer; ++Buffer) { | 
|  | 70 | uint64_t OldRes = Result; | 
|  | 71 | Result *= 16; | 
|  | 72 | char C = *Buffer; | 
|  | 73 | if (C >= '0' && C <= '9') | 
|  | 74 | Result += C-'0'; | 
|  | 75 | else if (C >= 'A' && C <= 'F') | 
|  | 76 | Result += C-'A'+10; | 
|  | 77 | else if (C >= 'a' && C <= 'f') | 
|  | 78 | Result += C-'a'+10; | 
|  | 79 |  | 
|  | 80 | if (Result < OldRes)   // Uh, oh, overflow detected!!! | 
|  | 81 | ThrowException("constant bigger than 64 bits detected!"); | 
|  | 82 | } | 
| Chris Lattner | e509bd4 | 2003-04-17 22:17:32 +0000 | [diff] [blame] | 83 | return Result; | 
|  | 84 | } | 
|  | 85 |  | 
|  | 86 |  | 
|  | 87 | // HexToFP - Convert the ascii string in hexidecimal format to the floating | 
|  | 88 | // point representation of it. | 
|  | 89 | // | 
|  | 90 | static double HexToFP(const char *Buffer) { | 
| Chris Lattner | b99f479 | 2002-04-07 08:31:26 +0000 | [diff] [blame] | 91 | // Behave nicely in the face of C TBAA rules... see: | 
|  | 92 | // http://www.nullstone.com/htmls/category/aliastyp.htm | 
| Chris Lattner | 62fa743 | 2003-04-22 20:20:28 +0000 | [diff] [blame] | 93 | union { | 
|  | 94 | uint64_t UI; | 
|  | 95 | double FP; | 
|  | 96 | } UIntToFP; | 
|  | 97 | UIntToFP.UI = HexIntToVal(Buffer); | 
|  | 98 |  | 
|  | 99 | assert(sizeof(double) == sizeof(uint64_t) && | 
|  | 100 | "Data sizes incompatible on this target!"); | 
|  | 101 | return UIntToFP.FP;   // Cast Hex constant to double | 
| Chris Lattner | 1b34374 | 2002-04-07 08:10:41 +0000 | [diff] [blame] | 102 | } | 
|  | 103 |  | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 104 |  | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 105 | // UnEscapeLexed - Run through the specified buffer and change \xx codes to the | 
|  | 106 | // appropriate character.  If AllowNull is set to false, a \00 value will cause | 
|  | 107 | // an exception to be thrown. | 
|  | 108 | // | 
|  | 109 | // If AllowNull is set to true, the return value of the function points to the | 
|  | 110 | // last character of the string in memory. | 
|  | 111 | // | 
| Chris Lattner | e680139 | 2002-07-25 06:17:42 +0000 | [diff] [blame] | 112 | char *UnEscapeLexed(char *Buffer, bool AllowNull) { | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 113 | char *BOut = Buffer; | 
|  | 114 | for (char *BIn = Buffer; *BIn; ) { | 
|  | 115 | if (BIn[0] == '\\' && isxdigit(BIn[1]) && isxdigit(BIn[2])) { | 
|  | 116 | char Tmp = BIn[3]; BIn[3] = 0;     // Terminate string | 
| Chris Lattner | fa66dc7 | 2005-01-08 20:07:03 +0000 | [diff] [blame] | 117 | *BOut = (char)strtol(BIn+1, 0, 16);  // Convert to number | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 118 | if (!AllowNull && !*BOut) | 
|  | 119 | ThrowException("String literal cannot accept \\00 escape!"); | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 120 |  | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 121 | BIn[3] = Tmp;                  // Restore character | 
|  | 122 | BIn += 3;                      // Skip over handled chars | 
|  | 123 | ++BOut; | 
|  | 124 | } else { | 
|  | 125 | *BOut++ = *BIn++; | 
|  | 126 | } | 
|  | 127 | } | 
|  | 128 |  | 
|  | 129 | return BOut; | 
|  | 130 | } | 
|  | 131 |  | 
| Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 132 | } // End llvm namespace | 
|  | 133 |  | 
|  | 134 | using namespace llvm; | 
|  | 135 |  | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 136 | #define YY_NEVER_INTERACTIVE 1 | 
|  | 137 | %} | 
|  | 138 |  | 
|  | 139 |  | 
|  | 140 |  | 
|  | 141 | /* Comments start with a ; and go till end of line */ | 
|  | 142 | Comment    ;.* | 
|  | 143 |  | 
| Chris Lattner | 17f729e | 2001-07-15 06:35:53 +0000 | [diff] [blame] | 144 | /* Variable(Value) identifiers start with a % sign */ | 
| Chris Lattner | 1366b30 | 2001-12-04 04:31:30 +0000 | [diff] [blame] | 145 | VarID       %[-a-zA-Z$._][-a-zA-Z$._0-9]* | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 146 |  | 
|  | 147 | /* Label identifiers end with a colon */ | 
| Chris Lattner | 1366b30 | 2001-12-04 04:31:30 +0000 | [diff] [blame] | 148 | Label       [-a-zA-Z$._0-9]+: | 
| Alkis Evlogimenos | a93b452 | 2004-12-10 05:40:19 +0000 | [diff] [blame] | 149 | QuoteLabel \"[^\"]+\": | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 150 |  | 
|  | 151 | /* Quoted names can contain any character except " and \ */ | 
| Chris Lattner | 0079e7d | 2003-10-18 05:53:13 +0000 | [diff] [blame] | 152 | StringConstant \"[^\"]*\" | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 153 |  | 
|  | 154 |  | 
|  | 155 | /* [PN]Integer: match positive and negative literal integer values that | 
|  | 156 | * are preceeded by a '%' character.  These represent unnamed variable slots. | 
|  | 157 | */ | 
|  | 158 | EPInteger     %[0-9]+ | 
|  | 159 | ENInteger    %-[0-9]+ | 
|  | 160 |  | 
|  | 161 |  | 
|  | 162 | /* E[PN]Integer: match positive and negative literal integer values */ | 
|  | 163 | PInteger   [0-9]+ | 
|  | 164 | NInteger  -[0-9]+ | 
|  | 165 |  | 
| Chris Lattner | 212f70d | 2001-07-15 00:17:01 +0000 | [diff] [blame] | 166 | /* FPConstant - A Floating point constant. | 
| Chris Lattner | 1b34374 | 2002-04-07 08:10:41 +0000 | [diff] [blame] | 167 | */ | 
| Chris Lattner | 50f68ac | 2001-11-01 22:06:08 +0000 | [diff] [blame] | 168 | FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)? | 
| Chris Lattner | 212f70d | 2001-07-15 00:17:01 +0000 | [diff] [blame] | 169 |  | 
| Chris Lattner | 1b34374 | 2002-04-07 08:10:41 +0000 | [diff] [blame] | 170 | /* HexFPConstant - Floating point constant represented in IEEE format as a | 
|  | 171 | *  hexadecimal number for when exponential notation is not precise enough. | 
|  | 172 | */ | 
|  | 173 | HexFPConstant 0x[0-9A-Fa-f]+ | 
| Chris Lattner | e509bd4 | 2003-04-17 22:17:32 +0000 | [diff] [blame] | 174 |  | 
|  | 175 | /* HexIntConstant - Hexadecimal constant generated by the CFE to avoid forcing | 
|  | 176 | * it to deal with 64 bit numbers. | 
|  | 177 | */ | 
|  | 178 | HexIntConstant [us]0x[0-9A-Fa-f]+ | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 179 | %% | 
|  | 180 |  | 
|  | 181 | {Comment}       { /* Ignore comments for now */ } | 
|  | 182 |  | 
|  | 183 | begin           { return BEGINTOK; } | 
| Chris Lattner | 1e1a9b4 | 2002-05-03 18:23:48 +0000 | [diff] [blame] | 184 | end             { return ENDTOK; } | 
| Chris Lattner | c0ba90e | 2004-03-31 03:49:47 +0000 | [diff] [blame] | 185 | true            { return TRUETOK;  } | 
|  | 186 | false           { return FALSETOK; } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 187 | declare         { return DECLARE; } | 
| Chris Lattner | da97550 | 2001-09-10 07:58:01 +0000 | [diff] [blame] | 188 | global          { return GLOBAL; } | 
| Chris Lattner | 7fb14f5 | 2001-09-18 04:00:54 +0000 | [diff] [blame] | 189 | constant        { return CONSTANT; } | 
| Chris Lattner | 841d8b9 | 2001-11-26 18:54:16 +0000 | [diff] [blame] | 190 | internal        { return INTERNAL; } | 
| Chris Lattner | 379a8d2 | 2003-04-16 20:28:45 +0000 | [diff] [blame] | 191 | linkonce        { return LINKONCE; } | 
| Chris Lattner | f4120d9 | 2003-10-10 04:54:02 +0000 | [diff] [blame] | 192 | weak            { return WEAK; } | 
| Chris Lattner | 379a8d2 | 2003-04-16 20:28:45 +0000 | [diff] [blame] | 193 | appending       { return APPENDING; } | 
| Chris Lattner | e2dd92b | 2002-10-06 22:45:09 +0000 | [diff] [blame] | 194 | uninitialized   { return EXTERNAL; }    /* Deprecated, turn into external */ | 
|  | 195 | external        { return EXTERNAL; } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 196 | implementation  { return IMPLEMENTATION; } | 
| Chris Lattner | 7969401 | 2003-06-28 20:01:34 +0000 | [diff] [blame] | 197 | zeroinitializer { return ZEROINITIALIZER; } | 
| Chris Lattner | 42b5a8a | 2001-07-25 22:47:46 +0000 | [diff] [blame] | 198 | \.\.\.          { return DOTDOTDOT; } | 
| Chris Lattner | 4ff3149 | 2004-10-16 18:17:13 +0000 | [diff] [blame] | 199 | undef           { return UNDEF; } | 
| Chris Lattner | fbdec25 | 2001-09-30 22:46:54 +0000 | [diff] [blame] | 200 | null            { return NULL_TOK; } | 
| Chris Lattner | 3d4b290 | 2001-10-13 06:37:14 +0000 | [diff] [blame] | 201 | to              { return TO; } | 
| Chris Lattner | 1723571 | 2004-02-08 21:48:25 +0000 | [diff] [blame] | 202 | except          { RET_TOK(TermOpVal, Unwind, UNWIND); } | 
| Chris Lattner | db3b202 | 2002-08-14 17:12:33 +0000 | [diff] [blame] | 203 | not             { return NOT; }  /* Deprecated, turned into XOR */ | 
| Chris Lattner | ca4d4bd | 2005-05-06 06:20:33 +0000 | [diff] [blame] | 204 | tail            { return TAIL; } | 
| Chris Lattner | 2012613 | 2003-04-22 19:07:06 +0000 | [diff] [blame] | 205 | target          { return TARGET; } | 
| Reid Spencer | 4add919 | 2004-07-25 17:56:00 +0000 | [diff] [blame] | 206 | triple          { return TRIPLE; } | 
|  | 207 | deplibs         { return DEPLIBS; } | 
| Chris Lattner | 2012613 | 2003-04-22 19:07:06 +0000 | [diff] [blame] | 208 | endian          { return ENDIAN; } | 
|  | 209 | pointersize     { return POINTERSIZE; } | 
|  | 210 | little          { return LITTLE; } | 
|  | 211 | big             { return BIG; } | 
| Chris Lattner | 8b1680e | 2003-09-08 18:20:29 +0000 | [diff] [blame] | 212 | volatile        { return VOLATILE; } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 213 |  | 
| Chris Lattner | 53bdd31 | 2005-05-06 20:27:19 +0000 | [diff] [blame] | 214 | cc              { return CC_TOK; } | 
|  | 215 | ccc             { return CCC_TOK; } | 
|  | 216 | fastcc          { return FASTCC_TOK; } | 
|  | 217 | coldcc          { return COLDCC_TOK; } | 
|  | 218 |  | 
| Chris Lattner | 47af30c | 2001-09-07 16:32:43 +0000 | [diff] [blame] | 219 | void            { llvmAsmlval.PrimType = Type::VoidTy  ; return VOID;   } | 
|  | 220 | bool            { llvmAsmlval.PrimType = Type::BoolTy  ; return BOOL;   } | 
|  | 221 | sbyte           { llvmAsmlval.PrimType = Type::SByteTy ; return SBYTE;  } | 
|  | 222 | ubyte           { llvmAsmlval.PrimType = Type::UByteTy ; return UBYTE;  } | 
|  | 223 | short           { llvmAsmlval.PrimType = Type::ShortTy ; return SHORT;  } | 
|  | 224 | ushort          { llvmAsmlval.PrimType = Type::UShortTy; return USHORT; } | 
|  | 225 | int             { llvmAsmlval.PrimType = Type::IntTy   ; return INT;    } | 
|  | 226 | uint            { llvmAsmlval.PrimType = Type::UIntTy  ; return UINT;   } | 
|  | 227 | long            { llvmAsmlval.PrimType = Type::LongTy  ; return LONG;   } | 
|  | 228 | ulong           { llvmAsmlval.PrimType = Type::ULongTy ; return ULONG;  } | 
|  | 229 | float           { llvmAsmlval.PrimType = Type::FloatTy ; return FLOAT;  } | 
|  | 230 | double          { llvmAsmlval.PrimType = Type::DoubleTy; return DOUBLE; } | 
| Chris Lattner | 47af30c | 2001-09-07 16:32:43 +0000 | [diff] [blame] | 231 | label           { llvmAsmlval.PrimType = Type::LabelTy ; return LABEL;  } | 
| Reid Spencer | e258e94 | 2004-07-04 12:17:44 +0000 | [diff] [blame] | 232 | type            { return TYPE;   } | 
| Chris Lattner | f269b9d | 2002-04-04 19:22:17 +0000 | [diff] [blame] | 233 | opaque          { return OPAQUE; } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 234 |  | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 235 | add             { RET_TOK(BinaryOpVal, Add, ADD); } | 
|  | 236 | sub             { RET_TOK(BinaryOpVal, Sub, SUB); } | 
|  | 237 | mul             { RET_TOK(BinaryOpVal, Mul, MUL); } | 
|  | 238 | div             { RET_TOK(BinaryOpVal, Div, DIV); } | 
|  | 239 | rem             { RET_TOK(BinaryOpVal, Rem, REM); } | 
| Chris Lattner | c27b1d7 | 2001-10-20 09:32:59 +0000 | [diff] [blame] | 240 | and             { RET_TOK(BinaryOpVal, And, AND); } | 
|  | 241 | or              { RET_TOK(BinaryOpVal, Or , OR ); } | 
|  | 242 | xor             { RET_TOK(BinaryOpVal, Xor, XOR); } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 243 | setne           { RET_TOK(BinaryOpVal, SetNE, SETNE); } | 
|  | 244 | seteq           { RET_TOK(BinaryOpVal, SetEQ, SETEQ); } | 
|  | 245 | setlt           { RET_TOK(BinaryOpVal, SetLT, SETLT); } | 
|  | 246 | setgt           { RET_TOK(BinaryOpVal, SetGT, SETGT); } | 
|  | 247 | setle           { RET_TOK(BinaryOpVal, SetLE, SETLE); } | 
|  | 248 | setge           { RET_TOK(BinaryOpVal, SetGE, SETGE); } | 
|  | 249 |  | 
| Chris Lattner | b94550e | 2003-10-19 21:34:28 +0000 | [diff] [blame] | 250 | phi             { RET_TOK(OtherOpVal, PHI, PHI_TOK); } | 
| Chris Lattner | d8bebcd | 2001-07-08 21:10:27 +0000 | [diff] [blame] | 251 | call            { RET_TOK(OtherOpVal, Call, CALL); } | 
|  | 252 | cast            { RET_TOK(OtherOpVal, Cast, CAST); } | 
| Chris Lattner | 6536f0c | 2004-03-12 05:51:36 +0000 | [diff] [blame] | 253 | select          { RET_TOK(OtherOpVal, Select, SELECT); } | 
| Chris Lattner | d8bebcd | 2001-07-08 21:10:27 +0000 | [diff] [blame] | 254 | shl             { RET_TOK(OtherOpVal, Shl, SHL); } | 
|  | 255 | shr             { RET_TOK(OtherOpVal, Shr, SHR); } | 
| Chris Lattner | 0079e7d | 2003-10-18 05:53:13 +0000 | [diff] [blame] | 256 | vanext          { RET_TOK(OtherOpVal, VANext, VANEXT); } | 
|  | 257 | vaarg           { RET_TOK(OtherOpVal, VAArg , VAARG); } | 
| Chris Lattner | d8bebcd | 2001-07-08 21:10:27 +0000 | [diff] [blame] | 258 |  | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 259 | ret             { RET_TOK(TermOpVal, Ret, RET); } | 
|  | 260 | br              { RET_TOK(TermOpVal, Br, BR); } | 
|  | 261 | switch          { RET_TOK(TermOpVal, Switch, SWITCH); } | 
| Chris Lattner | 3d4b290 | 2001-10-13 06:37:14 +0000 | [diff] [blame] | 262 | invoke          { RET_TOK(TermOpVal, Invoke, INVOKE); } | 
| Chris Lattner | 9c58cf6 | 2003-09-08 18:54:55 +0000 | [diff] [blame] | 263 | unwind          { RET_TOK(TermOpVal, Unwind, UNWIND); } | 
| Chris Lattner | 4ff3149 | 2004-10-16 18:17:13 +0000 | [diff] [blame] | 264 | unreachable     { RET_TOK(TermOpVal, Unreachable, UNREACHABLE); } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 265 |  | 
|  | 266 | malloc          { RET_TOK(MemOpVal, Malloc, MALLOC); } | 
|  | 267 | alloca          { RET_TOK(MemOpVal, Alloca, ALLOCA); } | 
|  | 268 | free            { RET_TOK(MemOpVal, Free, FREE); } | 
|  | 269 | load            { RET_TOK(MemOpVal, Load, LOAD); } | 
|  | 270 | store           { RET_TOK(MemOpVal, Store, STORE); } | 
| Chris Lattner | 62ecb4a | 2001-07-08 23:22:50 +0000 | [diff] [blame] | 271 | getelementptr   { RET_TOK(MemOpVal, GetElementPtr, GETELEMENTPTR); } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 272 |  | 
|  | 273 |  | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 274 | {VarID}         { | 
|  | 275 | UnEscapeLexed(yytext+1); | 
|  | 276 | llvmAsmlval.StrVal = strdup(yytext+1);             // Skip % | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 277 | return VAR_ID; | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 278 | } | 
|  | 279 | {Label}         { | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 280 | yytext[strlen(yytext)-1] = 0;  // nuke colon | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 281 | UnEscapeLexed(yytext); | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 282 | llvmAsmlval.StrVal = strdup(yytext); | 
|  | 283 | return LABELSTR; | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 284 | } | 
| Chris Lattner | fcec9d6 | 2004-12-10 05:27:29 +0000 | [diff] [blame] | 285 | {QuoteLabel}    { | 
|  | 286 | yytext[strlen(yytext)-2] = 0;  // nuke colon, end quote | 
|  | 287 | UnEscapeLexed(yytext+1); | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 288 | llvmAsmlval.StrVal = strdup(yytext+1); | 
|  | 289 | return LABELSTR; | 
| Chris Lattner | fcec9d6 | 2004-12-10 05:27:29 +0000 | [diff] [blame] | 290 | } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 291 |  | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 292 | {StringConstant} { // Note that we cannot unescape a string constant here!  The | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 293 | // string constant might contain a \00 which would not be | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 294 | // understood by the string stuff.  It is valid to make a | 
|  | 295 | // [sbyte] c"Hello World\00" constant, for example. | 
|  | 296 | // | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 297 | yytext[strlen(yytext)-1] = 0;           // nuke end quote | 
|  | 298 | llvmAsmlval.StrVal = strdup(yytext+1);  // Nuke start quote | 
|  | 299 | return STRINGCONSTANT; | 
| Chris Lattner | 26e50dc | 2001-07-28 17:48:55 +0000 | [diff] [blame] | 300 | } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 301 |  | 
|  | 302 |  | 
|  | 303 | {PInteger}      { llvmAsmlval.UInt64Val = atoull(yytext); return EUINT64VAL; } | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 304 | {NInteger}      { | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 305 | uint64_t Val = atoull(yytext+1); | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 306 | // +1:  we have bigger negative range | 
|  | 307 | if (Val > (uint64_t)INT64_MAX+1) | 
|  | 308 | ThrowException("Constant too large for signed 64 bits!"); | 
|  | 309 | llvmAsmlval.SInt64Val = -Val; | 
|  | 310 | return ESINT64VAL; | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 311 | } | 
| Chris Lattner | e509bd4 | 2003-04-17 22:17:32 +0000 | [diff] [blame] | 312 | {HexIntConstant} { | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 313 | llvmAsmlval.UInt64Val = HexIntToVal(yytext+3); | 
| Chris Lattner | e509bd4 | 2003-04-17 22:17:32 +0000 | [diff] [blame] | 314 | return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; | 
|  | 315 | } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 316 |  | 
| Chris Lattner | fa66dc7 | 2005-01-08 20:07:03 +0000 | [diff] [blame] | 317 | {EPInteger}     { | 
|  | 318 | uint64_t Val = atoull(yytext+1); | 
|  | 319 | if ((unsigned)Val != Val) | 
|  | 320 | ThrowException("Invalid value number (too large)!"); | 
|  | 321 | llvmAsmlval.UIntVal = unsigned(Val); | 
|  | 322 | return UINTVAL; | 
|  | 323 | } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 324 | {ENInteger}     { | 
|  | 325 | uint64_t Val = atoull(yytext+2); | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 326 | // +1:  we have bigger negative range | 
|  | 327 | if (Val > (uint64_t)INT32_MAX+1) | 
|  | 328 | ThrowException("Constant too large for signed 32 bits!"); | 
| Chris Lattner | fa66dc7 | 2005-01-08 20:07:03 +0000 | [diff] [blame] | 329 | llvmAsmlval.SIntVal = (int)-Val; | 
| Misha Brukman | 8b47707 | 2005-05-10 22:02:28 +0000 | [diff] [blame] | 330 | return SINTVAL; | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 331 | } | 
|  | 332 |  | 
| Chris Lattner | 212f70d | 2001-07-15 00:17:01 +0000 | [diff] [blame] | 333 | {FPConstant}    { llvmAsmlval.FPVal = atof(yytext); return FPVAL; } | 
| Chris Lattner | 1b34374 | 2002-04-07 08:10:41 +0000 | [diff] [blame] | 334 | {HexFPConstant} { llvmAsmlval.FPVal = HexToFP(yytext); return FPVAL; } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 335 |  | 
| Chris Lattner | 3922d60 | 2004-03-19 23:34:33 +0000 | [diff] [blame] | 336 | <<EOF>>         { | 
|  | 337 | /* Make sure to free the internal buffers for flex when we are | 
|  | 338 | * done reading our input! | 
|  | 339 | */ | 
|  | 340 | yy_delete_buffer(YY_CURRENT_BUFFER); | 
|  | 341 | return EOF; | 
|  | 342 | } | 
|  | 343 |  | 
| Chris Lattner | 604e19e | 2004-05-27 17:49:14 +0000 | [diff] [blame] | 344 | [ \r\t\n]       { /* Ignore whitespace */ } | 
| Chris Lattner | 47af30c | 2001-09-07 16:32:43 +0000 | [diff] [blame] | 345 | .               { return yytext[0]; } | 
| Chris Lattner | 2f7c963 | 2001-06-06 20:29:01 +0000 | [diff] [blame] | 346 |  | 
|  | 347 | %% |