1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkAttributes_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkAttributes_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkFeatures.h" // IWYU pragma: keep 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkLoadUserConfig.h" // IWYU pragma: keep 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #if defined(__clang__) || defined(__GNUC__) 15*c8dee2aaSAndroid Build Coastguard Worker # define SK_ATTRIBUTE(attr) __attribute__((attr)) 16*c8dee2aaSAndroid Build Coastguard Worker #else 17*c8dee2aaSAndroid Build Coastguard Worker # define SK_ATTRIBUTE(attr) 18*c8dee2aaSAndroid Build Coastguard Worker #endif 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker /** 21*c8dee2aaSAndroid Build Coastguard Worker * If your judgment is better than the compiler's (i.e. you've profiled it), 22*c8dee2aaSAndroid Build Coastguard Worker * you can use SK_ALWAYS_INLINE to force inlining. E.g. 23*c8dee2aaSAndroid Build Coastguard Worker * inline void someMethod() { ... } // may not be inlined 24*c8dee2aaSAndroid Build Coastguard Worker * SK_ALWAYS_INLINE void someMethod() { ... } // should always be inlined 25*c8dee2aaSAndroid Build Coastguard Worker */ 26*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ALWAYS_INLINE) 27*c8dee2aaSAndroid Build Coastguard Worker # if defined(SK_BUILD_FOR_WIN) 28*c8dee2aaSAndroid Build Coastguard Worker # define SK_ALWAYS_INLINE __forceinline 29*c8dee2aaSAndroid Build Coastguard Worker # else 30*c8dee2aaSAndroid Build Coastguard Worker # define SK_ALWAYS_INLINE SK_ATTRIBUTE(always_inline) inline 31*c8dee2aaSAndroid Build Coastguard Worker # endif 32*c8dee2aaSAndroid Build Coastguard Worker #endif 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker /** 35*c8dee2aaSAndroid Build Coastguard Worker * If your judgment is better than the compiler's (i.e. you've profiled it), 36*c8dee2aaSAndroid Build Coastguard Worker * you can use SK_NEVER_INLINE to prevent inlining. 37*c8dee2aaSAndroid Build Coastguard Worker */ 38*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_NEVER_INLINE) 39*c8dee2aaSAndroid Build Coastguard Worker # if defined(SK_BUILD_FOR_WIN) 40*c8dee2aaSAndroid Build Coastguard Worker # define SK_NEVER_INLINE __declspec(noinline) 41*c8dee2aaSAndroid Build Coastguard Worker # else 42*c8dee2aaSAndroid Build Coastguard Worker # define SK_NEVER_INLINE SK_ATTRIBUTE(noinline) 43*c8dee2aaSAndroid Build Coastguard Worker # endif 44*c8dee2aaSAndroid Build Coastguard Worker #endif 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker /** 47*c8dee2aaSAndroid Build Coastguard Worker * Used to annotate a function as taking printf style arguments. 48*c8dee2aaSAndroid Build Coastguard Worker * `A` is the (1 based) index of the format string argument. 49*c8dee2aaSAndroid Build Coastguard Worker * `B` is the (1 based) index of the first argument used by the format string. 50*c8dee2aaSAndroid Build Coastguard Worker */ 51*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_PRINTF_LIKE) 52*c8dee2aaSAndroid Build Coastguard Worker # define SK_PRINTF_LIKE(A, B) SK_ATTRIBUTE(format(printf, (A), (B))) 53*c8dee2aaSAndroid Build Coastguard Worker #endif 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker /** 56*c8dee2aaSAndroid Build Coastguard Worker * Used to ignore sanitizer warnings. 57*c8dee2aaSAndroid Build Coastguard Worker */ 58*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_NO_SANITIZE) 59*c8dee2aaSAndroid Build Coastguard Worker #if defined(__has_attribute) 60*c8dee2aaSAndroid Build Coastguard Worker #if __has_attribute(no_sanitize) 61*c8dee2aaSAndroid Build Coastguard Worker // This should be for clang and versions of gcc >= 8.0 62*c8dee2aaSAndroid Build Coastguard Worker #define SK_NO_SANITIZE(A) SK_ATTRIBUTE(no_sanitize(A)) 63*c8dee2aaSAndroid Build Coastguard Worker #else 64*c8dee2aaSAndroid Build Coastguard Worker // For compilers that don't support sanitization, just do nothing. 65*c8dee2aaSAndroid Build Coastguard Worker #define SK_NO_SANITIZE(A) 66*c8dee2aaSAndroid Build Coastguard Worker #endif 67*c8dee2aaSAndroid Build Coastguard Worker #else // no __has_attribute, e.g. MSVC 68*c8dee2aaSAndroid Build Coastguard Worker #define SK_NO_SANITIZE(A) 69*c8dee2aaSAndroid Build Coastguard Worker #endif 70*c8dee2aaSAndroid Build Coastguard Worker #endif 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker /** 73*c8dee2aaSAndroid Build Coastguard Worker * Annotates a class' non-trivial special functions as trivial for the purposes of calls. 74*c8dee2aaSAndroid Build Coastguard Worker * Allows a class with a non-trivial destructor to be __is_trivially_relocatable. 75*c8dee2aaSAndroid Build Coastguard Worker * Use of this attribute on a public API breaks platform ABI. 76*c8dee2aaSAndroid Build Coastguard Worker * Annotated classes may not hold pointers derived from `this`. 77*c8dee2aaSAndroid Build Coastguard Worker * Annotated classes must implement move+delete as equivalent to memcpy+free. 78*c8dee2aaSAndroid Build Coastguard Worker * Use may require more complete types, as callee destroys. 79*c8dee2aaSAndroid Build Coastguard Worker * 80*c8dee2aaSAndroid Build Coastguard Worker * https://clang.llvm.org/docs/AttributeReference.html#trivial-abi 81*c8dee2aaSAndroid Build Coastguard Worker * https://libcxx.llvm.org/DesignDocs/UniquePtrTrivialAbi.html 82*c8dee2aaSAndroid Build Coastguard Worker */ 83*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_TRIVIAL_ABI) 84*c8dee2aaSAndroid Build Coastguard Worker # define SK_TRIVIAL_ABI 85*c8dee2aaSAndroid Build Coastguard Worker #endif 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker #endif 88