11132ad017
ACPICA commit e73b227e8e475c20cc394f237ea35d592fdf9ec3 In order to enable using -fstrict-flex-arrays with GCC and Clang in the Linux kernel, each trailing dynamically sized array must be defined as proper C99 "flexible array members" (FAM). Unfortunately, ACPICA has a bunch of technical debt, dating back to before even the GNU extension of 0-length arrays, meaning the code base has many 1-element and 0-length arrays defined at the end of structures that should actually be FAMs. One limitation of the C99 FAM specification is the accidental requirement that they cannot be in unions or alone in structs. There is no real-world reason for this, though, and, actually, the existing GNU extension permits this for 0-length arrays (which get treated as FAMs). Add the ACPI_FLEX_ARRAY() helper macro to work around this requirement so that FAMs can be defined in unions or alone in structs. Since this behavior still depends on GNU extensions, keep the macro specific to GCC (and Clang) builds. In this way, MSVC will continue to use 0-length arrays (since it does not support the union work-around). When MSVC grows support for this in the future, the macro can be updated. Link: https://github.com/acpica/acpica/commit/e73b227e Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
76 lines
2.0 KiB
C
76 lines
2.0 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
|
|
/******************************************************************************
|
|
*
|
|
* Name: acgcc.h - GCC specific defines, etc.
|
|
*
|
|
* Copyright (C) 2000 - 2023, Intel Corp.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef __ACGCC_H__
|
|
#define __ACGCC_H__
|
|
|
|
#ifndef va_arg
|
|
#ifdef __KERNEL__
|
|
#include <linux/stdarg.h>
|
|
#else
|
|
#include <stdarg.h>
|
|
#endif /* __KERNEL__ */
|
|
#endif /* ! va_arg */
|
|
|
|
#define ACPI_INLINE __inline__
|
|
|
|
/* Function name is used for debug output. Non-ANSI, compiler-dependent */
|
|
|
|
#define ACPI_GET_FUNCTION_NAME __func__
|
|
|
|
/*
|
|
* This macro is used to tag functions as "printf-like" because
|
|
* some compilers (like GCC) can catch printf format string problems.
|
|
*/
|
|
#define ACPI_PRINTF_LIKE(c) __attribute__ ((__format__ (__printf__, c, c+1)))
|
|
|
|
/*
|
|
* Some compilers complain about unused variables. Sometimes we don't want to
|
|
* use all the variables (for example, _acpi_module_name). This allows us
|
|
* to tell the compiler warning in a per-variable manner that a variable
|
|
* is unused.
|
|
*/
|
|
#define ACPI_UNUSED_VAR __attribute__ ((unused))
|
|
|
|
/* GCC supports __VA_ARGS__ in macros */
|
|
|
|
#define COMPILER_VA_MACRO 1
|
|
|
|
/* GCC supports native multiply/shift on 32-bit platforms */
|
|
|
|
#define ACPI_USE_NATIVE_MATH64
|
|
|
|
/* GCC did not support __has_attribute until 5.1. */
|
|
|
|
#ifndef __has_attribute
|
|
#define __has_attribute(x) 0
|
|
#endif
|
|
|
|
/*
|
|
* Explicitly mark intentional explicit fallthrough to silence
|
|
* -Wimplicit-fallthrough in GCC 7.1+.
|
|
*/
|
|
|
|
#if __has_attribute(__fallthrough__)
|
|
#define ACPI_FALLTHROUGH __attribute__((__fallthrough__))
|
|
#endif
|
|
|
|
/*
|
|
* Flexible array members are not allowed to be part of a union under
|
|
* C99, but this is not for any technical reason. Work around the
|
|
* limitation.
|
|
*/
|
|
#define ACPI_FLEX_ARRAY(TYPE, NAME) \
|
|
struct { \
|
|
struct { } __Empty_ ## NAME; \
|
|
TYPE NAME[]; \
|
|
}
|
|
|
|
#endif /* __ACGCC_H__ */
|