From: Saleem Abdulrasool Date: Thu, 14 Aug 2014 02:51:43 +0000 (+0000) Subject: MC: AsmLexer: handle multi-character CommentStrings correctly X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=0086358325e2dfea485fb6bd4bd2ba1897899d56;p=oota-llvm.git 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! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215615 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCParser/AsmLexer.h b/include/llvm/MC/MCParser/AsmLexer.h index 0b550ba627e..a9a30f17207 100644 --- a/include/llvm/MC/MCParser/AsmLexer.h +++ b/include/llvm/MC/MCParser/AsmLexer.h @@ -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; } diff --git a/lib/MC/MCParser/AsmLexer.cpp b/lib/MC/MCParser/AsmLexer.cpp index 145ad4a5612..5c8ec669ee8 100644 --- a/lib/MC/MCParser/AsmLexer.cpp +++ b/lib/MC/MCParser/AsmLexer.cpp @@ -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. diff --git a/test/MC/AArch64/single-slash.s b/test/MC/AArch64/single-slash.s new file mode 100644 index 00000000000..c4c266c6b06 --- /dev/null +++ b/test/MC/AArch64/single-slash.s @@ -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) diff --git a/test/MC/AsmParser/comments-x86-darwin.s b/test/MC/AsmParser/comments-x86-darwin.s new file mode 100644 index 00000000000..e201f48b1d7 --- /dev/null +++ b/test/MC/AsmParser/comments-x86-darwin.s @@ -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: