[PATCH] perf build: Restore {0} initializer since GCC-15

From: Leo Yan
Date: Wed Mar 19 2025 - 07:22:01 EST


GCC-15 release claims [1]:

{0} initializer in C or C++ for unions no longer guarantees clearing
of the whole union (except for static storage duration initialization),
it just initializes the first union member to zero. If initialization
of the whole union including padding bits is desirable, use {} (valid
in C23 or C++) or use -fzero-init-padding-bits=unions option to
restore old GCC behavior.

This new behaviour might cause stale and unexpected data we defined in
Perf. Add the -fzero-init-padding-bits=unions option for entirely
zeroing union structures.

[1] https://gcc.gnu.org/gcc-15/changes.html

Signed-off-by: Leo Yan <leo.yan@xxxxxxx>
---
tools/perf/Makefile.config | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index a148ca9efca9..f767ab634022 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -323,6 +323,14 @@ FEATURE_CHECK_LDFLAGS-libaio = -lrt
FEATURE_CHECK_LDFLAGS-disassembler-four-args = -lbfd -lopcodes -ldl
FEATURE_CHECK_LDFLAGS-disassembler-init-styled = -lbfd -lopcodes -ldl

+# As described in GCC-15 release: https://gcc.gnu.org/gcc-15/changes.html:
+# "{0} initializer in C or C++ for unions no longer guarantees clearing
+# of the whole union (except for static storage duration initialization),
+# it just initializes the first union member to zero. ... use {} (valid
+# in C23 or C++) or use -fzero-init-padding-bits=unions option to
+# restore old GCC behavior."
+CORE_CFLAGS += $(call cc-option,-fzero-init-padding-bits=unions)
+
CORE_CFLAGS += -fno-omit-frame-pointer
CORE_CFLAGS += -Wall
CORE_CFLAGS += -Wextra
--
2.34.1