From: Kalvis Duckmanton Date: Sun, 4 Jan 2026 17:54:48 +0000 (-0700) Subject: [PATCH v2]: pch, target: update host hooks for NetBSD and OpenBSD X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a2b5eeb5d24a44db9cb757906bd06912af15379;p=thirdparty%2Fgcc.git [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 --git a/gcc/config/host-netbsd.cc b/gcc/config/host-netbsd.cc index a6f12d0ecf0..a5b44994493 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 ee09df36182..ac5f913ed91 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; }