1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 19:42:54 +02:00

fix rdar://7997827 - Accept and ignore LL and ULL suffixes on integer literals.

Also fix 0b010 syntax to actually work while we're at it :-)

llvm-svn: 111876
This commit is contained in:
Chris Lattner 2010-08-24 00:43:25 +00:00
parent 696d6ee9d7
commit 115fdde871
2 changed files with 43 additions and 2 deletions

View File

@ -117,6 +117,13 @@ AsmToken AsmLexer::LexLineComment() {
return AsmToken(AsmToken::EndOfStatement, StringRef(CurPtr, 0)); return AsmToken(AsmToken::EndOfStatement, StringRef(CurPtr, 0));
} }
static void SkipIgnoredIntegerSuffix(const char *&CurPtr) {
if (CurPtr[0] == 'L' && CurPtr[1] == 'L')
CurPtr += 2;
if (CurPtr[0] == 'U' && CurPtr[1] == 'L' && CurPtr[2] == 'L')
CurPtr += 3;
}
/// LexDigit: First character is [0-9]. /// LexDigit: First character is [0-9].
/// Local Label: [0-9][:] /// Local Label: [0-9][:]
@ -143,6 +150,11 @@ AsmToken AsmLexer::LexDigit() {
else else
return ReturnError(TokStart, "Invalid decimal number"); return ReturnError(TokStart, "Invalid decimal number");
} }
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, Result, Value); return AsmToken(AsmToken::Integer, Result, Value);
} }
@ -165,9 +177,13 @@ AsmToken AsmLexer::LexDigit() {
StringRef Result(TokStart, CurPtr - TokStart); StringRef Result(TokStart, CurPtr - TokStart);
long long Value; long long Value;
if (Result.getAsInteger(2, Value)) if (Result.substr(2).getAsInteger(2, Value))
return ReturnError(TokStart, "Invalid binary number"); return ReturnError(TokStart, "Invalid binary number");
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, Result, Value); return AsmToken(AsmToken::Integer, Result, Value);
} }
@ -185,6 +201,10 @@ AsmToken AsmLexer::LexDigit() {
if (StringRef(TokStart, CurPtr - TokStart).getAsInteger(0, Result)) if (StringRef(TokStart, CurPtr - TokStart).getAsInteger(0, Result))
return ReturnError(TokStart, "Invalid hexadecimal number"); return ReturnError(TokStart, "Invalid hexadecimal number");
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, StringRef(TokStart, CurPtr - TokStart), return AsmToken(AsmToken::Integer, StringRef(TokStart, CurPtr - TokStart),
(int64_t)Result); (int64_t)Result);
} }
@ -198,6 +218,10 @@ AsmToken AsmLexer::LexDigit() {
if (Result.getAsInteger(8, Value)) if (Result.getAsInteger(8, Value))
return ReturnError(TokStart, "Invalid octal number"); return ReturnError(TokStart, "Invalid octal number");
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, Result, Value); return AsmToken(AsmToken::Integer, Result, Value);
} }

View File

@ -19,3 +19,20 @@ TEST2:
# CHECK: .quad 9 # CHECK: .quad 9
TEST3: TEST3:
.quad 9 .quad 9
# rdar://7997827
TEST4:
.quad 0b0100
.quad 4294967295
.quad 4294967295+1
.quad 4294967295LL+1
.quad 0b10LL + 07ULL + 0x42AULL
# CHECK: TEST4
# CHECK: .quad 4
# CHECK: .quad 4294967295
# CHECK: .quad 4294967296
# CHECK: .quad 4294967296
# CHECK: .quad 1075