[PATCH] win32: avoid discarding the exception handler

marcandre.lureau@redhat.com posted 1 patch 7 months, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20230925113942.267924-1-marcandre.lureau@redhat.com
Maintainers: Stefan Weil <sw@weilnetz.de>
include/qemu/compiler.h | 6 ++++++
util/oslib-win32.c      | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
[PATCH] win32: avoid discarding the exception handler
Posted by marcandre.lureau@redhat.com 7 months, 1 week ago
From: Marc-André Lureau <marcandre.lureau@redhat.com>

In all likelihood, the compiler with lto doesn't see the function being
used, from assembly macro __try1. Help it by marking the function has
being used.

Fixes:
https://gitlab.com/qemu-project/qemu/-/issues/1904

Fixes: commit d89f30b4df ("win32: wrap socket close() with an exception handler")

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/qemu/compiler.h | 6 ++++++
 util/oslib-win32.c      | 2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
index a309f90c76..5c7f63f351 100644
--- a/include/qemu/compiler.h
+++ b/include/qemu/compiler.h
@@ -197,4 +197,10 @@
 #define BUILTIN_SUBCLL_BROKEN
 #endif
 
+#if __has_attribute(used)
+# define QEMU_USED __attribute__((used))
+#else
+# define QEMU_USED
+#endif
+
 #endif /* COMPILER_H */
diff --git a/util/oslib-win32.c b/util/oslib-win32.c
index 19a0ea7fbe..55b0189dc3 100644
--- a/util/oslib-win32.c
+++ b/util/oslib-win32.c
@@ -479,7 +479,7 @@ int qemu_bind_wrap(int sockfd, const struct sockaddr *addr,
     return ret;
 }
 
-EXCEPTION_DISPOSITION
+QEMU_USED EXCEPTION_DISPOSITION
 win32_close_exception_handler(struct _EXCEPTION_RECORD *exception_record,
                               void *registration, struct _CONTEXT *context,
                               void *dispatcher)
-- 
2.41.0


Re: [PATCH] win32: avoid discarding the exception handler
Posted by Thomas Huth 7 months, 1 week ago
On 25/09/2023 13.39, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> In all likelihood, the compiler with lto doesn't see the function being
> used, from assembly macro __try1. Help it by marking the function has
> being used.
> 
> Fixes:

I'd suggest to use "Resolves:" for bug tickets so that they get auto-closed 
when the patch is merged.

> https://gitlab.com/qemu-project/qemu/-/issues/1904
> 
> Fixes: commit d89f30b4df ("win32: wrap socket close() with an exception handler")
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   include/qemu/compiler.h | 6 ++++++
>   util/oslib-win32.c      | 2 +-
>   2 files changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
> index a309f90c76..5c7f63f351 100644
> --- a/include/qemu/compiler.h
> +++ b/include/qemu/compiler.h
> @@ -197,4 +197,10 @@
>   #define BUILTIN_SUBCLL_BROKEN
>   #endif
>   
> +#if __has_attribute(used)
> +# define QEMU_USED __attribute__((used))
> +#else
> +# define QEMU_USED
> +#endif

I first thought we could maybe do it without the detour via the QEMU_USED 
macro, but seems like Clang just learnt this attribute with version 13:

  https://releases.llvm.org/12.0.0/tools/clang/docs/AttributeReference.html
  https://releases.llvm.org/13.0.0/tools/clang/docs/AttributeReference.html

(while GCC already has it in version 7).

So yes, this seems the right way to do this.

Reviewed-by: Thomas Huth <thuth@redhat.com>