summaryrefslogtreecommitdiffstats
path: root/PATCHES/windows-lrealpath-no-force-lowercase-nor-backslash.patch
blob: 697469d87751d0a92eead5c994fc74c2cfee0f7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
diff -ruNb gcc-7.1.0.orig/libiberty/lrealpath.c gcc-7.1.0/libiberty/lrealpath.c
--- gcc-7.1.0.orig/libiberty/lrealpath.c	2017-01-04 12:30:51.000000000 +0100
+++ gcc-7.1.0/libiberty/lrealpath.c	2017-05-28 00:13:05.844315144 +0200
@@ -138,15 +138,26 @@
   {
     char buf[MAX_PATH];
     char* basename;
+    char* slash;
     DWORD len = GetFullPathName (filename, MAX_PATH, buf, &basename);
     if (len == 0 || len > MAX_PATH - 1)
       return strdup (filename);
     else
       {
-	/* The file system is case-preserving but case-insensitive,
-	   Canonicalize to lowercase, using the codepage associated
-	   with the process locale.  */
-        CharLowerBuff (buf, len);
+	/* Turn all back slashes back back into forward slashes
+	   and don't make it all lowercase.
+	   Rationale:
+	   Windows is as happy with / as it is with \. This will
+	   have been built using Cygwin, MSYS* or cross-compiled
+	   from a system where dirsep is / so it is cleaner just
+	   to keep the dirseps as / (and the case un-modified).
+	   This way, the value will be consistent with the build
+	   system and string operations (be they internal to this
+	   software or external to it, e.g. processing map files
+	   with sed) work as expected.  */
+	slash = buf;
+	while ((slash = strchr(slash,'\\')) !=  NULL)
+	  *slash = '/';
         return strdup (buf);
       }
   }