| // Copyright 2022 The Dawn & Tint Authors | |
| // | |
| // Redistribution and use in source and binary forms, with or without | |
| // modification, are permitted provided that the following conditions are met: | |
| // | |
| // 1. Redistributions of source code must retain the above copyright notice, this | |
| // list of conditions and the following disclaimer. | |
| // | |
| // 2. Redistributions in binary form must reproduce the above copyright notice, | |
| // this list of conditions and the following disclaimer in the documentation | |
| // and/or other materials provided with the distribution. | |
| // | |
| // 3. Neither the name of the copyright holder nor the names of its | |
| // contributors may be used to endorse or promote products derived from | |
| // this software without specific prior written permission. | |
| // | |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
| // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| #include "src/tint/utils/macros/concat.h" | |
| #include "src/utils/compiler.h" | |
| #ifndef SRC_TINT_UTILS_MACROS_COMPILER_H_ | |
| #define SRC_TINT_UTILS_MACROS_COMPILER_H_ | |
| #define TINT_REQUIRE_SEMICOLON static_assert(true) | |
| #if defined(_MSC_VER) && !defined(__clang__) | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // MSVC | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_BUILD_IS_MSVC 1 | |
| #define TINT_DISABLE_WARNING_CONSTANT_OVERFLOW __pragma(warning(disable : 4756)) | |
| #define TINT_DISABLE_WARNING_DEPRECATED __pragma(warning(disable : 4996)) | |
| #define TINT_DISABLE_WARNING_DESTRUCTOR_NEVER_RETURNS __pragma(warning(disable : 4722)) | |
| #define TINT_DISABLE_WARNING_EXTRA_SEMICOLON /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_FLOAT_EQUAL /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_LIFETIME_SAFETY_INVALIDATION /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED __pragma(warning(disable : 4701)) | |
| #define TINT_DISABLE_WARNING_MISSING_DESTRUCTOR_OVERRIDE /* 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_PEDANTIC /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_REDUNDANT_PARENS /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_RESERVED_IDENTIFIER /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_RESERVED_MACRO_IDENTIFIER /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_SHADOW_FIELD_IN_CONSTRUCTOR /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_SIGN_CONVERSION /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNDEFINED_REINTERPRET_CAST /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNREACHABLE_CODE __pragma(warning(disable : 4702)) | |
| #define TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE_IN_CONTAINER /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNUSED_PARAMETER __pragma(warning(disable : 4100)) | |
| #define TINT_DISABLE_WARNING_UNSUED_VARIABLE __pragma(warning(disable : 4189)) | |
| #define TINT_DISABLE_WARNING_UNUSED_VALUE /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_WEAK_VTABLES /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_ZERO_AS_NULLPTR /* currently no-op */ | |
| #define TINT_BEGIN_DISABLE_OPTIMIZATIONS() __pragma(optimize("", off)) TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_OPTIMIZATIONS() __pragma(optimize("", on)) TINT_REQUIRE_SEMICOLON | |
| #define TINT_BEGIN_DISABLE_ALL_WARNINGS() __pragma(warning(push, 0)) TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_ALL_WARNINGS() __pragma(warning(pop)) TINT_REQUIRE_SEMICOLON | |
| // 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 | |
| #define TINT_BEGIN_DISABLE_PROTOBUF_WARNINGS() \ | |
| __pragma(warning(push)) \ | |
| TINT_DISABLE_WARNING_UNUSED_PARAMETER \ | |
| TINT_DISABLE_WARNING_UNSUED_VARIABLE \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_PROTOBUF_WARNINGS() \ | |
| __pragma(warning(pop)) \ | |
| TINT_REQUIRE_SEMICOLON | |
| // clang-format on | |
| #elif defined(__clang__) | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Clang | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_BUILD_IS_CLANG 1 | |
| #define TINT_DISABLE_WARNING_ALL _Pragma("clang diagnostic ignored \"-Wall\"") | |
| #define TINT_DISABLE_WARNING_CONSTANT_OVERFLOW /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_DEPRECATED /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_DESTRUCTOR_NEVER_RETURNS /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_COVERED_SWITCH_DEFAULT \ | |
| _Pragma("clang diagnostic ignored \"-Wcovered-switch-default\"") | |
| #define TINT_DISABLE_WARNING_DEPRECATED_REDUNDANT_CONSTEXPR_STATIC_DEF \ | |
| _Pragma("clang diagnostic ignored \"-Wdeprecated-redundant-constexpr-static-def\"") | |
| #define TINT_DISABLE_WARNING_DOUBLE_PROMOTION \ | |
| _Pragma("clang diagnostic ignored \"-Wdouble-promotion\"") | |
| #define TINT_DISABLE_WARNING_EVERYTHING _Pragma("clang diagnostic ignored \"-Weverything\"") | |
| #define TINT_DISABLE_WARNING_EXTRA _Pragma("clang diagnostic ignored \"-Wextra\"") | |
| #define TINT_DISABLE_WARNING_EXTRA_SEMICOLON \ | |
| _Pragma("clang diagnostic ignored \"-Wextra-semi-stmt\"") | |
| #define TINT_DISABLE_WARNING_FLOAT_EQUAL _Pragma("clang diagnostic ignored \"-Wfloat-equal\"") | |
| #define TINT_DISABLE_WARNING_LIFETIME_SAFETY_INVALIDATION \ | |
| _Pragma("clang diagnostic ignored \"-Wlifetime-safety-invalidation\"") | |
| #define TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED \ | |
| _Pragma("clang diagnostic ignored \"-Wconditional-uninitialized\"") | |
| #define TINT_DISABLE_WARNING_MISSING_DESTRUCTOR_OVERRIDE \ | |
| _Pragma("clang diagnostic ignored \"-Wsuggest-destructor-override\"") \ | |
| _Pragma("clang diagnostic ignored \"-Winconsistent-missing-destructor-override\"") | |
| #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_PEDANTIC /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_REDUNDANT_PARENS \ | |
| _Pragma("clang diagnostic ignored \"-Wredundant-parens\"") | |
| #define TINT_DISABLE_WARNING_RESERVED_IDENTIFIER \ | |
| _Pragma("clang diagnostic ignored \"-Wreserved-identifier\"") | |
| #define TINT_DISABLE_WARNING_RESERVED_MACRO_IDENTIFIER \ | |
| _Pragma("clang diagnostic ignored \"-Wreserved-macro-identifier\"") \ | |
| _Pragma("clang diagnostic ignored \"-Wreserved-id-macro\"") | |
| #define TINT_DISABLE_WARNING_SHADOW_FIELD_IN_CONSTRUCTOR \ | |
| _Pragma("clang diagnostic ignored \"-Wshadow-field-in-constructor\"") | |
| #define TINT_DISABLE_WARNING_SIGN_CONVERSION \ | |
| _Pragma("clang diagnostic ignored \"-Wsign-conversion\"") | |
| #define TINT_DISABLE_WARNING_THREAD_SAFETY_NEGATIVE \ | |
| _Pragma("clang diagnostic ignored \"-Wthread-safety-negative\"") | |
| #define TINT_DISABLE_WARNING_UNDEFINED_REINTERPRET_CAST \ | |
| _Pragma("clang diagnostic ignored \"-Wundefined-reinterpret-cast\"") | |
| #define TINT_DISABLE_WARNING_UNREACHABLE_CODE /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE \ | |
| _Pragma("clang diagnostic ignored \"-Wunsafe-buffer-usage\"") | |
| #define TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE_IN_CONTAINER \ | |
| _Pragma("clang diagnostic ignored \"-Wunsafe-buffer-usage-in-container\"") | |
| #define TINT_DISABLE_WARNING_UNUSED_PARAMETER \ | |
| _Pragma("clang diagnostic ignored \"-Wunused-parameter\"") | |
| #define TINT_DISABLE_WARNING_UNUSED_VALUE _Pragma("clang diagnostic ignored \"-Wunused-value\"") | |
| #define TINT_DISABLE_WARNING_WEAK_VTABLES _Pragma("clang diagnostic ignored \"-Wweak-vtables\"") | |
| #define TINT_DISABLE_WARNING_ZERO_AS_NULLPTR \ | |
| _Pragma("clang diagnostic ignored \"-Wzero-as-null-pointer-constant\"") | |
| // clang-format off | |
| #define TINT_BEGIN_DISABLE_PROTOBUF_WARNINGS() \ | |
| _Pragma("clang diagnostic push") \ | |
| TINT_DISABLE_WARNING_ALL \ | |
| TINT_DISABLE_WARNING_EXTRA \ | |
| TINT_DISABLE_WARNING_EVERYTHING \ | |
| TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_PROTOBUF_WARNINGS() \ | |
| _Pragma("clang diagnostic pop") \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_BEGIN_DISABLE_OPTIMIZATIONS() /* currently no-op */ TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_OPTIMIZATIONS() /* currently no-op */ TINT_REQUIRE_SEMICOLON | |
| #define TINT_BEGIN_DISABLE_ALL_WARNINGS() \ | |
| _Pragma("clang diagnostic push") \ | |
| TINT_DISABLE_WARNING_EVERYTHING \ | |
| TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_ALL_WARNINGS() \ | |
| _Pragma("clang diagnostic pop") \ | |
| TINT_REQUIRE_SEMICOLON | |
| #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 | |
| #elif defined(__GNUC__) | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // GCC | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_BUILD_IS_GCC 1 | |
| #define TINT_DISABLE_WARNING_CONSTANT_OVERFLOW /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_DEPRECATED /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_DESTRUCTOR_NEVER_RETURNS /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_EXTRA_SEMICOLON /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_FLOAT_EQUAL /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_LIFETIME_SAFETY_INVALIDATION /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_MISSING_DESTRUCTOR_OVERRIDE /* 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_PEDANTIC _Pragma("GCC diagnostic ignored \"-Wpedantic\"") | |
| #define TINT_DISABLE_WARNING_REDUNDANT_PARENS /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_RESERVED_IDENTIFIER /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_RESERVED_MACRO_IDENTIFIER /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_SHADOW_FIELD_IN_CONSTRUCTOR /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_SIGN_CONVERSION /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNDEFINED_REINTERPRET_CAST /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNREACHABLE_CODE /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE_IN_CONTAINER /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_UNUSED_PARAMETER \ | |
| _Pragma("GCC diagnostic ignored \"-Wunused-parameter\"") | |
| #define TINT_DISABLE_WARNING_UNUSED_VALUE _Pragma("GCC diagnostic ignored \"-Wunused-value\"") | |
| #define TINT_DISABLE_WARNING_WEAK_VTABLES /* currently no-op */ | |
| #define TINT_DISABLE_WARNING_ZERO_AS_NULLPTR /* currently no-op */ | |
| // clang-format off | |
| #define TINT_BEGIN_DISABLE_PROTOBUF_WARNINGS() \ | |
| _Pragma("GCC diagnostic push") \ | |
| TINT_DISABLE_WARNING_UNUSED_PARAMETER \ | |
| TINT_DISABLE_WARNING_PEDANTIC \ | |
| TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_PROTOBUF_WARNINGS() \ | |
| _Pragma("GCC diagnostic pop") \ | |
| TINT_REQUIRE_SEMICOLON | |
| // clang-format on | |
| #define TINT_BEGIN_DISABLE_OPTIMIZATIONS() /* currently no-op */ TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_OPTIMIZATIONS() /* currently no-op */ TINT_REQUIRE_SEMICOLON | |
| // clang-format off | |
| #define TINT_BEGIN_DISABLE_ALL_WARNINGS() \ | |
| _Pragma("GCC diagnostic push") \ | |
| TINT_DISABLE_WARNING_CONSTANT_OVERFLOW \ | |
| TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED \ | |
| TINT_DISABLE_WARNING_NEWLINE_EOF \ | |
| TINT_DISABLE_WARNING_OLD_STYLE_CAST \ | |
| TINT_DISABLE_WARNING_PEDANTIC \ | |
| TINT_DISABLE_WARNING_SIGN_CONVERSION \ | |
| TINT_DISABLE_WARNING_UNREACHABLE_CODE \ | |
| TINT_DISABLE_WARNING_WEAK_VTABLES \ | |
| TINT_DISABLE_WARNING_FLOAT_EQUAL \ | |
| TINT_DISABLE_WARNING_LIFETIME_SAFETY_INVALIDATION \ | |
| TINT_DISABLE_WARNING_DEPRECATED \ | |
| TINT_DISABLE_WARNING_REDUNDANT_PARENS \ | |
| TINT_DISABLE_WARNING_RESERVED_IDENTIFIER \ | |
| TINT_DISABLE_WARNING_RESERVED_MACRO_IDENTIFIER \ | |
| TINT_DISABLE_WARNING_UNUSED_VALUE \ | |
| TINT_DISABLE_WARNING_UNUSED_PARAMETER \ | |
| TINT_DISABLE_WARNING_SHADOW_FIELD_IN_CONSTRUCTOR \ | |
| TINT_DISABLE_WARNING_EXTRA_SEMICOLON \ | |
| TINT_DISABLE_WARNING_ZERO_AS_NULLPTR \ | |
| TINT_DISABLE_WARNING_MISSING_DESTRUCTOR_OVERRIDE \ | |
| TINT_DISABLE_WARNING_UNSAFE_BUFFER_USAGE \ | |
| TINT_REQUIRE_SEMICOLON | |
| // clang-format on | |
| #define TINT_END_DISABLE_ALL_WARNINGS() _Pragma("GCC diagnostic pop") TINT_REQUIRE_SEMICOLON | |
| // 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 | |
| #else | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Other | |
| //////////////////////////////////////////////////////////////////////////////// | |
| #define TINT_BEGIN_DISABLE_OPTIMIZATIONS() TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_OPTIMIZATIONS() TINT_REQUIRE_SEMICOLON | |
| #define TINT_BEGIN_DISABLE_ALL_WARNINGS() TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_ALL_WARNINGS TINT_REQUIRE_SEMICOLON | |
| #define TINT_BEGIN_DISABLE_WARNING(name) TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_WARNING(name) TINT_REQUIRE_SEMICOLON | |
| #define TINT_BEGIN_DISABLE_PROTOBUF_WARNINGS() TINT_REQUIRE_SEMICOLON | |
| #define TINT_END_DISABLE_PROTOBUF_WARNINGS() TINT_REQUIRE_SEMICOLON | |
| #endif | |
| #ifndef TINT_BUILD_IS_MSVC | |
| #define TINT_BUILD_IS_MSVC 0 | |
| #endif | |
| #ifndef TINT_BUILD_IS_CLANG | |
| #define TINT_BUILD_IS_CLANG 0 | |
| #endif | |
| #ifndef TINT_BUILD_IS_GCC | |
| #define TINT_BUILD_IS_GCC 0 | |
| #endif | |
| #if TINT_BUILD_IS_MSVC | |
| #define TINT_MSVC_ONLY(x) x | |
| #else | |
| #define TINT_MSVC_ONLY(x) | |
| #endif | |
| #if TINT_BUILD_IS_CLANG | |
| #define TINT_CLANG_ONLY(x) x | |
| #else | |
| #define TINT_CLANG_ONLY(x) | |
| #endif | |
| #if TINT_BUILD_IS_GCC | |
| #define TINT_GCC_ONLY(x) x | |
| #else | |
| #define TINT_GCC_ONLY(x) | |
| #endif | |
| #endif // SRC_TINT_UTILS_MACROS_COMPILER_H_ |