On 1/3/26 4:54 AM, Manos Pitsidianakis wrote:
On Fri, 02 Jan 2026 23:47, Pierrick Bouvier <[email protected]> wrote:
qemu_common_flags are only checked for c compiler, even though they
are applied to c++ and objc. This is a problem when C compiler is gcc,
and C++ compiler is clang, creating a possible mismatch.

One concrete example is option -fzero-call-used-regs=used-gpr with
ubuntu2204 container, which is supported by gcc, but not by clang, thus
leading to a failure when compiling a C++ TCG plugin.

Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Pierrick Bouvier <[email protected]>
---
meson.build | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/meson.build b/meson.build
index a8fd8e88225..256cc0cdb21 100644
--- a/meson.build
+++ b/meson.build
@@ -709,10 +709,7 @@ if cc.compiles('extern struct { void (*cb)(void); } s; 
void f(void) { s.cb(); }'
     hardening_flags += '-fzero-call-used-regs=used-gpr'
endif

-qemu_common_flags += cc.get_supported_arguments(hardening_flags)
-
-add_global_arguments(qemu_common_flags, native: false, language: all_languages)
-add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
+qemu_common_flags += hardening_flags

# Collect warning flags we want to set, sorted alphabetically
warn_flags = [
@@ -771,15 +768,19 @@ if 'cpp' in all_languages
   qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', 
'-D__STDC_FORMAT_MACROS'] + qemu_cflags
endif

-add_project_arguments(qemu_cflags, native: false, language: 'c')
-add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, 
language: 'c')
+add_project_arguments(cc.get_supported_arguments(qemu_common_flags + 
qemu_cflags + warn_flags),
+                      native: false, language: 'c')
+add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
+
if 'cpp' in all_languages
-  add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
+  add_project_arguments(cxx.get_supported_arguments(qemu_common_flags + 
qemu_cxxflags),
+                        native: false, language: 'cpp')

This is a subtle behavior change (qemu_cxxflags wasn't filtered through
cxx.get_supported_arguments previously). Do we care about this?


Sames goes for qemu_c_flags that we now filter also and we applied directly before. The goal is to have the same code layout in meson.build between the three languages for code clarity. My argument for this and qemu_cxxflags is that it should be equivalent, and if it's not, it should have been raised previously with an unsupported argument warning at compile time anyway.

By curiousity, looking at meson source, has_argument is implemented by compiling a file with the given flag, which is equivalent to what we do manually. It has different implementations per language: grep has_multi_arguments.

Thanks,
Pierrick

Reply via email to