| // Copyright 2022 The Tint Authors. | |
| // | |
| // 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. | |
| #include "src/tint/utils/concat.h" | |
| #ifndef SRC_TINT_UTILS_COMPILER_MACROS_H_ | |
| #define SRC_TINT_UTILS_COMPILER_MACROS_H_ | |
| #define TINT_REQUIRE_SEMICOLON static_assert(true) | |
| #if defined(_MSC_VER) && !defined(__clang__) | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // MSVC | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_DISABLE_WARNING_CONSTANT_OVERFLOW __pragma(warning(disable : 4756)) | |
| #define TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_NEWLINE_EOF /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_OLD_STYLE_CAST /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_SIGN_CONVERSION /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNREACHABLE_CODE __pragma(warning(disable : 4702)) | |
| #define TINT_DISABLE_WARNING_WEAK_VTABLES /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_FLOAT_EQUAL /* currently no-op */ | |
| // clang-format off | |
| #define TINT_BEGIN_DISABLE_WARNING(name) \ | |
| __pragma(warning(push)) \ | |
| TINT_CONCAT(TINT_DISABLE_WARNING_, name) \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_WARNING(name) \ | |
| __pragma(warning(pop)) \ | |
| TINT_REQUIRE_SEMICOLON | |
| // clang-format on | |
| #define TINT_UNLIKELY(x) x /* currently no-op */ | |
| #define TINT_LIKELY(x) x /* currently no-op */ | |
| #elif defined(__clang__) | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Clang | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_DISABLE_WARNING_CONSTANT_OVERFLOW /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_NEWLINE_EOF _Pragma("clang diagnostic ignored \"-Wnewline-eof\"") | |
| #define TINT_DISABLE_WARNING_OLD_STYLE_CAST _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") | |
| #define TINT_DISABLE_WARNING_SIGN_CONVERSION \ | |
| _Pragma("clang diagnostic ignored \"-Wsign-conversion\"") | |
| #define TINT_DISABLE_WARNING_UNREACHABLE_CODE /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_WEAK_VTABLES _Pragma("clang diagnostic ignored \"-Wweak-vtables\"") | |
| #define TINT_DISABLE_WARNING_FLOAT_EQUAL _Pragma("clang diagnostic ignored \"-Wfloat-equal\"") | |
| // clang-format off | |
| #define TINT_BEGIN_DISABLE_WARNING(name) \ | |
| _Pragma("clang diagnostic push") \ | |
| TINT_CONCAT(TINT_DISABLE_WARNING_, name) \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_WARNING(name) \ | |
| _Pragma("clang diagnostic pop") \ | |
| TINT_REQUIRE_SEMICOLON | |
| // clang-format on | |
| #define TINT_UNLIKELY(x) __builtin_expect(!!(x), false) | |
| #define TINT_LIKELY(x) __builtin_expect(!!(x), true) | |
| #elif defined(__GNUC__) | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // GCC | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_DISABLE_WARNING_CONSTANT_OVERFLOW /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED \ | |
| _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") | |
| #define TINT_DISABLE_WARNING_NEWLINE_EOF /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_OLD_STYLE_CAST /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_SIGN_CONVERSION /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNREACHABLE_CODE /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_WEAK_VTABLES /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_FLOAT_EQUAL /* currently no-op */ | |
| // clang-format off | |
| #define TINT_BEGIN_DISABLE_WARNING(name) \ | |
| _Pragma("GCC diagnostic push") \ | |
| TINT_CONCAT(TINT_DISABLE_WARNING_, name) \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_WARNING(name) \ | |
| _Pragma("GCC diagnostic pop") \ | |
| TINT_REQUIRE_SEMICOLON | |
| // clang-format on | |
| #define TINT_UNLIKELY(x) __builtin_expect(!!(x), false) | |
| #define TINT_LIKELY(x) __builtin_expect(!!(x), true) | |
| #else | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Other | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_BEGIN_DISABLE_WARNING(name) TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_WARNING(name) TINT_REQUIRE_SEMICOLON | |
| #define TINT_UNLIKELY(x) x | |
| #define TINT_LIKELY(x) x | |
| #endif | |
| #endif // SRC_TINT_UTILS_COMPILER_MACROS_H_ |