mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
MC: AsmLexer: handle multi-character CommentStrings correctly
As X86MCAsmInfoDarwin uses '##' as CommentString although a single '#' starts a comment a workaround for this special case is added. Fixes divisions in constant expressions for the AArch64 assembler and other targets which use '//' as CommentString. Patch by Janne Grunau! llvm-svn: 215615
This commit is contained in:
parent
ada52150c3
commit
9b9af49013
@ -49,7 +49,7 @@ public:
|
||||
|
||||
const AsmToken peekTok(bool ShouldSkipSpace = true) override;
|
||||
|
||||
bool isAtStartOfComment(char Char);
|
||||
bool isAtStartOfComment(const char *Ptr);
|
||||
bool isAtStatementSeparator(const char *Ptr);
|
||||
|
||||
const MCAsmInfo &getMAI() const { return MAI; }
|
||||
|
@ -417,7 +417,7 @@ AsmToken AsmLexer::LexQuote() {
|
||||
StringRef AsmLexer::LexUntilEndOfStatement() {
|
||||
TokStart = CurPtr;
|
||||
|
||||
while (!isAtStartOfComment(*CurPtr) && // Start of line comment.
|
||||
while (!isAtStartOfComment(CurPtr) && // Start of line comment.
|
||||
!isAtStatementSeparator(CurPtr) && // End of statement marker.
|
||||
*CurPtr != '\n' && *CurPtr != '\r' &&
|
||||
(*CurPtr != 0 || CurPtr != CurBuf.end())) {
|
||||
@ -458,9 +458,17 @@ const AsmToken AsmLexer::peekTok(bool ShouldSkipSpace) {
|
||||
return Token;
|
||||
}
|
||||
|
||||
bool AsmLexer::isAtStartOfComment(char Char) {
|
||||
// FIXME: This won't work for multi-character comment indicators like "//".
|
||||
return Char == *MAI.getCommentString();
|
||||
bool AsmLexer::isAtStartOfComment(const char *Ptr) {
|
||||
const char *CommentString = MAI.getCommentString();
|
||||
|
||||
if (CommentString[1] == '\0')
|
||||
return CommentString[0] == Ptr[0];
|
||||
|
||||
// FIXME: special case for the bogus "##" comment string in X86MCAsmInfoDarwin
|
||||
if (CommentString[1] == '#')
|
||||
return CommentString[0] == Ptr[0];
|
||||
|
||||
return strncmp(Ptr, CommentString, strlen(CommentString)) == 0;
|
||||
}
|
||||
|
||||
bool AsmLexer::isAtStatementSeparator(const char *Ptr) {
|
||||
@ -473,7 +481,7 @@ AsmToken AsmLexer::LexToken() {
|
||||
// This always consumes at least one character.
|
||||
int CurChar = getNextChar();
|
||||
|
||||
if (isAtStartOfComment(CurChar)) {
|
||||
if (isAtStartOfComment(TokStart)) {
|
||||
// If this comment starts with a '#', then return the Hash token and let
|
||||
// the assembler parser see if it can be parsed as a cpp line filename
|
||||
// comment. We do this only if we are at the start of a line.
|
||||
|
6
test/MC/AArch64/single-slash.s
Normal file
6
test/MC/AArch64/single-slash.s
Normal file
@ -0,0 +1,6 @@
|
||||
// RUN: llvm-mc -triple aarch64-none-linux-gnu < %s | FileCheck %s
|
||||
|
||||
// Test that a single slash is not mistaken as the start of comment.
|
||||
|
||||
//CHECK: movz x0, #0x10
|
||||
movz x0, #(32 / 2)
|
14
test/MC/AsmParser/comments-x86-darwin.s
Normal file
14
test/MC/AsmParser/comments-x86-darwin.s
Normal file
@ -0,0 +1,14 @@
|
||||
// RUN: llvm-mc -triple x86_64-apple-darwin %s 2>&1 | FileCheck %s
|
||||
# ensure that single '#' comments are worink as expected on x86 darwin
|
||||
.align 3 # test single hash after align
|
||||
// CHECK: .align 3
|
||||
foo: # single hash should be ignored as comment
|
||||
// CHECK-LABEL: foo:
|
||||
movl %esp, %ebp # same after an instruction
|
||||
// CHECK: movl %esp, %ebp
|
||||
# movl %esp, %ebp ## start of the line
|
||||
// CHECK-NOT: movl %esp, %ebp
|
||||
# movl %esp, %ebp ## not quite start of the line
|
||||
// CHECK-NOT: movl %esp, %ebp
|
||||
bar:
|
||||
// CHECK-LABEL: bar:
|
Loading…
x
Reference in New Issue
Block a user