2018-03-15 02:13:07 +03:00
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2005-04-17 02:20:36 +04:00
/******************************************************************************
*
* Name : acgcc . h - GCC specific defines , etc .
*
2023-04-05 16:38:21 +03:00
* Copyright ( C ) 2000 - 2023 , Intel Corp .
2005-04-17 02:20:36 +04:00
*
2018-03-15 02:13:07 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-04-17 02:20:36 +04:00
# ifndef __ACGCC_H__
# define __ACGCC_H__
2017-06-05 11:39:56 +03:00
# ifndef va_arg
2021-10-06 08:13:18 +03:00
# ifdef __KERNEL__
2021-08-02 23:40:32 +03:00
# include <linux/stdarg.h>
2021-10-06 08:13:18 +03:00
# else
# include <stdarg.h>
# endif /* __KERNEL__ */
# endif /* ! va_arg */
2016-08-04 11:44:38 +03:00
2010-09-15 09:36:55 +04:00
# define ACPI_INLINE __inline__
2005-07-08 08:00:00 +04:00
/* Function name is used for debug output. Non-ANSI, compiler-dependent */
2008-10-16 09:01:24 +04:00
# define ACPI_GET_FUNCTION_NAME __func__
2005-07-08 08:00:00 +04:00
2006-01-28 00:43:00 +03:00
/*
* This macro is used to tag functions as " printf-like " because
2005-04-17 02:20:36 +04:00
* some compilers ( like GCC ) can catch printf format string problems .
*/
2006-01-28 00:43:00 +03:00
# define ACPI_PRINTF_LIKE(c) __attribute__ ((__format__ (__printf__, c, c+1)))
2005-04-17 02:20:36 +04:00
2006-01-28 00:43:00 +03:00
/*
* Some compilers complain about unused variables . Sometimes we don ' t want to
2005-07-08 08:00:00 +04:00
* use all the variables ( for example , _acpi_module_name ) . This allows us
2009-07-16 19:13:03 +04:00
* to tell the compiler warning in a per - variable manner that a variable
2005-04-17 02:20:36 +04:00
* is unused .
*/
# define ACPI_UNUSED_VAR __attribute__ ((unused))
2015-07-01 09:43:43 +03:00
/* GCC supports __VA_ARGS__ in macros */
# define COMPILER_VA_MACRO 1
2017-08-03 09:26:50 +03:00
/* GCC supports native multiply/shift on 32-bit platforms */
# define ACPI_USE_NATIVE_MATH64
2021-01-22 03:23:51 +03:00
/* GCC did not support __has_attribute until 5.1. */
# ifndef __has_attribute
# define __has_attribute(x) 0
# endif
/*
2021-04-07 00:30:14 +03:00
* Explicitly mark intentional explicit fallthrough to silence
2021-01-22 03:23:51 +03:00
* - Wimplicit - fallthrough in GCC 7.1 + .
*/
# if __has_attribute(__fallthrough__)
# define ACPI_FALLTHROUGH __attribute__((__fallthrough__))
# endif
ACPICA: Introduce ACPI_FLEX_ARRAY
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>
2023-04-05 16:52:23 +03:00
/*
* 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 [ ] ; \
}
2005-08-05 08:44:28 +04:00
# endif /* __ACGCC_H__ */