| /* Copyright 2020 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef __CROS_EC_COMPILER_H |
| #define __CROS_EC_COMPILER_H |
| |
| /* |
| * See https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html |
| */ |
| #ifndef CONFIG_ZEPHYR |
| /* If building with Zephyr, use its GCC version. */ |
| #define GCC_VERSION \ |
| (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) |
| #endif /* !CONFIG_ZEPHYR */ |
| |
| /* |
| * The EC codebase assumes that typeof() is available but it is not in Zephyr. |
| * We use an #ifdef since arch/arm/include/aarch32/cortex_m/cmse.h defines this |
| * macro. |
| */ |
| #ifndef typeof |
| #define typeof(x) __typeof__(x) |
| #endif |
| |
| /** |
| * ISO C forbids forward references to enum types, but gcc allows it as long as |
| * the "-pedantic" flag is not used. |
| * |
| * In C++11 and newer, forward references to enums are only allowed if the |
| * underlying type is specified. |
| * |
| * New uses of this macro are strongly discouraged; instead of forward |
| * declaring the enum, provide the definition. |
| * |
| * TODO(http://b/187105190): Remove uses of this macro. |
| */ |
| #ifdef __cplusplus |
| #define FORWARD_DECLARE_ENUM(x) enum x : int |
| #else |
| #define FORWARD_DECLARE_ENUM(x) enum x |
| #endif /* __cplusplus */ |
| |
| #define _DO_PRAGMA(x) _Pragma(#x) |
| |
| #define _DISABLE_COMPILER_WARNING(compiler, warning) \ |
| _DO_PRAGMA(compiler diagnostic push) \ |
| _DO_PRAGMA(compiler diagnostic ignored warning) |
| |
| #define _ENABLE_COMPILER_WARNING(compiler, warning) \ |
| _DO_PRAGMA(compiler diagnostic pop) |
| |
| /** |
| * Disable the specified compiler warning for both clang and gcc. |
| */ |
| #define DISABLE_COMPILER_WARNING(warning) \ |
| _DISABLE_COMPILER_WARNING(GCC, warning) |
| |
| /** |
| * Re-enable the specified compiler warning for both clang and gcc. Can only be |
| * used after a call to DISABLE_COMPILER_WARNING. |
| */ |
| #define ENABLE_COMPILER_WARNING(warning) _ENABLE_COMPILER_WARNING(GCC, warning) |
| |
| #ifdef __clang__ |
| /** |
| * Disable the specified compiler warning for clang. |
| */ |
| #define DISABLE_CLANG_WARNING(warning) _DISABLE_COMPILER_WARNING(clang, warning) |
| /** |
| * Re-enable the specified compiler warning for clang. Can only be used after |
| * a call to DISABLE_CLANG_WARNING. |
| */ |
| #define ENABLE_CLANG_WARNING(warning) _ENABLE_COMPILER_WARNING(clang, warning) |
| #else |
| #define DISABLE_CLANG_WARNING(warning) |
| #define ENABLE_CLANG_WARNING(warning) |
| #endif |
| |
| #if defined(__GNUC__) && !defined(__clang__) |
| /** |
| * Disable the specified compiler warning for gcc. |
| */ |
| #define DISABLE_GCC_WARNING(warning) _DISABLE_COMPILER_WARNING(GCC, warning) |
| /** |
| * Re-enable the specified compiler warning for clang. Can only be used after |
| * a call to DISABLE_GCC_WARNING. |
| */ |
| #define ENABLE_GCC_WARNING(warning) _ENABLE_COMPILER_WARNING(GCC, warning) |
| #else |
| #define DISABLE_GCC_WARNING(warning) |
| #define ENABLE_GCC_WARNING(warning) |
| #endif |
| |
| #endif /* __CROS_EC_COMPILER_H */ |