https://gcc.gnu.org/g:16e301adf7b653c72d5c3cae1c7287877f3f20ff

commit r16-399-g16e301adf7b653c72d5c3cae1c7287877f3f20ff
Author: LIU Hao <lh_mo...@126.com>
Date:   Wed May 11 22:42:53 2022 +0800

    Allow a PCH to be mapped to a different address
    
    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_mo...@126.com>
    Signed-off-by: Jonathan Yong <10wa...@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

Diff:
---
 gcc/config/i386/host-mingw32.cc | 32 +++++++++++++++-----------------
 1 file changed, 15 insertions(+), 17 deletions(-)

diff --git a/gcc/config/i386/host-mingw32.cc b/gcc/config/i386/host-mingw32.cc
index e083f49f3da7..87804a5bb755 100644
--- a/gcc/config/i386/host-mingw32.cc
+++ b/gcc/config/i386/host-mingw32.cc
@@ -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;
 }

Reply via email to