OSDN Git Service

[MC] Fix ICE with non-newline terminated input
authorScott Linder <Scott.Linder@amd.com>
Wed, 9 Dec 2020 23:13:15 +0000 (23:13 +0000)
committerScott Linder <Scott.Linder@amd.com>
Wed, 9 Dec 2020 23:39:32 +0000 (23:39 +0000)
There is an explicit option for the lexer to support this, but we crash
when `-preserve-comments` is enabled because it checks for
`getTok().getString().empty()` to detect the case. This doesn't
work currently because the lexer reports this case as a string of length
1, containing a null byte.

Change the lexer to instead report this case via an empty string, as the
null terminator isn't logically a part of the textual input, and the
check for `.empty()` seems natural and obvious in the calling code.

Reviewed By: niravd

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

llvm/lib/MC/MCParser/AsmLexer.cpp
llvm/test/MC/AsmParser/Inputs/no-newline-at-end-of-file.s [new file with mode: 0644]
llvm/test/MC/AsmParser/preserve-comments.s

index 5c9d126..1fa22ab 100644 (file)
@@ -715,7 +715,7 @@ AsmToken AsmLexer::LexToken() {
   if (CurChar == EOF && !IsAtStartOfStatement && EndStatementAtEOF) {
     IsAtStartOfLine = true;
     IsAtStartOfStatement = true;
-    return AsmToken(AsmToken::EndOfStatement, StringRef(TokStart, 1));
+    return AsmToken(AsmToken::EndOfStatement, StringRef(TokStart, 0));
   }
   IsAtStartOfLine = false;
   bool OldIsAtStartOfStatement = IsAtStartOfStatement;
diff --git a/llvm/test/MC/AsmParser/Inputs/no-newline-at-end-of-file.s b/llvm/test/MC/AsmParser/Inputs/no-newline-at-end-of-file.s
new file mode 100644 (file)
index 0000000..a746462
--- /dev/null
@@ -0,0 +1 @@
+.text
\ No newline at end of file
index 27c5b2e..9cace04 100644 (file)
@@ -1,5 +1,6 @@
        #RUN: llvm-mc -preserve-comments -n -triple i386-linux-gnu < %s > %t
        #RUN: diff -b %s %t
+       #RUN: llvm-mc -preserve-comments -n -triple i386-linux-gnu < %p/Inputs/no-newline-at-end-of-file.s | FileCheck %s
        .text
 
 foo:   #Comment here
@@ -11,3 +12,6 @@ foo:  #Comment here
        #endif
        .ident  "clang version 3.9.0"
        .section        ".note.GNU-stack","",@progbits
+
+       #Confirm we don't crash on inputs without a terminating newline.
+       #CHECK: .text