18
18
#include " llvm/ADT/StringSwitch.h"
19
19
#include " llvm/MC/MCAsmInfo.h"
20
20
#include " llvm/MC/MCParser/MCAsmLexer.h"
21
- #include " llvm/Support/Compiler.h"
22
21
#include " llvm/Support/SMLoc.h"
23
22
#include " llvm/Support/SaveAndRestore.h"
24
23
#include < cassert>
@@ -272,35 +271,13 @@ static unsigned doHexLookAhead(const char *&CurPtr, unsigned DefaultRadix,
272
271
return DefaultRadix;
273
272
}
274
273
275
- static const char *findLastDigit (const char *CurPtr, unsigned DefaultRadix) {
276
- while (hexDigitValue (*CurPtr) < DefaultRadix) {
277
- ++CurPtr;
278
- }
279
- return CurPtr;
280
- }
281
-
282
274
static AsmToken intToken (StringRef Ref, APInt &Value)
283
275
{
284
276
if (Value.isIntN (64 ))
285
277
return AsmToken (AsmToken::Integer, Ref, Value);
286
278
return AsmToken (AsmToken::BigNum, Ref, Value);
287
279
}
288
280
289
- static std::string radixName (unsigned Radix) {
290
- switch (Radix) {
291
- case 2 :
292
- return " binary" ;
293
- case 8 :
294
- return " octal" ;
295
- case 10 :
296
- return " decimal" ;
297
- case 16 :
298
- return " hexadecimal" ;
299
- default :
300
- return " base-" + std::to_string (Radix);
301
- }
302
- }
303
-
304
281
// / LexDigit: First character is [0-9].
305
282
// / Local Label: [0-9][:]
306
283
// / Forward/Backward Label: [0-9][fb]
@@ -309,108 +286,45 @@ static std::string radixName(unsigned Radix) {
309
286
// / Hex integer: 0x[0-9a-fA-F]+ or [0x]?[0-9][0-9a-fA-F]*[hH]
310
287
// / Decimal integer: [1-9][0-9]*
311
288
AsmToken AsmLexer::LexDigit () {
312
- // MASM-flavor binary integer: [01]+[yY] (if DefaultRadix < 16, [bByY])
313
- // MASM-flavor octal integer: [0-7]+[oOqQ]
314
- // MASM-flavor decimal integer: [0-9]+[tT] (if DefaultRadix < 16, [dDtT])
289
+ // MASM-flavor binary integer: [01]+[bB]
315
290
// MASM-flavor hexadecimal integer: [0-9][0-9a-fA-F]*[hH]
316
291
if (LexMasmIntegers && isdigit (CurPtr[-1 ])) {
317
- const char *FirstNonBinary =
318
- (CurPtr[-1 ] != ' 0' && CurPtr[-1 ] != ' 1' ) ? CurPtr - 1 : nullptr ;
319
- const char *FirstNonDecimal =
320
- (CurPtr[-1 ] < ' 0' || CurPtr[-1 ] > ' 9' ) ? CurPtr - 1 : nullptr ;
292
+ const char *FirstNonBinary = (CurPtr[-1 ] != ' 0' && CurPtr[-1 ] != ' 1' ) ?
293
+ CurPtr - 1 : nullptr ;
321
294
const char *OldCurPtr = CurPtr;
322
295
while (isHexDigit (*CurPtr)) {
323
- switch (*CurPtr) {
324
- default :
325
- if (!FirstNonDecimal) {
326
- FirstNonDecimal = CurPtr;
327
- }
328
- LLVM_FALLTHROUGH;
329
- case ' 9' :
330
- case ' 8' :
331
- case ' 7' :
332
- case ' 6' :
333
- case ' 5' :
334
- case ' 4' :
335
- case ' 3' :
336
- case ' 2' :
337
- if (!FirstNonBinary) {
338
- FirstNonBinary = CurPtr;
339
- }
340
- break ;
341
- case ' 1' :
342
- case ' 0' :
343
- break ;
344
- }
345
- ++CurPtr;
346
- }
347
- if (*CurPtr == ' .' ) {
348
- // MASM float literals (other than hex floats) always contain a ".", and
349
- // are always written in decimal.
296
+ if (*CurPtr != ' 0' && *CurPtr != ' 1' && !FirstNonBinary)
297
+ FirstNonBinary = CurPtr;
350
298
++CurPtr;
351
- return LexFloatLiteral ();
352
299
}
353
300
354
301
unsigned Radix = 0 ;
355
302
if (*CurPtr == ' h' || *CurPtr == ' H' ) {
356
303
// hexadecimal number
357
304
++CurPtr;
358
305
Radix = 16 ;
359
- } else if (*CurPtr == ' t' || *CurPtr == ' T' ) {
360
- // decimal number
361
- ++CurPtr;
362
- Radix = 10 ;
363
- } else if (*CurPtr == ' o' || *CurPtr == ' O' || *CurPtr == ' q' ||
364
- *CurPtr == ' Q' ) {
365
- // octal number
366
- ++CurPtr;
367
- Radix = 8 ;
368
- } else if (*CurPtr == ' y' || *CurPtr == ' Y' ) {
369
- // binary number
370
- ++CurPtr;
371
- Radix = 2 ;
372
- } else if (FirstNonDecimal && FirstNonDecimal + 1 == CurPtr &&
373
- DefaultRadix < 14 &&
374
- (*FirstNonDecimal == ' d' || *FirstNonDecimal == ' D' )) {
375
- Radix = 10 ;
376
306
} else if (FirstNonBinary && FirstNonBinary + 1 == CurPtr &&
377
- DefaultRadix < 12 &&
378
- (*FirstNonBinary == ' b' || *FirstNonBinary == ' B' )) {
307
+ (*FirstNonBinary == ' b' || *FirstNonBinary == ' B' ))
379
308
Radix = 2 ;
380
- }
381
309
382
- if (Radix) {
310
+ if (Radix == 2 || Radix == 16 ) {
383
311
StringRef Result (TokStart, CurPtr - TokStart);
384
312
APInt Value (128 , 0 , true );
385
313
386
314
if (Result.drop_back ().getAsInteger (Radix, Value))
387
- return ReturnError (TokStart, " invalid " + radixName (Radix) + " number" );
315
+ return ReturnError (TokStart, Radix == 2 ? " invalid binary number" :
316
+ " invalid hexdecimal number" );
388
317
389
318
// MSVC accepts and ignores type suffices on integer literals.
390
319
SkipIgnoredIntegerSuffix (CurPtr);
391
320
392
321
return intToken (Result, Value);
393
- }
322
+ }
394
323
395
- // default-radix integers, or floating point numbers, fall through
324
+ // octal/decimal integers, or floating point numbers, fall through
396
325
CurPtr = OldCurPtr;
397
326
}
398
327
399
- // MASM default-radix integers: [0-9a-fA-F]+
400
- // (All other integer literals have a radix specifier.)
401
- if (LexMasmIntegers) {
402
- CurPtr = findLastDigit (CurPtr, 16 );
403
- StringRef Result (TokStart, CurPtr - TokStart);
404
-
405
- APInt Value (128 , 0 , true );
406
- if (Result.getAsInteger (DefaultRadix, Value)) {
407
- return ReturnError (TokStart,
408
- " invalid " + radixName (DefaultRadix) + " number" );
409
- }
410
-
411
- return intToken (Result, Value);
412
- }
413
-
414
328
// Decimal integer: [1-9][0-9]*
415
329
if (CurPtr[-1 ] != ' 0' || CurPtr[0 ] == ' .' ) {
416
330
unsigned Radix = doHexLookAhead (CurPtr, 10 , LexMasmIntegers);
@@ -425,9 +339,13 @@ AsmToken AsmLexer::LexDigit() {
425
339
StringRef Result (TokStart, CurPtr - TokStart);
426
340
427
341
APInt Value (128 , 0 , true );
428
- if (Result.getAsInteger (Radix, Value)) {
429
- return ReturnError (TokStart, " invalid " + radixName (Radix) + " number" );
430
- }
342
+ if (Result.getAsInteger (Radix, Value))
343
+ return ReturnError (TokStart, !isHex ? " invalid decimal number" :
344
+ " invalid hexdecimal number" );
345
+
346
+ // Consume the [hH].
347
+ if (LexMasmIntegers && Radix == 16 )
348
+ ++CurPtr;
431
349
432
350
// The darwin/x86 (and x86-64) assembler accepts and ignores type
433
351
// suffices on integer literals.
@@ -498,9 +416,11 @@ AsmToken AsmLexer::LexDigit() {
498
416
// Either octal or hexadecimal.
499
417
APInt Value (128 , 0 , true );
500
418
unsigned Radix = doHexLookAhead (CurPtr, 8 , LexMasmIntegers);
419
+ bool isHex = Radix == 16 ;
501
420
StringRef Result (TokStart, CurPtr - TokStart);
502
421
if (Result.getAsInteger (Radix, Value))
503
- return ReturnError (TokStart, " invalid " + radixName (Radix) + " number" );
422
+ return ReturnError (TokStart, !isHex ? " invalid octal number" :
423
+ " invalid hexdecimal number" );
504
424
505
425
// Consume the [hH].
506
426
if (Radix == 16 )
0 commit comments