]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Allow a PCH to be mapped to a different address
authorLIU Hao <lh_mouse@126.com>
Wed, 11 May 2022 14:42:53 +0000 (22:42 +0800)
committerJonathan Yong <10walls@gmail.com>
Tue, 6 May 2025 08:08:42 +0000 (08:08 +0000)
First, try mapping the PCH to its original address. If that fails, try
letting the system choose one; the PCH can be relocated thereafter.

Reference: https://gcc.gnu.org/pipermail/gcc-patches/2022-May/594556.html

2022-05-11  LIU Hao <lh_mouse@126.com>
Signed-off-by: Jonathan Yong <10walls@gmail.com>
PR pch/14940

gcc/ChangeLog:
* config/i386/host-mingw32.cc (mingw32_gt_pch_use_address):
Replace the loop that attempted to map the PCH only to its
original address with more adaptive operations

gcc/config/i386/host-mingw32.cc

index e083f49f3da7d097123f32a6a768ad4630d9cfdf..87804a5bb75547d85303a9a788b227a0a1e4c1c2 100644 (file)
@@ -135,7 +135,6 @@ mingw32_gt_pch_use_address (void *&addr, size_t size, int fd,
      and earlier, backslashes are invalid in object name.  So, we need
      to check if we are on Windows2000 or higher.  */
   OSVERSIONINFO version_info;
-  int r;
 
   version_info.dwOSVersionInfoSize = sizeof (version_info);
 
@@ -169,25 +168,24 @@ mingw32_gt_pch_use_address (void *&addr, size_t size, int fd,
       return -1;
     }
 
-  /* 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;
 }