Revert r15266. This fixes llvm.org/pr15266.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175173 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2013-02-14 16:23:08 +00:00
parent 5464c301c4
commit e186d7191c
3 changed files with 25 additions and 60 deletions

View File

@@ -179,48 +179,26 @@ static unsigned doLookAhead(const char *&CurPtr, unsigned DefaultRadix) {
} }
} }
bool isHex = *LookAhead == 'h' || *LookAhead == 'H'; bool isHex = *LookAhead == 'h' || *LookAhead == 'H';
bool isBinary = LookAhead[-1] == 'b' || LookAhead[-1] == 'B'; CurPtr = isHex || !FirstHex ? LookAhead : FirstHex;
CurPtr = (isBinary || isHex || !FirstHex) ? LookAhead : FirstHex;
if (isHex) if (isHex)
return 16; return 16;
if (isBinary) {
--CurPtr;
return 2;
}
return DefaultRadix; return DefaultRadix;
} }
/// LexDigit: First character is [0-9]. /// LexDigit: First character is [0-9].
/// Local Label: [0-9][:] /// Local Label: [0-9][:]
/// Forward/Backward Label: [0-9]+f or [0-9]b /// Forward/Backward Label: [0-9][fb]
/// Binary integer: 0b[01]+ or [01][bB] /// Binary integer: 0b[01]+
/// Octal integer: 0[0-7]+ /// Octal integer: 0[0-7]+
/// Hex integer: 0x[0-9a-fA-F]+ or [0x]?[0-9][0-9a-fA-F]*[hH] /// Hex integer: 0x[0-9a-fA-F]+ or [0x]?[0-9][0-9a-fA-F]*[hH]
/// Decimal integer: [1-9][0-9]* /// Decimal integer: [1-9][0-9]*
AsmToken AsmLexer::LexDigit() { AsmToken AsmLexer::LexDigit() {
// Backward Label: [0-9]b
if (*CurPtr == 'b') {
// See if we actually have "0b" as part of something like "jmp 0b\n"
if (!isdigit(CurPtr[1])) {
long long Value;
StringRef Result(TokStart, CurPtr - TokStart);
if (Result.getAsInteger(10, Value))
return ReturnError(TokStart, "invalid backward label");
return AsmToken(AsmToken::Integer, Result, Value);
}
}
// Binary integer: 1[01]*[bB]
// Decimal integer: [1-9][0-9]* // Decimal integer: [1-9][0-9]*
// Hexidecimal integer: [1-9][0-9a-fA-F]*[hH]
if (CurPtr[-1] != '0' || CurPtr[0] == '.') { if (CurPtr[-1] != '0' || CurPtr[0] == '.') {
unsigned Radix = doLookAhead(CurPtr, 10); unsigned Radix = doLookAhead(CurPtr, 10);
bool isDecimal = Radix == 10; bool isHex = Radix == 16;
// Check for floating point literals. // Check for floating point literals.
if (isDecimal && (*CurPtr == '.' || *CurPtr == 'e')) { if (!isHex && (*CurPtr == '.' || *CurPtr == 'e')) {
++CurPtr; ++CurPtr;
return LexFloatLiteral(); return LexFloatLiteral();
} }
@@ -233,7 +211,7 @@ AsmToken AsmLexer::LexDigit() {
// integer, but that do fit in an unsigned one, we just convert them over. // integer, but that do fit in an unsigned one, we just convert them over.
unsigned long long UValue; unsigned long long UValue;
if (Result.getAsInteger(Radix, UValue)) if (Result.getAsInteger(Radix, UValue))
return ReturnError(TokStart, isDecimal ? "invalid decimal number" : return ReturnError(TokStart, !isHex ? "invalid decimal number" :
"invalid hexdecimal number"); "invalid hexdecimal number");
Value = (long long)UValue; Value = (long long)UValue;
} }
@@ -249,9 +227,15 @@ AsmToken AsmLexer::LexDigit() {
return AsmToken(AsmToken::Integer, Result, Value); return AsmToken(AsmToken::Integer, Result, Value);
} }
// Binary integer: 0b[01]+
if (*CurPtr == 'b') { if (*CurPtr == 'b') {
const char *NumStart = ++CurPtr; ++CurPtr;
// See if we actually have "0b" as part of something like "jmp 0b\n"
if (!isdigit(CurPtr[0])) {
--CurPtr;
StringRef Result(TokStart, CurPtr - TokStart);
return AsmToken(AsmToken::Integer, Result, 0);
}
const char *NumStart = CurPtr;
while (CurPtr[0] == '0' || CurPtr[0] == '1') while (CurPtr[0] == '0' || CurPtr[0] == '1')
++CurPtr; ++CurPtr;
@@ -272,7 +256,6 @@ AsmToken AsmLexer::LexDigit() {
return AsmToken(AsmToken::Integer, Result, Value); return AsmToken(AsmToken::Integer, Result, Value);
} }
// Hex integer: 0x[0-9a-fA-F]+
if (*CurPtr == 'x') { if (*CurPtr == 'x') {
++CurPtr; ++CurPtr;
const char *NumStart = CurPtr; const char *NumStart = CurPtr;
@@ -299,21 +282,17 @@ AsmToken AsmLexer::LexDigit() {
(int64_t)Result); (int64_t)Result);
} }
// Binary: 0[01]*[Bb], but not 0b. // Either octal or hexidecimal.
// Octal: 0[0-7]*
// Hexidecimal: [0][0-9a-fA-F]*[hH]
long long Value; long long Value;
unsigned Radix = doLookAhead(CurPtr, 8); unsigned Radix = doLookAhead(CurPtr, 8);
bool isBinary = Radix == 2; bool isHex = Radix == 16;
bool isOctal = Radix == 8;
StringRef Result(TokStart, CurPtr - TokStart); StringRef Result(TokStart, CurPtr - TokStart);
if (Result.getAsInteger(Radix, Value)) if (Result.getAsInteger(Radix, Value))
return ReturnError(TokStart, isOctal ? "invalid octal number" : return ReturnError(TokStart, !isHex ? "invalid octal number" :
isBinary ? "invalid binary number" :
"invalid hexdecimal number"); "invalid hexdecimal number");
// Consume the [bB][hH]. // Consume the [hH].
if (Radix == 2 || Radix == 16) if (Radix == 16)
++CurPtr; ++CurPtr;
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL // The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL

View File

@@ -1,15 +1,15 @@
// RUN: llvm-mc -triple i386-apple-darwin9 %s -filetype=obj -o - | macho-dump --dump-section-data | FileCheck %s // RUN: llvm-mc -triple i386-apple-darwin9 %s -filetype=obj -o - | macho-dump --dump-section-data | FileCheck %s
direction_labels: direction_labels:
8: nop 10: nop
jmp 8b jmp 10b
nop nop
jne 0f jne 0f
0: nop 0: nop
jne 0b jne 0b
jmp 9f jmp 11f
9: nop 11: nop
ret ret
// CHECK: ('cputype', 7) // CHECK: ('cputype', 7)
// CHECK: ('cpusubtype', 3) // CHECK: ('cpusubtype', 3)

View File

@@ -1,14 +0,0 @@
// RUN: llvm-mc -triple x86_64-unknown-unknown -x86-asm-syntax=intel %s | FileCheck %s
// rdar://12470373
// Checks to make sure we parse the binary suffix properly.
// CHECK: movl $1, %eax
mov eax, 01b
// CHECK: movl $2, %eax
mov eax, 10b
// CHECK: movl $3, %eax
mov eax, 11b
// CHECK: movl $3, %eax
mov eax, 11B
// CHECK: movl $2711, %eax
mov eax, 101010010111B