[llvm] r315943 - [MC] Lex CRLF as one token

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 16 15:20:03 PDT 2017


Author: rnk
Date: Mon Oct 16 15:20:03 2017
New Revision: 315943

URL: http://llvm.org/viewvc/llvm-project?rev=315943&view=rev
Log:
[MC] Lex CRLF as one token

This will prevent doubling of line endings when parsing assembly and
emitting assembly.

Otherwise we'd parse the directive, consume the end of statement, hit
the next end of statement, and emit a fresh newline.

Added:
    llvm/trunk/test/MC/X86/crlf.test
Modified:
    llvm/trunk/lib/MC/MCParser/AsmLexer.cpp

Modified: llvm/trunk/lib/MC/MCParser/AsmLexer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmLexer.cpp?rev=315943&r1=315942&r2=315943&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmLexer.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmLexer.cpp Mon Oct 16 15:20:03 2017
@@ -606,8 +606,16 @@ AsmToken AsmLexer::LexToken() {
       return LexToken(); // Ignore whitespace.
     else
       return AsmToken(AsmToken::Space, StringRef(TokStart, CurPtr - TokStart));
+  case '\r': {
+    IsAtStartOfLine = true;
+    IsAtStartOfStatement = true;
+    // If this is a CR followed by LF, treat that as one token.
+    if (CurPtr != CurBuf.end() && *CurPtr == '\n')
+      ++CurPtr;
+    return AsmToken(AsmToken::EndOfStatement,
+                    StringRef(TokStart, CurPtr - TokStart));
+  }
   case '\n':
-  case '\r':
     IsAtStartOfLine = true;
     IsAtStartOfStatement = true;
     return AsmToken(AsmToken::EndOfStatement, StringRef(TokStart, 1));

Added: llvm/trunk/test/MC/X86/crlf.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/crlf.test?rev=315943&view=auto
==============================================================================
--- llvm/trunk/test/MC/X86/crlf.test (added)
+++ llvm/trunk/test/MC/X86/crlf.test Mon Oct 16 15:20:03 2017
@@ -0,0 +1,5 @@
+RUN: printf '\r\n\r\n' | llvm-mc -as-lex | FileCheck %s
+There should only be two end of statements.
+CHECK: EndOfStatement
+CHECK: EndOfStatement
+CHECK-NOT: EndOfStatement




More information about the llvm-commits mailing list