Message ID | bfeed44f-f873-edc0-f4df-8c34502a956b@126.com |
---|---|
State | New |
Headers | show |
Series | Remove size limit of PCH | expand |
On Tue, 2022-05-10 at 19:35 +0800, LIU Hao via Gcc-patches wrote: > Subject: [PATCH] Remove size limit of PCH Make it "Remove size limit of PCH [PR14940]", so once it's committed a message will show up in bugzilla. > Reference: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14940 > Signed-off-by: LIU Hao <lh_mouse@126.com> You'll need to add yourself into "Contributing under the DCO" section in MAINTAINERS file first to use Signed-off-by, I guess. A ChangeLog entry should be included in the commit message like gcc/ PR pch/14940 * config/i386/host-mingw32.cc (pch_VA_max_size): Remove. (mingw32_gt_pch_get_address): ... ... I know almost nothing about Windoge/MinGW so the technical review is left for others.
在 2022-05-10 20:00, Xi Ruoyao 写道: > On Tue, 2022-05-10 at 19:35 +0800, LIU Hao via Gcc-patches wrote: > >> Subject: [PATCH] Remove size limit of PCH > > Make it "Remove size limit of PCH [PR14940]", so once it's committed a > message will show up in bugzilla. > Here is the revised patch.
On Tue, May 10, 2022 at 09:30:03PM +0800, LIU Hao via Gcc-patches wrote: > From 2e314baed84fd80b3b3c4c67787a032b86dd54dc Mon Sep 17 00:00:00 2001 > From: LIU Hao <lh_mouse@126.com> > Date: Tue, 10 May 2022 13:19:07 +0800 > Subject: [PATCH] [PR14940] Remove size limit of PCH > > There shouldn't be such a limit in practice. > > 2022-05-03 LIU Hao <lh_mouse@126.com> > > PR pch/14940 > * config/i386/host-mingw32.cc (pch_VA_max_size): Remove. > (mingw32_gt_pch_get_address): Remove size limit. This looks reasonable, but doesn't contain the most important part. As mentioned in https://gcc.gnu.org/r12-5855 the generic part can now support relocation of PCH, so it is fine if it is mapped at some other address, it is preferrable if it is mapped at the same address as it was written for, but if not, the generic code can relocate it. So, beyond your changes, I'd suggest to change: /* 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) { w32_error (__FUNCTION__, __FILE__, __LINE__, "MapViewOfFileEx"); CloseHandle(mmap_handle); return -1; } IMHO you can just drop the loop, sleep of half a second is almost certainly slower than the relocation handling, so I'd just 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; } addr = mmap_addr; This, if it mmaps the file at the right address, nice, if not, let the caller know (through updating addr) that it needs to relocate it, but if the mapping failed, fail. Jakub
On 5/10/22 13:30, LIU Hao wrote: > 在 2022-05-10 20:00, Xi Ruoyao 写道: >> On Tue, 2022-05-10 at 19:35 +0800, LIU Hao via Gcc-patches wrote: >> >>> Subject: [PATCH] Remove size limit of PCH >> >> Make it "Remove size limit of PCH [PR14940]", so once it's committed a >> message will show up in bugzilla. >> > > Here is the revised patch. > > > > > Thanks, I will commit soon if there are no objections.
在 2022-05-10 22:28, Jakub Jelinek 写道: > > This looks reasonable, but doesn't contain the most important part. > As mentioned in https://gcc.gnu.org/r12-5855 > the generic part can now support relocation of PCH, so it is fine if it is > mapped at some other address, it is preferrable if it is mapped at the same > address as it was written for, but if not, the generic code can relocate it. > > (... ...) > > IMHO you can just drop the loop, sleep of half a second is almost certainly > slower than the relocation handling, so I'd just Thanks for the hint. I have very little knowledge about how PCH works in GCC, thus I'm gonna propose a patch to MSYS2 and see how it works. This can be committed to GCC later, after having been tested through many packages.
diff --git a/gcc/config/i386/host-mingw32.cc b/gcc/config/i386/host-mingw32.cc index 3b0d83ffc60..f915b85abd0 100644 --- a/gcc/config/i386/host-mingw32.cc +++ b/gcc/config/i386/host-mingw32.cc @@ -44,9 +44,6 @@ static size_t mingw32_gt_pch_alloc_granularity (void); static inline void w32_error(const char*, const char*, int, const char*); -/* FIXME: Is this big enough? */ -static const size_t pch_VA_max_size = 128 * 1024 * 1024; - /* Granularity for reserving address space. */ static size_t va_granularity = 0x10000; @@ -88,9 +85,6 @@ static void * mingw32_gt_pch_get_address (size_t size, int) { void* res; - size = (size + va_granularity - 1) & ~(va_granularity - 1); - if (size > pch_VA_max_size) - return NULL; /* FIXME: We let system determine base by setting first arg to NULL. Allocating at top of available address space avoids unnecessary @@ -100,7 +94,7 @@ mingw32_gt_pch_get_address (size_t size, int) If we allocate at bottom we need to reserve the address as early as possible and at the same point in each invocation. */ - res = VirtualAlloc (NULL, pch_VA_max_size, + res = VirtualAlloc (NULL, size, MEM_RESERVE | MEM_TOP_DOWN, PAGE_NOACCESS); if (!res) @@ -150,7 +144,7 @@ mingw32_gt_pch_use_address (void *&addr, size_t size, int fd, /* Offset must be also be a multiple of allocation granularity for 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;