1 /* 2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef WTF_Compiler_h 27 #define WTF_Compiler_h 28 29 /* COMPILER() - the compiler being used to build the project */ 30 #define COMPILER(WTF_FEATURE) (defined WTF_COMPILER_##WTF_FEATURE && WTF_COMPILER_##WTF_FEATURE) 31 32 /* COMPILER_SUPPORTS() - whether the compiler being used to build the project supports the given feature. */ 33 #define COMPILER_SUPPORTS(WTF_COMPILER_FEATURE) (defined WTF_COMPILER_SUPPORTS_##WTF_COMPILER_FEATURE && WTF_COMPILER_SUPPORTS_##WTF_COMPILER_FEATURE) 34 35 /* COMPILER_QUIRK() - whether the compiler being used to build the project requires a given quirk. */ 36 #define COMPILER_QUIRK(WTF_COMPILER_QUIRK) (defined WTF_COMPILER_QUIRK_##WTF_COMPILER_QUIRK && WTF_COMPILER_QUIRK_##WTF_COMPILER_QUIRK) 37 38 /* ==== COMPILER() - the compiler being used to build the project ==== */ 39 40 /* COMPILER(CLANG) - Clang */ 41 #if defined(__clang__) 42 #define WTF_COMPILER_CLANG 1 43 44 #define CLANG_PRAGMA(PRAGMA) _Pragma(PRAGMA) 45 46 /* Specific compiler features */ 47 #define WTF_COMPILER_SUPPORTS_CXX_VARIADIC_TEMPLATES __has_extension(cxx_variadic_templates) 48 49 /* There is a bug in clang that comes with Xcode 4.2 where AtomicStrings can't be implicitly converted to Strings 50 in the presence of move constructors and/or move assignment operators. This bug has been fixed in Xcode 4.3 clang, so we 51 check for both cxx_rvalue_references as well as the unrelated cxx_nonstatic_member_init feature which we know was added in 4.3 */ 52 #define WTF_COMPILER_SUPPORTS_CXX_RVALUE_REFERENCES __has_extension(cxx_rvalue_references) && __has_extension(cxx_nonstatic_member_init) 53 54 #define WTF_COMPILER_SUPPORTS_CXX_DELETED_FUNCTIONS __has_extension(cxx_deleted_functions) 55 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR __has_feature(cxx_nullptr) 56 #define WTF_COMPILER_SUPPORTS_CXX_EXPLICIT_CONVERSIONS __has_feature(cxx_explicit_conversions) 57 #define WTF_COMPILER_SUPPORTS_BLOCKS __has_feature(blocks) 58 #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT __has_extension(c_static_assert) 59 #define WTF_COMPILER_SUPPORTS_CXX_STATIC_ASSERT __has_extension(cxx_static_assert) 60 #define WTF_COMPILER_SUPPORTS_CXX_OVERRIDE_CONTROL __has_extension(cxx_override_control) 61 #define WTF_COMPILER_SUPPORTS_HAS_TRIVIAL_DESTRUCTOR __has_extension(has_trivial_destructor) 62 #define WTF_COMPILER_SUPPORTS_CXX_STRONG_ENUMS __has_extension(cxx_strong_enums) 63 64 #endif 65 66 #ifndef CLANG_PRAGMA 67 #define CLANG_PRAGMA(PRAGMA) 68 #endif 69 70 /* COMPILER(MSVC) - Microsoft Visual C++ */ 71 #if defined(_MSC_VER) 72 #define WTF_COMPILER_MSVC 1 73 74 /* Specific compiler features */ 75 #if !COMPILER(CLANG) && _MSC_VER >= 1600 76 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR 1 77 #endif 78 79 #if COMPILER(CLANG) 80 /* Keep strong enums turned off when building with clang-cl: We cannot yet build all of Blink without fallback to cl.exe, and strong enums are exposed at ABI boundaries. */ 81 #undef WTF_COMPILER_SUPPORTS_CXX_STRONG_ENUMS 82 #else 83 #define WTF_COMPILER_SUPPORTS_CXX_OVERRIDE_CONTROL 1 84 #endif 85 86 #endif 87 88 /* COMPILER(GCC) - GNU Compiler Collection */ 89 #if defined(__GNUC__) 90 #define WTF_COMPILER_GCC 1 91 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) 92 #define GCC_VERSION_AT_LEAST(major, minor, patch) (GCC_VERSION >= (major * 10000 + minor * 100 + patch)) 93 #else 94 /* Define this for !GCC compilers, just so we can write things like GCC_VERSION_AT_LEAST(4, 1, 0). */ 95 #define GCC_VERSION_AT_LEAST(major, minor, patch) 0 96 #endif 97 98 /* Specific compiler features */ 99 #if COMPILER(GCC) && !COMPILER(CLANG) 100 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L 101 /* C11 support */ 102 #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT 1 103 #endif 104 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && __cplusplus >= 201103L) 105 /* C++11 support */ 106 #if GCC_VERSION_AT_LEAST(4, 3, 0) 107 #define WTF_COMPILER_SUPPORTS_CXX_RVALUE_REFERENCES 1 108 #define WTF_COMPILER_SUPPORTS_CXX_STATIC_ASSERT 1 109 #define WTF_COMPILER_SUPPORTS_CXX_VARIADIC_TEMPLATES 1 110 #endif 111 #if GCC_VERSION_AT_LEAST(4, 4, 0) 112 #define WTF_COMPILER_SUPPORTS_CXX_DELETED_FUNCTIONS 1 113 #endif 114 #if GCC_VERSION_AT_LEAST(4, 5, 0) 115 #define WTF_COMPILER_SUPPORTS_CXX_EXPLICIT_CONVERSIONS 1 116 #endif 117 #if GCC_VERSION_AT_LEAST(4, 6, 0) 118 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR 1 119 /* Strong enums should work from gcc 4.4, but doesn't seem to support some operators */ 120 #define WTF_COMPILER_SUPPORTS_CXX_STRONG_ENUMS 1 121 #endif 122 #if GCC_VERSION_AT_LEAST(4, 7, 0) 123 #define WTF_COMPILER_SUPPORTS_CXX_OVERRIDE_CONTROL 1 124 #endif 125 #endif /* defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && __cplusplus >= 201103L) */ 126 #endif /* COMPILER(GCC) */ 127 128 /* ==== Compiler features ==== */ 129 130 131 /* ALWAYS_INLINE */ 132 133 #ifndef ALWAYS_INLINE 134 #if COMPILER(GCC) && defined(NDEBUG) && !COMPILER(MINGW) 135 #define ALWAYS_INLINE inline __attribute__((__always_inline__)) 136 #elif COMPILER(MSVC) && defined(NDEBUG) 137 #define ALWAYS_INLINE __forceinline 138 #else 139 #define ALWAYS_INLINE inline 140 #endif 141 #endif 142 143 144 /* NEVER_INLINE */ 145 146 #ifndef NEVER_INLINE 147 #if COMPILER(GCC) 148 #define NEVER_INLINE __attribute__((__noinline__)) 149 #elif COMPILER(MSVC) 150 #define NEVER_INLINE __declspec(noinline) 151 #else 152 #define NEVER_INLINE 153 #endif 154 #endif 155 156 157 /* UNLIKELY */ 158 159 #ifndef UNLIKELY 160 #if COMPILER(GCC) 161 #define UNLIKELY(x) __builtin_expect((x), 0) 162 #else 163 #define UNLIKELY(x) (x) 164 #endif 165 #endif 166 167 168 /* LIKELY */ 169 170 #ifndef LIKELY 171 #if COMPILER(GCC) 172 #define LIKELY(x) __builtin_expect((x), 1) 173 #else 174 #define LIKELY(x) (x) 175 #endif 176 #endif 177 178 179 /* NO_RETURN */ 180 181 182 #ifndef NO_RETURN 183 #if COMPILER(GCC) 184 #define NO_RETURN __attribute((__noreturn__)) 185 #elif COMPILER(MSVC) 186 #define NO_RETURN __declspec(noreturn) 187 #else 188 #define NO_RETURN 189 #endif 190 #endif 191 192 193 /* WARN_UNUSED_RETURN */ 194 195 #if COMPILER(GCC) 196 #define WARN_UNUSED_RETURN __attribute__ ((warn_unused_result)) 197 #else 198 #define WARN_UNUSED_RETURN 199 #endif 200 201 /* ALLOW_UNUSED */ 202 203 #if COMPILER(GCC) 204 #define ALLOW_UNUSED __attribute__((unused)) 205 #else 206 #define ALLOW_UNUSED 207 #endif 208 209 /* OVERRIDE and FINAL */ 210 211 #if COMPILER_SUPPORTS(CXX_OVERRIDE_CONTROL) 212 #define OVERRIDE override 213 #define FINAL final 214 #else 215 #define OVERRIDE 216 #define FINAL 217 #endif 218 219 /* WTF_DELETED_FUNCTION */ 220 221 #if COMPILER_SUPPORTS(CXX_DELETED_FUNCTIONS) 222 #define WTF_DELETED_FUNCTION = delete 223 #else 224 #define WTF_DELETED_FUNCTION 225 #endif 226 227 /* REFERENCED_FROM_ASM */ 228 229 #ifndef REFERENCED_FROM_ASM 230 #if COMPILER(GCC) 231 #define REFERENCED_FROM_ASM __attribute__((used)) 232 #else 233 #define REFERENCED_FROM_ASM 234 #endif 235 #endif 236 237 /* OBJC_CLASS */ 238 239 #ifndef OBJC_CLASS 240 #ifdef __OBJC__ 241 #define OBJC_CLASS @class 242 #else 243 #define OBJC_CLASS class 244 #endif 245 #endif 246 247 /* WTF_PRETTY_FUNCTION */ 248 249 #if COMPILER(GCC) 250 #define WTF_COMPILER_SUPPORTS_PRETTY_FUNCTION 1 251 #define WTF_PRETTY_FUNCTION __PRETTY_FUNCTION__ 252 #elif COMPILER(MSVC) 253 #define WTF_COMPILER_SUPPORTS_PRETTY_FUNCTION 1 254 #define WTF_PRETTY_FUNCTION __FUNCDNAME__ 255 #else 256 #define WTF_PRETTY_FUNCTION __FUNCTION__ 257 #endif 258 259 #endif /* WTF_Compiler_h */ 260