[llvm] r267556 - Use gcc's rules for parsing gcc-style response files

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 26 07:20:50 PDT 2016


Hi,

Looks like this is still failing on the ps4 bot:

http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/4148/steps/test/logs/stdio

Cheers,
Rafael


On 26 April 2016 at 09:53, Nico Weber via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: nico
> Date: Tue Apr 26 08:53:56 2016
> New Revision: 267556
>
> URL: http://llvm.org/viewvc/llvm-project?rev=267556&view=rev
> Log:
> Use gcc's rules for parsing gcc-style response files
>
> In gcc, \ escapes every character in response files. It is true that this makes
> it harder to mention Windows files in rsp files, but not doing this means clang
> disagrees with gcc, and also disagrees with the shell (on non-Windows) which
> rsp file quoting is supposed to match. clang isn't free to choose what to do
> here.
>
> In general, the idea for response files is to take bits of your command line
> and write them to a file unchanged, and have things work the same way. Since
> the command line would've been interpreted by the shell, things in the rsp file
> need to be subject to the same shell quoting rules.
>
> People who want to put Windows-style paths in their response files either need
> to do any of:
> * escape their backslashes
> * or use clang-cl which uses cl.exe/cmd.exe quoting rules
> * pass --rsp-quoting=windows to clang to tell it to use
>   cl.exe/cmd.exe quoting rules for response files.
>
> Fixes PR27464.
> http://reviews.llvm.org/D19417
>
> Modified:
>     llvm/trunk/lib/Support/CommandLine.cpp
>     llvm/trunk/unittests/Support/CommandLineTest.cpp
>
> Modified: llvm/trunk/lib/Support/CommandLine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=267556&r1=267555&r2=267556&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/CommandLine.cpp (original)
> +++ llvm/trunk/lib/Support/CommandLine.cpp Tue Apr 26 08:53:56 2016
> @@ -515,8 +515,6 @@ static bool isWhitespace(char C) { retur
>
>  static bool isQuote(char C) { return C == '\"' || C == '\''; }
>
> -static bool isGNUSpecial(char C) { return strchr("\\\"\' ", C); }
> -
>  void cl::TokenizeGNUCommandLine(StringRef Src, StringSaver &Saver,
>                                  SmallVectorImpl<const char *> &NewArgv,
>                                  bool MarkEOLs) {
> @@ -534,9 +532,8 @@ void cl::TokenizeGNUCommandLine(StringRe
>          break;
>      }
>
> -    // Backslashes can escape backslashes, spaces, and other quotes.  Otherwise
> -    // they are literal.  This makes it much easier to read Windows file paths.
> -    if (I + 1 < E && Src[I] == '\\' && isGNUSpecial(Src[I + 1])) {
> +    // Backslash escapes the next character.
> +    if (I + 1 < E && Src[I] == '\\') {
>        ++I; // Skip the escape.
>        Token.push_back(Src[I]);
>        continue;
> @@ -546,8 +543,8 @@ void cl::TokenizeGNUCommandLine(StringRe
>      if (isQuote(Src[I])) {
>        char Quote = Src[I++];
>        while (I != E && Src[I] != Quote) {
> -        // Backslashes are literal, unless they escape a special character.
> -        if (Src[I] == '\\' && I + 1 != E && isGNUSpecial(Src[I + 1]))
> +        // Backslash escapes the next character.
> +        if (Src[I] == '\\' && I + 1 != E)
>            ++I;
>          Token.push_back(Src[I]);
>          ++I;
>
> Modified: llvm/trunk/unittests/Support/CommandLineTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CommandLineTest.cpp?rev=267556&r1=267555&r2=267556&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Support/CommandLineTest.cpp (original)
> +++ llvm/trunk/unittests/Support/CommandLineTest.cpp Tue Apr 26 08:53:56 2016
> @@ -165,11 +165,12 @@ void testCommandLineTokenizer(ParserFunc
>  }
>
>  TEST(CommandLineTest, TokenizeGNUCommandLine) {
> -  const char *Input = "foo\\ bar \"foo bar\" \'foo bar\' 'foo\\\\bar' "
> -                      "foo\"bar\"baz C:\\src\\foo.cpp \"C:\\src\\foo.cpp\"";
> -  const char *const Output[] = { "foo bar", "foo bar", "foo bar", "foo\\bar",
> -                                 "foobarbaz", "C:\\src\\foo.cpp",
> -                                 "C:\\src\\foo.cpp" };
> +  const char *Input =
> +      "foo\\ bar \"foo bar\" \'foo bar\' 'foo\\\\bar' -DFOO=bar\\(\\) "
> +      "foo\"bar\"baz C:\\\\src\\\\foo.cpp \"C:\\src\\foo.cpp\"";
> +  const char *const Output[] = {
> +      "foo bar",     "foo bar",   "foo bar",          "foo\\bar",
> +      "-DFOO=bar()", "foobarbaz", "C:\\src\\foo.cpp", "C:srcfoo.cpp"};
>    testCommandLineTokenizer(cl::TokenizeGNUCommandLine, Input, Output,
>                             array_lengthof(Output));
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list