r369986 - [clang-scan-deps] Minimizer: Correctly handle multi-line content with CR+LF line endings

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 26 18:02:45 PDT 2019


On Mon, 26 Aug 2019 at 16:17, Alexandre Ganea via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: aganea
> Date: Mon Aug 26 16:19:21 2019
> New Revision: 369986
>
> URL: http://llvm.org/viewvc/llvm-project?rev=369986&view=rev
> Log:
> [clang-scan-deps] Minimizer: Correctly handle multi-line content with
> CR+LF line endings
>
> Previously, an #error directive with quoted, multi-line content, along
> with CR+LF line endings wasn't handled correctly.
>
> Differential Revision: https://reviews.llvm.org/D66556
>
> Added:
>
> cfe/trunk/test/Lexer/minimize_source_to_dependency_directives_invalid_error.c
> Modified:
>     cfe/trunk/lib/Lex/DependencyDirectivesSourceMinimizer.cpp
>
> Modified: cfe/trunk/lib/Lex/DependencyDirectivesSourceMinimizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/DependencyDirectivesSourceMinimizer.cpp?rev=369986&r1=369985&r2=369986&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/DependencyDirectivesSourceMinimizer.cpp (original)
> +++ cfe/trunk/lib/Lex/DependencyDirectivesSourceMinimizer.cpp Mon Aug 26
> 16:19:21 2019
> @@ -196,15 +196,29 @@ static void skipString(const char *&Firs
>      ++First; // Finish off the string.
>  }
>
> -static void skipNewline(const char *&First, const char *End) {
> -  assert(isVerticalWhitespace(*First));
> -  ++First;
> +// Returns the length of EOL, either 0 (no end-of-line), 1 (\n) or 2
> (\r\n)
> +static unsigned isEOL(const char *First, const char *const End) {
>    if (First == End)
> -    return;
> +    return 0;
> +  if (End - First > 1 && isVerticalWhitespace(First[0]) &&
> +      isVerticalWhitespace(First[1]) && First[0] != First[1])
> +    return 2;
> +  return !!isVerticalWhitespace(First[0]);
> +}
> +
> +// Returns the length of the skipped newline
> +static unsigned skipNewline(const char *&First, const char *End) {
> +  if (First == End)
> +    return 0;
> +  assert(isVerticalWhitespace(*First));
> +  unsigned Len = isEOL(First, End);
> +  assert(Len && "expected newline");
> +  First += Len;
> +  return Len;
> +}
>
> -  // Check for "\n\r" and "\r\n".
> -  if (LLVM_UNLIKELY(isVerticalWhitespace(*First) && First[-1] !=
> First[0]))
> -    ++First;
> +static bool wasLineContinuation(const char *First, unsigned EOLLen) {
> +  return *(First - (int)EOLLen - 1) == '\\';
>  }
>
>  static void skipToNewlineRaw(const char *&First, const char *const End) {
> @@ -212,17 +226,21 @@ static void skipToNewlineRaw(const char
>      if (First == End)
>        return;
>
> -    if (isVerticalWhitespace(*First))
> +    unsigned Len = isEOL(First, End);
> +    if (Len)
>        return;
>
> -    while (!isVerticalWhitespace(*First))
> +    do {
>        if (++First == End)
>          return;
> +      Len = isEOL(First, End);
> +    } while (!Len);
>
>      if (First[-1] != '\\')
>        return;
>
> -    ++First; // Keep going...
> +    First += Len;
> +    // Keep skipping lines...
>    }
>  }
>
> @@ -277,7 +295,7 @@ static bool isQuoteCppDigitSeparator(con
>  }
>
>  static void skipLine(const char *&First, const char *const End) {
> -  do {
> +  for (;;) {
>      assert(First <= End);
>      if (First == End)
>        return;
> @@ -322,9 +340,10 @@ static void skipLine(const char *&First,
>        return;
>
>      // Skip over the newline.
> -    assert(isVerticalWhitespace(*First));
> -    skipNewline(First, End);
> -  } while (First[-2] == '\\'); // Continue past line-continuations.
> +    unsigned Len = skipNewline(First, End);
> +    if (!wasLineContinuation(First, Len)) // Continue past
> line-continuations.
> +      break;
> +  }
>  }
>
>  static void skipDirective(StringRef Name, const char *&First,
> @@ -379,6 +398,8 @@ void Minimizer::printToNewline(const cha
>      // Print out the string.
>      if (Last == End || Last == First || Last[-1] != '\\') {
>        append(First, reverseOverSpaces(First, Last));
> +      First = Last;
> +      skipNewline(First, End);
>        return;
>      }
>
>
> Added:
> cfe/trunk/test/Lexer/minimize_source_to_dependency_directives_invalid_error.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/minimize_source_to_dependency_directives_invalid_error.c?rev=369986&view=auto
>
> ==============================================================================
> ---
> cfe/trunk/test/Lexer/minimize_source_to_dependency_directives_invalid_error.c
> (added)
> +++
> cfe/trunk/test/Lexer/minimize_source_to_dependency_directives_invalid_error.c
> Mon Aug 26 16:19:21 2019
> @@ -0,0 +1,16 @@
> +// Test CF+LF are properly handled along with quoted, multi-line #error
> +// RUN: cat %s | unix2dos | %clang_cc1 -DOTHER
> -print-dependency-directives-minimized-source 2>&1 | FileCheck %s
>

You can't rely on 'unix2dos' existing across all our supported build
environments; this is causing a test failure for me.

I'm reverting for now. Maybe you could just check in a file with CRLF line
endings for this test (marked as binary rather than text so that clients
don't "fix" it)?


> +
> +#ifndef TEST
> +#error "message \
> +   more message \
> +   even more"
> +#endif
> +
> +#ifdef OTHER
> +#include <string>
> +#endif
> +
> +// CHECK:      #ifdef OTHER
> +// CHECK-NEXT: #include <string>
> +// CHECK-NEXT: #endif
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190826/7a5e1522/attachment-0001.html>


More information about the cfe-commits mailing list