| // 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" |
| |
| #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_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_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_UNREACHABLE_CODE __pragma(warning(disable : 4702)) |
| #define TINT_DISABLE_WARNING_UNUSED_PARAMETER __pragma(warning(disable : 4100)) |
| #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 |
| // clang-format on |
| |
| #define TINT_BEGIN_DISABLE_PROTOBUF_WARNINGS() \ |
| __pragma(warning(push)) TINT_DISABLE_WARNING_UNUSED_PARAMETER TINT_REQUIRE_SEMICOLON |
| #define TINT_END_DISABLE_PROTOBUF_WARNINGS() __pragma(warning(pop)) TINT_REQUIRE_SEMICOLON |
| |
| #define TINT_UNLIKELY(x) x /* currently no-op */ |
| #define TINT_LIKELY(x) x /* currently no-op */ |
| |
| #if defined(__SANITIZE_ADDRESS__) |
| #define TINT_ASAN_ENABLED |
| #endif |
| |
| #elif defined(__clang__) |
| //////////////////////////////////////////////////////////////////////////////// |
| // Clang |
| //////////////////////////////////////////////////////////////////////////////// |
| #define TINT_BUILD_IS_CLANG 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 \ |
| _Pragma("clang diagnostic ignored \"-Wextra-semi-stmt\"") |
| #define TINT_DISABLE_WARNING_FLOAT_EQUAL _Pragma("clang diagnostic ignored \"-Wfloat-equal\"") |
| #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_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_UNREACHABLE_CODE /* currently no-op */ |
| #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_EXTRA_SEMICOLON \ |
| TINT_DISABLE_WARNING_MAYBE_UNINITIALIZED \ |
| TINT_DISABLE_WARNING_MISSING_DESTRUCTOR_OVERRIDE \ |
| TINT_DISABLE_WARNING_RESERVED_IDENTIFIER \ |
| TINT_DISABLE_WARNING_RESERVED_MACRO_IDENTIFIER \ |
| TINT_DISABLE_WARNING_SHADOW_FIELD_IN_CONSTRUCTOR \ |
| TINT_DISABLE_WARNING_SIGN_CONVERSION \ |
| TINT_DISABLE_WARNING_UNUSED_PARAMETER \ |
| TINT_DISABLE_WARNING_WEAK_VTABLES \ |
| TINT_DISABLE_WARNING_ZERO_AS_NULLPTR \ |
| 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") \ |
| _Pragma("clang diagnostic ignored \"-Weverything\"") \ |
| 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 |
| |
| #define TINT_UNLIKELY(x) __builtin_expect(!!(x), false) |
| #define TINT_LIKELY(x) __builtin_expect(!!(x), true) |
| |
| #if __has_feature(address_sanitizer) |
| #define TINT_ASAN_ENABLED |
| #endif |
| |
| #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_MAYBE_UNINITIALIZED \ |
| _Pragma("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") |
| #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_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_UNREACHABLE_CODE /* 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 */ |
| |
| #define TINT_BEGIN_DISABLE_PROTOBUF_WARNINGS() \ |
| _Pragma("GCC diagnostic push") TINT_DISABLE_WARNING_UNUSED_PARAMETER TINT_REQUIRE_SEMICOLON |
| #define TINT_END_DISABLE_PROTOBUF_WARNINGS() _Pragma("GCC 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 |
| |
| // 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_SIGN_CONVERSION \ |
| TINT_DISABLE_WARNING_UNREACHABLE_CODE \ |
| TINT_DISABLE_WARNING_WEAK_VTABLES \ |
| TINT_DISABLE_WARNING_FLOAT_EQUAL \ |
| TINT_DISABLE_WARNING_DEPRECATED \ |
| 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_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 |
| |
| #define TINT_UNLIKELY(x) __builtin_expect(!!(x), false) |
| #define TINT_LIKELY(x) __builtin_expect(!!(x), true) |
| |
| #if defined(__SANITIZE_ADDRESS__) |
| #define TINT_ASAN_ENABLED |
| #endif |
| |
| #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 |
| #define TINT_UNLIKELY(x) x |
| #define TINT_LIKELY(x) x |
| |
| #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_ |