1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2020 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VPX_PORTS_COMPILER_ATTRIBUTES_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VPX_PORTS_COMPILER_ATTRIBUTES_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #if !defined(__has_feature) 15*fb1b10abSAndroid Build Coastguard Worker #define __has_feature(x) 0 16*fb1b10abSAndroid Build Coastguard Worker #endif // !defined(__has_feature) 17*fb1b10abSAndroid Build Coastguard Worker 18*fb1b10abSAndroid Build Coastguard Worker #if !defined(__has_attribute) 19*fb1b10abSAndroid Build Coastguard Worker #define __has_attribute(x) 0 20*fb1b10abSAndroid Build Coastguard Worker #endif // !defined(__has_attribute) 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard Worker //------------------------------------------------------------------------------ 23*fb1b10abSAndroid Build Coastguard Worker // Sanitizer attributes. 24*fb1b10abSAndroid Build Coastguard Worker 25*fb1b10abSAndroid Build Coastguard Worker #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 26*fb1b10abSAndroid Build Coastguard Worker #define VPX_WITH_ASAN 1 27*fb1b10abSAndroid Build Coastguard Worker #else 28*fb1b10abSAndroid Build Coastguard Worker #define VPX_WITH_ASAN 0 29*fb1b10abSAndroid Build Coastguard Worker #endif // __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 30*fb1b10abSAndroid Build Coastguard Worker 31*fb1b10abSAndroid Build Coastguard Worker #if defined(__clang__) && __has_attribute(no_sanitize) 32*fb1b10abSAndroid Build Coastguard Worker // Both of these have defined behavior and are used in certain operations or 33*fb1b10abSAndroid Build Coastguard Worker // optimizations thereof. There are cases where an overflow may be unintended, 34*fb1b10abSAndroid Build Coastguard Worker // however, so use of these attributes should be done with care. 35*fb1b10abSAndroid Build Coastguard Worker #define VPX_NO_UNSIGNED_OVERFLOW_CHECK \ 36*fb1b10abSAndroid Build Coastguard Worker __attribute__((no_sanitize("unsigned-integer-overflow"))) 37*fb1b10abSAndroid Build Coastguard Worker #if __clang_major__ >= 12 38*fb1b10abSAndroid Build Coastguard Worker #define VPX_NO_UNSIGNED_SHIFT_CHECK \ 39*fb1b10abSAndroid Build Coastguard Worker __attribute__((no_sanitize("unsigned-shift-base"))) 40*fb1b10abSAndroid Build Coastguard Worker #endif // __clang__ >= 12 41*fb1b10abSAndroid Build Coastguard Worker #endif // __clang__ 42*fb1b10abSAndroid Build Coastguard Worker 43*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_NO_UNSIGNED_OVERFLOW_CHECK 44*fb1b10abSAndroid Build Coastguard Worker #define VPX_NO_UNSIGNED_OVERFLOW_CHECK 45*fb1b10abSAndroid Build Coastguard Worker #endif 46*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_NO_UNSIGNED_SHIFT_CHECK 47*fb1b10abSAndroid Build Coastguard Worker #define VPX_NO_UNSIGNED_SHIFT_CHECK 48*fb1b10abSAndroid Build Coastguard Worker #endif 49*fb1b10abSAndroid Build Coastguard Worker 50*fb1b10abSAndroid Build Coastguard Worker //------------------------------------------------------------------------------ 51*fb1b10abSAndroid Build Coastguard Worker // Variable attributes. 52*fb1b10abSAndroid Build Coastguard Worker 53*fb1b10abSAndroid Build Coastguard Worker #if __has_attribute(uninitialized) 54*fb1b10abSAndroid Build Coastguard Worker // Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for 55*fb1b10abSAndroid Build Coastguard Worker // the specified variable. 56*fb1b10abSAndroid Build Coastguard Worker // 57*fb1b10abSAndroid Build Coastguard Worker // -ftrivial-auto-var-init is security risk mitigation feature, so attribute 58*fb1b10abSAndroid Build Coastguard Worker // should not be used "just in case", but only to fix real performance 59*fb1b10abSAndroid Build Coastguard Worker // bottlenecks when other approaches do not work. In general the compiler is 60*fb1b10abSAndroid Build Coastguard Worker // quite effective at eliminating unneeded initializations introduced by the 61*fb1b10abSAndroid Build Coastguard Worker // flag, e.g. when they are followed by actual initialization by a program. 62*fb1b10abSAndroid Build Coastguard Worker // However if compiler optimization fails and code refactoring is hard, the 63*fb1b10abSAndroid Build Coastguard Worker // attribute can be used as a workaround. 64*fb1b10abSAndroid Build Coastguard Worker #define VPX_UNINITIALIZED __attribute__((uninitialized)) 65*fb1b10abSAndroid Build Coastguard Worker #else 66*fb1b10abSAndroid Build Coastguard Worker #define VPX_UNINITIALIZED 67*fb1b10abSAndroid Build Coastguard Worker #endif // __has_attribute(uninitialized) 68*fb1b10abSAndroid Build Coastguard Worker 69*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VPX_PORTS_COMPILER_ATTRIBUTES_H_ 70