https://gcc.gnu.org/g:1a2b5eeb5d24a44db9cb757906bd06912af15379
commit r16-6485-g1a2b5eeb5d24a44db9cb757906bd06912af15379 Author: Kalvis Duckmanton <[email protected]> Date: Sun Jan 4 10:54:48 2026 -0700 [PATCH v2]: pch, target: update host hooks for NetBSD and OpenBSD The PCH use_address hooks for NetBSD hosts have not yet been updated to allow compiled headers to be loaded at an address different from their preferred address. This change updates host-netbsd.cc:netbsd_gt_pch_use_address() thus: if a compiled header cannot be mapped at its preferred address, a region of memory is allocated and the base address of this region is passed back to the caller (ggc-common.cc:gt_pch_restore() I believe). Note that in this case the return value is 0, allowing gt_pch_restore() to load the header. In this respect the behaviour is slightly different from that of the use_address hook for other hosts (e.g. Linux). This change against GCC 15.2.0 builds on the work in pch/71934 (and target/58937) gcc/ * config/host-netbsd.cc (netbsd_gt_pch_use_address): Support PCH loading at addresses other than its preferred address. * config/host-openbsd.cc (openbsd_gt_pch_use_address): Likewise. Diff: --- gcc/config/host-netbsd.cc | 16 +++++++++++++++- gcc/config/host-openbsd.cc | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/gcc/config/host-netbsd.cc b/gcc/config/host-netbsd.cc index a6f12d0ecf0d..a5b449944939 100644 --- a/gcc/config/host-netbsd.cc +++ b/gcc/config/host-netbsd.cc @@ -78,7 +78,21 @@ netbsd_gt_pch_use_address (void *&base, size_t size, int fd, size_t offset) addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, offset); - return addr == base ? 1 : -1; + if (addr == base) + return 1; + + if (addr != (void *) MAP_FAILED) + munmap(addr, size); + + addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + if (addr == (void *) MAP_FAILED) + return -1; + + /* Signal to the caller that whilst memory has been allocated, it + must read the PCH data */ + base = addr; + return 0; } diff --git a/gcc/config/host-openbsd.cc b/gcc/config/host-openbsd.cc index ee09df361820..ac5f913ed914 100644 --- a/gcc/config/host-openbsd.cc +++ b/gcc/config/host-openbsd.cc @@ -78,7 +78,21 @@ openbsd_gt_pch_use_address (void *&base, size_t size, int fd, size_t offset) addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset); - return addr == base ? 1 : -1; + if (addr == base) + return 1; + + if (addr != (void *) MAP_FAILED) + munmap(addr, size); + + addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + if (addr == (void *) MAP_FAILED) + return -1; + + /* Signal to the caller that whilst memory has been allocated, it + must read the PCH data */ + base = addr; + return 0; }
