[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-bugs
Subject:    [Bug pch/105858] MinGW-w64 64-bit build with --libstdcxx-pch: fatal error: cannot write PCH file: re
From:       "brechtsanders at users dot sourceforge.net via Gcc-bugs" <gcc-bugs () gcc ! gnu ! org>
Date:       2022-12-30 13:26:57
Message-ID: bug-105858-4-g6fkkWRiTC () http ! gcc ! gnu ! org/bugzilla/
[Download RAW message or body]

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105858

--- Comment #8 from Brecht Sanders <brechtsanders at users dot sourceforge.net> ---
I seem to be having some success after applying patches based on:
https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-gcc/0010-Fix-using-large-PCH.patch
 https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-gcc/0021-PR14940-Allow-a-PCH-to-be-mapped-to-a-different-addr.patch


My patch for GCC 12.2.0 looks like this:
patch -ulbf gcc/config/i386/host-mingw32.cc << EOF
@@ -46,5 +46,2 @@

-/* FIXME: Is this big enough?  */
-static const size_t pch_VA_max_size  = 128 * 1024 * 1024;
-
 /* Granularity for reserving address space.  */
@@ -90,5 +87,2 @@
   void* res;
-  size = (size + va_granularity - 1) & ~(va_granularity - 1);
-  if (size > pch_VA_max_size)
-    return NULL;

@@ -102,3 +96,3 @@

-  res = VirtualAlloc (NULL, pch_VA_max_size,
+  res = VirtualAlloc (NULL, size,
                      MEM_RESERVE | MEM_TOP_DOWN,
@@ -143,3 +137,2 @@
   OSVERSIONINFO version_info;
-  int r;

@@ -152,3 +145,3 @@
      this to work.  We can't change the offset. */
-  if ((offset & (va_granularity - 1)) != 0 || size > pch_VA_max_size)
+  if ((offset & (va_granularity - 1)) != 0)
     return -1;
@@ -177,21 +170,20 @@

-  /* Retry five times, as here might occure a race with multiple gcc's
-     instances at same time.  */
-  for (r = 0; r < 5; r++)
-   {
-      mmap_addr = MapViewOfFileEx (mmap_handle, FILE_MAP_COPY, 0, offset,
-                                  size, addr);
-      if (mmap_addr == addr)
-       break;
-      if (r != 4)
-        Sleep (500);
-   }
-
-  if (mmap_addr != addr)
+  /* Try mapping the file at \`addr\`.  */
+  mmap_addr = MapViewOfFileEx (mmap_handle, FILE_MAP_COPY, 0, offset,
+                              size, addr);
+  if (mmap_addr == NULL)
     {
-      w32_error (__FUNCTION__, __FILE__, __LINE__, "MapViewOfFileEx");
-      CloseHandle(mmap_handle);
-      return  -1;
+      /* We could not map the file at its original address, so let the
+        system choose a different one. The PCH can be relocated later.  */
+      mmap_addr = MapViewOfFileEx (mmap_handle, FILE_MAP_COPY, 0, offset,
+                                  size, NULL);
+      if (mmap_addr == NULL)
+       {
+         w32_error (__FUNCTION__, __FILE__, __LINE__, "MapViewOfFileEx");
+         CloseHandle(mmap_handle);
+         return  -1;
+       }
     }

+  addr = mmap_addr;
   return 1;
EOF=


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic