Re: [PATCH] lazyload.h: use an even more generic function pointer than FARPROC
- From
Johannes Sixt <j6t@kdbg.org>
- Date
- Sep 23, 2021, 06:33 UTC
- Message-ID
- <88717872-d31f-c1b8-0d0b-364b154f7734@kdbg.org>
- In-Reply-To
- <20210923060306.21073-1-carenas@gmail.com>
Am 23.09.21 um 08:03 schrieb Carlo Marcelo Arenas Belón:
Show 6 quoted lines
> gcc will helpfully raise a -Wcast-function-type warning when casting > between functions that might have incompatible return types > (ex: GetUserNameExW returns bool which is only half the size of the > return type from FARPROC which is long long), so create a new type that > could be used as a completely generic function pointer and cast through > it instead.
IIUC, this patch goes on top of mine in origin/js/win-lazyload-buildfix, right?
Show 61 quoted lines
>
> Additionaly remove the -Wno-incompatible-pointer-types temporary
> flag added in 27e0c3c (win32: allow building with pedantic mode
> enabled, 2021-09-03), as it will be no longer needed.
>
> Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
> ---
> compat/win32/lazyload.h | 9 ++++++---
> config.mak.dev | 1 -
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/compat/win32/lazyload.h b/compat/win32/lazyload.h
> index dc35cf080b..26c80f7833 100644
> --- a/compat/win32/lazyload.h
> +++ b/compat/win32/lazyload.h
> @@ -15,10 +15,12 @@
> * source, target);
> */
>
> +typedef void (*FARVOIDPROC)(void);
> +
> struct proc_addr {
> const char *const dll;
> const char *const function;
> - FARPROC pfunction;
> + FARVOIDPROC pfunction;
> unsigned initialized : 1;
> };
>
> @@ -38,7 +40,7 @@ struct proc_addr {
> #define INIT_PROC_ADDR(function) \
> (function = (proc_type_##function)get_proc_addr(&proc_addr_##function))
>
> -static inline FARPROC get_proc_addr(struct proc_addr *proc)
> +static inline FARVOIDPROC get_proc_addr(struct proc_addr *proc)
> {
> /* only do this once */
> if (!proc->initialized) {
> @@ -47,7 +49,8 @@ static inline FARPROC get_proc_addr(struct proc_addr *proc)
> hnd = LoadLibraryExA(proc->dll, NULL,
> LOAD_LIBRARY_SEARCH_SYSTEM32);
> if (hnd)
> - proc->pfunction = GetProcAddress(hnd, proc->function);
> + proc->pfunction = (FARVOIDPROD)GetProcAddress(hnd,
> + proc->function);
> }
> /* set ENOSYS if DLL or function was not found */
> if (!proc->pfunction)
> diff --git a/config.mak.dev b/config.mak.dev
> index c080ac0231..cdf043c52b 100644
> --- a/config.mak.dev
> +++ b/config.mak.dev
> @@ -12,7 +12,6 @@ DEVELOPER_CFLAGS += -pedantic
> DEVELOPER_CFLAGS += -Wpedantic
> ifneq ($(filter gcc5,$(COMPILER_FEATURES)),)
> DEVELOPER_CFLAGS += -Wno-pedantic-ms-format
> -DEVELOPER_CFLAGS += -Wno-incompatible-pointer-types
> endif
> endif
> DEVELOPER_CFLAGS += -Wdeclaration-after-statement
>