diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2014-08-14 02:51:43 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2014-08-14 02:51:43 +0000 |
commit | bb67af44e18d79a21a26830bfe86d5d8eee06931 (patch) | |
tree | 5e498de374b3b456144ebd81f0cad2914d5b70fe | |
parent | caf1c6e3dd226f62e622fedc106d38389c25d3c8 (diff) | |
download | bcm5719-llvm-bb67af44e18d79a21a26830bfe86d5d8eee06931.tar.gz bcm5719-llvm-bb67af44e18d79a21a26830bfe86d5d8eee06931.zip |
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
-rw-r--r-- | llvm/include/llvm/MC/MCParser/AsmLexer.h | 2 | ||||
-rw-r--r-- | llvm/lib/MC/MCParser/AsmLexer.cpp | 18 | ||||
-rw-r--r-- | llvm/test/MC/AArch64/single-slash.s | 6 | ||||
-rw-r--r-- | llvm/test/MC/AsmParser/comments-x86-darwin.s | 14 |
4 files changed, 34 insertions, 6 deletions
diff --git a/llvm/include/llvm/MC/MCParser/AsmLexer.h b/llvm/include/llvm/MC/MCParser/AsmLexer.h index 0b550ba627e..a9a30f17207 100644 --- a/llvm/include/llvm/MC/MCParser/AsmLexer.h +++ b/llvm/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/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp index 145ad4a5612..5c8ec669ee8 100644 --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/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/llvm/test/MC/AArch64/single-slash.s b/llvm/test/MC/AArch64/single-slash.s new file mode 100644 index 00000000000..c4c266c6b06 --- /dev/null +++ b/llvm/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/llvm/test/MC/AsmParser/comments-x86-darwin.s b/llvm/test/MC/AsmParser/comments-x86-darwin.s new file mode 100644 index 00000000000..e201f48b1d7 --- /dev/null +++ b/llvm/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: |