[PATCH] Fix dependency file escaping

Paul Robinson Paul_Robinson at playstation.sony.com
Tue Apr 28 12:11:39 PDT 2015


Rebase on top of the other depfile change.


http://reviews.llvm.org/D9208

Files:
  tools/clang/lib/Frontend/DependencyFile.cpp
  tools/clang/test/Frontend/dependency-gen-escaping.c

Index: tools/clang/lib/Frontend/DependencyFile.cpp
===================================================================
--- tools/clang/lib/Frontend/DependencyFile.cpp
+++ tools/clang/lib/Frontend/DependencyFile.cpp
@@ -293,8 +293,11 @@
 }
 
 /// PrintFilename - GCC escapes spaces, # and $, but apparently not ' or " or
-/// other scary characters. NMake/Jom has a different set of scary characters,
-/// but wraps filespecs in double-quotes to avoid misinterpreting them;
+/// other scary characters, because they aren't special to Make.  If one or
+/// more backslashes immediately precedes space or #, it is also escaped;
+/// backslash in other places is not escaped.
+/// NMake/Jom has a different set of scary characters, but wraps filespecs in
+/// double-quotes to avoid misinterpreting them; see
 /// https://msdn.microsoft.com/en-us/library/dd9y37ha.aspx for NMake info,
 /// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
 /// for Windows file-naming info.
@@ -311,9 +314,12 @@
     return;
   }
   for (unsigned i = 0, e = Filename.size(); i != e; ++i) {
-    if (Filename[i] == ' ' || Filename[i] == '#')
+    if (Filename[i] == ' ' || Filename[i] == '#') {
       OS << '\\';
-    else if (Filename[i] == '$') // $ is escaped by $$.
+      unsigned j = i;
+      while (j > 0 && Filename[--j] == '\\')
+        OS << '\\';
+    } else if (Filename[i] == '$') // $ is escaped by $$.
       OS << '$';
     OS << Filename[i];
   }
Index: tools/clang/test/Frontend/dependency-gen-escaping.c
===================================================================
--- tools/clang/test/Frontend/dependency-gen-escaping.c
+++ tools/clang/test/Frontend/dependency-gen-escaping.c
@@ -5,14 +5,17 @@
 // CHECK: \ \ \ \ .h
 // CHECK: $$$$.h
 // CHECK: \#\#.h
+// CHECK: a\b\\\#c\\\ d.h
 // NMAKE: "    .h"
 // NMAKE: "$$.h"
 // NMAKE: "##.h"
+// NMAKE: "a\b\#c\ d.h"
 // NMAKE-NOT: "
 // NMAKE: normal.h
 // NMAKE-NOT: "
 
 #include "    .h"
 #include "$$.h"
 #include "##.h"
+#include "a\b\#c\ d.h"
 #include "normal.h"

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9208.24568.patch
Type: text/x-patch
Size: 2053 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150428/8b30e63f/attachment.bin>


More information about the cfe-commits mailing list