Stop disabling -Wattributes (#41174)

In one of the reviews one of the LLMs noticed that the pragma is set but
never unset, so it remains in effect for the rest of the translation
unit. From the comment, it's not clear how old those "old compilers"
were, so let's try if things work without this workaround.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2026-03-20 17:10:10 +01:00
committed by GitHub
7 changed files with 24 additions and 18 deletions
+6
View File
@@ -524,6 +524,12 @@ if cc.compiles('''
add_project_arguments('-Werror=shadow', language : 'c')
endif
have = cc.compiles(
'__attribute__((__retain__)) int x;',
args : '-Werror=attributes',
name : '__attribute__((__retain__))')
conf.set10('HAVE_ATTRIBUTE_RETAIN', have)
if cxx_cmd != ''
add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
endif
-2
View File
@@ -12,8 +12,6 @@ typedef void (*free_func_t)(void *p);
* variables declared in .so's, as the list is private to the same linking unit. But maybe that's a good thing. */
#define _common_static_destruct_attrs_ \
/* Older compilers don't know "retain" attribute. */ \
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
/* The actual destructor structure we place in a special section to find it. */ \
_section_("SYSTEMD_STATIC_DESTRUCT") \
/* Use pointer alignment, since that is apparently what gcc does for static variables. */ \
+6 -9
View File
@@ -5,15 +5,12 @@
#include "efi-string.h"
#include "proto/simple-text-io.h" /* IWYU pragma: keep */
#if defined __has_attribute
# if __has_attribute(no_stack_protector)
# define HAVE_NO_STACK_PROTECTOR_ATTRIBUTE
# endif
#endif
#if defined(HAVE_NO_STACK_PROTECTOR_ATTRIBUTE) && \
(defined(__SSP__) || defined(__SSP_ALL__) || \
defined(__SSP_STRONG__) || defined(__SSP_EXPLICIT__))
#if defined(__has_attribute) && \
__has_attribute(no_stack_protector) && \
(defined(__SSP__) || \
defined(__SSP_ALL__) || \
defined(__SSP_STRONG__) || \
defined(__SSP_EXPLICIT__))
# define STACK_PROTECTOR_RANDOM 1
__attribute__((no_stack_protector, noinline)) void __stack_chk_guard_init(void);
#else
+5 -2
View File
@@ -80,8 +80,11 @@ endif
efi_conf = configuration_data()
# import several configs from userspace
foreach name : ['HAVE_WARNING_ZERO_LENGTH_BOUNDS', 'HAVE_WARNING_ZERO_AS_NULL_POINTER_CONSTANT']
efi_conf.set10(name, conf.get(name) == 1)
foreach name : ['HAVE_ATTRIBUTE_RETAIN',
'HAVE_WARNING_ZERO_AS_NULL_POINTER_CONSTANT',
'HAVE_WARNING_ZERO_LENGTH_BOUNDS',
]
efi_conf.set(name, conf.get(name))
endforeach
efi_conf.set10('ENABLE_TPM', get_option('tpm'))
+6 -1
View File
@@ -88,7 +88,6 @@
#define _printf_(a, b) __attribute__((__format__(printf, a, b)))
#define _public_ __attribute__((__visibility__("default")))
#define _pure_ __attribute__((__pure__))
#define _retain_ __attribute__((__retain__))
#define _returns_nonnull_ __attribute__((__returns_nonnull__))
#define _section_(x) __attribute__((__section__(x)))
#define _sentinel_ __attribute__((__sentinel__))
@@ -99,6 +98,12 @@
#define _weak_ __attribute__((__weak__))
#define _weakref_(x) __attribute__((__weakref__(#x)))
#if HAVE_ATTRIBUTE_RETAIN
# define _retain_ __attribute__((__retain__))
#else
# define _retain_
#endif
#ifdef __clang__
# define _alloc_(...)
#else
+1 -3
View File
@@ -31,12 +31,10 @@ const char* _bus_error_message(const sd_bus_error *e, int error, char buf[static
* the error map is really added to the final binary.
*
* In addition, set the retain attribute so that the section cannot be
* discarded by ld --gc-sections -z start-stop-gc. Older compilers would
* warn for the unknown attribute, so just disable -Wattributes.
* discarded by ld --gc-sections -z start-stop-gc.
*/
#define BUS_ERROR_MAP_ELF_REGISTER \
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
_section_("SYSTEMD_BUS_ERROR_MAP") \
_used_ \
_retain_ \
-1
View File
@@ -101,7 +101,6 @@ typedef struct TestFunc {
/* See static-destruct.h for an explanation of how this works. */
#define REGISTER_TEST(func, ...) \
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
_section_("SYSTEMD_TEST_TABLE") _alignptr_ _used_ _retain_ _variable_no_sanitize_address_ \
static const TestFunc UNIQ_T(static_test_table_entry, UNIQ) = { \
.f = (union f) &(func), \