[MCParser] Correctly handle CRLF line ends when consuming line comments
authorTozer <stephen.tozer@sony.com>
Tue, 17 Aug 2021 14:38:45 +0000 (15:38 +0100)
committerTozer <stephen.tozer@sony.com>
Tue, 17 Aug 2021 14:52:51 +0000 (15:52 +0100)
Fixes issue: https://bugs.llvm.org/show_bug.cgi?id=47983

The AsmLexer currently has an issue with lexing line comments in files
with CRLF line endings, in which it reads the carriage return as being
part of the line comment. This causes an error for certain valid comment
layouts; this patch fixes this by excluding the carriage return from the
line comment.

Differential Revision: https://reviews.llvm.org/D90234

llvm/.gitattributes
llvm/lib/MC/MCParser/AsmLexer.cpp
llvm/test/tools/llvm-mca/directives-handle-crlf.s [new file with mode: 0644]

index 48ddf2f..b41ae6a 100644 (file)
@@ -13,7 +13,8 @@ test/tools/llvm-strings/Inputs/numbers binary
 test/MC/AsmParser/incbin_abcd binary
 test/YAMLParser/spec-09-02.test binary
 
-# This file must have CRLF line endings, therefore git should treat it as
+# These files must have CRLF line endings, therefore git should treat them as
 # binary and not autoconvert line endings (for example, when core.autocrlf is
 # on).
 test/MC/AsmParser/preserve-comments-crlf.s binary
+test/tools/llvm-mca/directives-handle-crlf.s binary
index e328ba5..bf9b9e9 100644 (file)
@@ -228,6 +228,7 @@ AsmToken AsmLexer::LexLineComment() {
   int CurChar = getNextChar();
   while (CurChar != '\n' && CurChar != '\r' && CurChar != EOF)
     CurChar = getNextChar();
+  const char *NewlinePtr = CurPtr;
   if (CurChar == '\r' && CurPtr != CurBuf.end() && *CurPtr == '\n')
     ++CurPtr;
 
@@ -235,7 +236,7 @@ AsmToken AsmLexer::LexLineComment() {
   if (CommentConsumer) {
     CommentConsumer->HandleComment(
         SMLoc::getFromPointer(CommentTextStart),
-        StringRef(CommentTextStart, CurPtr - 1 - CommentTextStart));
+        StringRef(CommentTextStart, NewlinePtr - 1 - CommentTextStart));
   }
 
   IsAtStartOfLine = true;
diff --git a/llvm/test/tools/llvm-mca/directives-handle-crlf.s b/llvm/test/tools/llvm-mca/directives-handle-crlf.s
new file mode 100644 (file)
index 0000000..aa5c0fc
--- /dev/null
@@ -0,0 +1,4 @@
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown %s\r
+# LLVM-MCA-BEGIN foo\r
+addl   $42, %eax\r
+# LLVM-MCA-END\r