diff options
Diffstat (limited to 'longbow/src/LongBow/longBow_Compiler.h')
-rwxr-xr-x | longbow/src/LongBow/longBow_Compiler.h | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/longbow/src/LongBow/longBow_Compiler.h b/longbow/src/LongBow/longBow_Compiler.h new file mode 100755 index 00000000..197e1e8c --- /dev/null +++ b/longbow/src/LongBow/longBow_Compiler.h @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file longBow_Compiler.h + * @ingroup compiling + * @brief LongBow compile time functionality. + * + */ +#ifndef LongBow_compiling_h +#define LongBow_compiling_h + +/** + * @def LONGBOW_GNUC_EXACTLY + * + * Compile-time test to determine if the compiler is the GNU C compiler with the specfied + * version, revision and patch levels. + * + * @param [in] major The required major version number of the compiler. + * @param [in] minor The required minor version number of the compiler. + * @param [in] patch The required patch number of the compiler. + * + * @return true If the current compiler matches the requirements. + * + * Example: + * @code + * #if LONGBOW_GNUC_EXACTLY(4,2,1) + * printf("Hello GNU compiler 4.2.1\n"); + * #endif + * @endcode + * + * @see LONGBOW_GNUC_ATLEAST + */ +#ifdef __GNUC__ +# define LONGBOW_GNUC_EXACTLY(major, minor, patch) \ + (__GNUC__ == major) && (__GNUC_MINOR__ = minor) && (__GNUC_PATCHLEVEL__ == patch) +#else +# define LONGBOW_GNUC_EXACTLY(major, minor, patch) \ + (0) +#endif + +/** + * @def LONGBOW_GNUC_ATLEAST + * + * Compile-time test to determine if the compiler is the GNU C compiler with at least the specfied + * version, revision and patch levels. + * + * @param [in] major The minimum required major version number of the compiler. + * @param [in] minor The minimum required minor version number of the compiler. + * @param [in] patch The minimum required patch number of the compiler. + * + * @return true If the current compiler matches the requirements. + * @return false If the current compiler fails to match the requirements. + * + * Example: + * @code + * #if LONGBOW_GNUC_ATLEAST(4,0,0) + * printf("Hello GNU compiler 4.x\n"); + * #endif + * @endcode + * + * @see LONGBOW_GNUC_EXACTLY + */ +#ifdef __GNUC__ +# define LONGBOW_GNUC_ATLEAST(major, minor, patch) \ + (__GNUC__ >= major) && (__GNUC_MINOR__ > minor) && (__GNUC_PATCHLEVEL__ >= patch) +#else +# define LONGBOW_GNUC_ATLEAST(major, minor, patch) \ + (0) +#endif + +/** + * @def LONGBOW_CLANG_EXACTLY + * + * Compile-time test to determine if the compiler is the Clang C compiler with the specfied + * version, revision and patch levels. + * + * @param [in] major The required major version number of the compiler. + * @param [in] minor The required minor version number of the compiler. + * @param [in] patch The required patch number of the compiler. + * + * @return true If the current compiler matches the requirements. + * + * Example: + * @code + * #if LONGBOW_CLANG_EXACTLY(5,0,0) + * printf("Hello Clang 5.0.0\n"); + * #endif + * @endcode + * + * @see LONGBOW_CLANG_ATLEAST + */ +#ifdef __clang__ +# define LONGBOW_CLANG_EXACTLY(major, minor, patch) \ + (__clang_major__ == major) && (__clang_major__ = minor) && (__clang_patchlevel__ == patch) +#else +# define LONGBOW_CLANG_EXACTLY(major, minor, patch) \ + (0) +#endif + +/** + * @def LONGBOW_CLANG_ATLEAST + * + * Compile-time test to determine if the compiler is the GNU C compiler with at least the specfied + * version, revision and patch levels. + * + * @param [in] major The minimum required major version number of the compiler. + * @param [in] minor The minimum required minor version number of the compiler. + * @param [in] patch The minimum required patch number of the compiler. + * + * @return true If the current compiler matches the requirements. + * @return false If the current compiler fails to match the requirements. + * + * Example: + * @code + * #if LONGBOW_CLANG_ATLEAST(5,0,0) + * printf("Hello Clang compiler 5.x\n"); + * #endif + * @endcode + * + * @see LONGBOW_CLANG_EXACTLY + */ +#ifdef __clang__ +# define LONGBOW_CLANG_ATLEAST(major, minor, patch) \ + (__clang_major__ >= major) && (__clang_major__ > minor) && (__clang_patchlevel__ >= patch) +#else +# define LONGBOW_CLANG_ATLEAST(major, minor, patch) \ + (0) +#endif + +/** + * @def LONGBOW_START_DEPRECATED_WARNINGS + * + * Compile-time preprocessing to signal the compiler to not report the use of deprecated functions. + * + * Example: + * @code + * LONGBOW_STOP_DEPRECATED_WARNINGS + * someDeprecatedFunction(); + * @endcode + * + * @see LONBOW_STOP_DEPRECATED_WARNINGS + */ + +/** + * @def LONGBOW_STOP_DEPRECATED_WARNINGS + * + * Compile-time preprocessing to signal the compiler to report the use of deprecated functions. + * + * Example: + * @code + * LONGBOW_STOP_DEPRECATED_WARNINGS + * someDeprecatedFunction(); + * @endcode + * + * @see LONBOW_START_DEPRECATED_WARNINGS + */ +#if LONGBOW_CLANG_ATLEAST(5, 0, 0) || LONGBOW_GNUC_ATLEAST(4, 6, 0) +# define LONGBOW_STOP_DEPRECATED_WARNINGS \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") + +# define LONGBOW_START_DEPRECATED_WARNINGS \ + _Pragma("GCC diagnostic pop") + +#elif __clang__ || __GNUC__ + +# define LONGBOW_STOP_DEPRECATED_WARNINGS \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") + +# define LONGBOW_START_DEPRECATED_WARNINGS \ + _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"") + +#else + +# define LONGBOW_STOP_DEPRECATED_WARNINGS /* nothing */ + +# define LONGBOW_START_DEPRECATED_WARNINGS /* nothing */ +#endif + +/** + * @def LongBowCompiler_IgnoreInitializerOverrides + * + * Compile-time preprocessing to signal the compiler to not report the use of structure initializer overrides. + * + * Example: + * @code + * LongBowCompiler_IgnoreInitializerOverrides + * struct foo { + * int a; + * } instance = { + * .a = 1, + * .a = 1 + * }; + * LongBowCompiler_WarnInitializerOverrides + * @endcode + * + * @see LongBowCompiler_WarnInitializerOverrides + */ +#if LONGBOW_CLANG_ATLEAST(5, 0, 0) +# define LongBowCompiler_IgnoreInitializerOverrides \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Winitializer-overrides\"") + +# define LongBowCompiler_WarnInitializerOverrides \ + _Pragma("GCC diagnostic pop") + +#elif LONGBOW_GNUC_ATLEAST(4, 6, 0) +# define LongBowCompiler_IgnoreInitializerOverrides \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Woverride-init\"") + +# define LongBowCompiler_WarnInitializerOverrides \ + _Pragma("GCC diagnostic pop") + +#elif __clang__ || __GNUC__ +# define LongBowCompiler_IgnoreInitializerOverrides \ + _Pragma("GCC diagnostic ignored \"-Woverride-init\"") + +# define LongBowCompiler_WarnInitializerOverrides \ + _Pragma("GCC diagnostic warning \"-Woverride-init\"") + +#else + +# define LongBowCompiler_IgnoreInitializerOverrides /* nothing */ + +# define LongBowCompiler_WarnInitializerOverrides /* nothing */ +#endif + +/** + * @def LONGBOW_STOPWARNINGS_UnusedVariable + * + * Compile-time preprocessing to signal the compiler to report unused variables. + * + * Example: + * @code + * LONGBOW_STOPWARNINGS_UnusedVariable + * void + * foo(int unusedVariable) + * { + * return; + * } + * LONGBOW_STARTWARNINGS_UnusedVariable + * @endcode + * + * @see LONGBOW_STARTWARNINGS_UnusedVariable + * + * @def LONGBOW_STARTWARNINGS_UnusedVariable + * + * Compile-time preprocessing to signal the compiler to report unused variables. + * + * Example: + * @code + * LONGBOW_STOPWARNINGS_UnusedVariable + * void + * foo(int unusedVariable) + * { + * return; + * } + * LONGBOW_STARTWARNINGS_UnusedVariable + * @endcode + * + * @see LONGBOW_STARTWARNINGS_UnusedVariable + */ +#if LONGBOW_CLANG_ATLEAST(5, 0, 0) +# define LONGBOW_STOPWARNINGS_UnusedVariable \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wunused-variable\"") +# define LONGBOW_STARTWARNINGS_UnusedVariable \ + _Pragma("GCC diagnostic pop") +#elif LONGBOW_GNUC_ATLEAST(4, 6, 0) +# define LONGBOW_STOPWARNINGS_UnusedVariable \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wunused-variable\"") +# define LONGBOW_STARTWARNINGS_UnusedVariable \ + _Pragma("GCC diagnostic pop") +#elif __clang__ || __GNUC__ +# define LONGBOW_STOPWARNINGS_UnusedVariable \ + _Pragma("GCC diagnostic ignored \"-Wunused-variable\"") +# define LONGBOW_STARTWARNINGS_UnusedVariable \ + _Pragma("GCC diagnostic warning \"-Wunused-variable\"") +#else + +# define LONGBOW_STOPWARNINGS_UnusedVariable /* nothing */ + +# define LONGBOW_STARTWARNINGS_UnusedVariable /* nothing */ +#endif + + +#endif // LongBow_compiling_h |