1*cf84ac9aSAndroid Build Coastguard Worker /* 2*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2015 Dmitry V. Levin <[email protected]> 3*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2015-2018 The strace developers. 4*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved. 5*cf84ac9aSAndroid Build Coastguard Worker * 6*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 7*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 8*cf84ac9aSAndroid Build Coastguard Worker * are met: 9*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 10*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 11*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 12*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 13*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 14*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products 15*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 16*cf84ac9aSAndroid Build Coastguard Worker * 17*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*cf84ac9aSAndroid Build Coastguard Worker */ 28*cf84ac9aSAndroid Build Coastguard Worker 29*cf84ac9aSAndroid Build Coastguard Worker #ifndef STRACE_GCC_COMPAT_H 30*cf84ac9aSAndroid Build Coastguard Worker #define STRACE_GCC_COMPAT_H 31*cf84ac9aSAndroid Build Coastguard Worker 32*cf84ac9aSAndroid Build Coastguard Worker #if defined __GNUC__ && defined __GNUC_MINOR__ 33*cf84ac9aSAndroid Build Coastguard Worker # define GNUC_PREREQ(maj, min) \ 34*cf84ac9aSAndroid Build Coastguard Worker ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) 35*cf84ac9aSAndroid Build Coastguard Worker #else 36*cf84ac9aSAndroid Build Coastguard Worker # define GNUC_PREREQ(maj, min) 0 37*cf84ac9aSAndroid Build Coastguard Worker #endif 38*cf84ac9aSAndroid Build Coastguard Worker 39*cf84ac9aSAndroid Build Coastguard Worker #if defined __clang__ && defined __clang_major__ && defined __clang_minor__ 40*cf84ac9aSAndroid Build Coastguard Worker # define CLANG_PREREQ(maj, min) \ 41*cf84ac9aSAndroid Build Coastguard Worker ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min)) 42*cf84ac9aSAndroid Build Coastguard Worker #else 43*cf84ac9aSAndroid Build Coastguard Worker # define CLANG_PREREQ(maj, min) 0 44*cf84ac9aSAndroid Build Coastguard Worker #endif 45*cf84ac9aSAndroid Build Coastguard Worker 46*cf84ac9aSAndroid Build Coastguard Worker #if !(GNUC_PREREQ(2, 0) || CLANG_PREREQ(1, 0)) 47*cf84ac9aSAndroid Build Coastguard Worker # define __attribute__(x) /* empty */ 48*cf84ac9aSAndroid Build Coastguard Worker #endif 49*cf84ac9aSAndroid Build Coastguard Worker 50*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(2, 5) 51*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_NORETURN __attribute__((__noreturn__)) 52*cf84ac9aSAndroid Build Coastguard Worker #else 53*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_NORETURN /* empty */ 54*cf84ac9aSAndroid Build Coastguard Worker #endif 55*cf84ac9aSAndroid Build Coastguard Worker 56*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(2, 7) 57*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_FORMAT(args) __attribute__((__format__ args)) 58*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_ALIGNED(arg) __attribute__((__aligned__(arg))) 59*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_PACKED __attribute__((__packed__)) 60*cf84ac9aSAndroid Build Coastguard Worker #else 61*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_FORMAT(args) /* empty */ 62*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_ALIGNED(arg) /* empty */ 63*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_PACKED /* empty */ 64*cf84ac9aSAndroid Build Coastguard Worker #endif 65*cf84ac9aSAndroid Build Coastguard Worker 66*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(3, 0) 67*cf84ac9aSAndroid Build Coastguard Worker # define SAME_TYPE(x, y) __builtin_types_compatible_p(typeof(x), typeof(y)) 68*cf84ac9aSAndroid Build Coastguard Worker # define FAIL_BUILD_ON_ZERO(expr) (sizeof(int[-1 + 2 * !!(expr)]) * 0) 69*cf84ac9aSAndroid Build Coastguard Worker /* &(a)[0] is a pointer and not an array, shouldn't be treated as the same */ 70*cf84ac9aSAndroid Build Coastguard Worker # define MUST_BE_ARRAY(a) FAIL_BUILD_ON_ZERO(!SAME_TYPE((a), &(a)[0])) 71*cf84ac9aSAndroid Build Coastguard Worker #else 72*cf84ac9aSAndroid Build Coastguard Worker # define SAME_TYPE(x, y) 0 73*cf84ac9aSAndroid Build Coastguard Worker # define MUST_BE_ARRAY(a) 0 74*cf84ac9aSAndroid Build Coastguard Worker #endif 75*cf84ac9aSAndroid Build Coastguard Worker 76*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(3, 0) 77*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_MALLOC __attribute__((__malloc__)) 78*cf84ac9aSAndroid Build Coastguard Worker #else 79*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_MALLOC /* empty */ 80*cf84ac9aSAndroid Build Coastguard Worker #endif 81*cf84ac9aSAndroid Build Coastguard Worker 82*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(3, 1) 83*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_NOINLINE __attribute__((__noinline__)) 84*cf84ac9aSAndroid Build Coastguard Worker #else 85*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_NOINLINE /* empty */ 86*cf84ac9aSAndroid Build Coastguard Worker #endif 87*cf84ac9aSAndroid Build Coastguard Worker 88*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(4, 0) 89*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_SENTINEL __attribute__((__sentinel__)) 90*cf84ac9aSAndroid Build Coastguard Worker #else 91*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_SENTINEL /* empty */ 92*cf84ac9aSAndroid Build Coastguard Worker #endif 93*cf84ac9aSAndroid Build Coastguard Worker 94*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(4, 1) 95*cf84ac9aSAndroid Build Coastguard Worker # define ALIGNOF(t_) __alignof__(t_) 96*cf84ac9aSAndroid Build Coastguard Worker #else 97*cf84ac9aSAndroid Build Coastguard Worker # define ALIGNOF(t_) (sizeof(struct { char x_; t_ y_; }) - sizeof(t_)) 98*cf84ac9aSAndroid Build Coastguard Worker #endif 99*cf84ac9aSAndroid Build Coastguard Worker 100*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(4, 3) 101*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_ALLOC_SIZE(args) __attribute__((__alloc_size__ args)) 102*cf84ac9aSAndroid Build Coastguard Worker #else 103*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_ALLOC_SIZE(args) /* empty */ 104*cf84ac9aSAndroid Build Coastguard Worker #endif 105*cf84ac9aSAndroid Build Coastguard Worker 106*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(7, 0) 107*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_FALLTHROUGH __attribute__((__fallthrough__)) 108*cf84ac9aSAndroid Build Coastguard Worker #else 109*cf84ac9aSAndroid Build Coastguard Worker # define ATTRIBUTE_FALLTHROUGH ((void) 0) 110*cf84ac9aSAndroid Build Coastguard Worker #endif 111*cf84ac9aSAndroid Build Coastguard Worker 112*cf84ac9aSAndroid Build Coastguard Worker #if CLANG_PREREQ(2, 8) 113*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_PUSH_IGNORE_OVERRIDE_INIT \ 114*cf84ac9aSAndroid Build Coastguard Worker _Pragma("clang diagnostic push"); \ 115*cf84ac9aSAndroid Build Coastguard Worker _Pragma("clang diagnostic ignored \"-Winitializer-overrides\""); 116*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_POP_IGNORE_OVERRIDE_INIT \ 117*cf84ac9aSAndroid Build Coastguard Worker _Pragma("clang diagnostic pop"); 118*cf84ac9aSAndroid Build Coastguard Worker #elif GNUC_PREREQ(4, 2) 119*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_PUSH_IGNORE_OVERRIDE_INIT \ 120*cf84ac9aSAndroid Build Coastguard Worker _Pragma("GCC diagnostic push"); \ 121*cf84ac9aSAndroid Build Coastguard Worker _Pragma("GCC diagnostic ignored \"-Woverride-init\""); 122*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_POP_IGNORE_OVERRIDE_INIT \ 123*cf84ac9aSAndroid Build Coastguard Worker _Pragma("GCC diagnostic pop"); 124*cf84ac9aSAndroid Build Coastguard Worker #else 125*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_PUSH_IGNORE_OVERRIDE_INIT /* empty */ 126*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_POP_IGNORE_OVERRIDE_INIT /* empty */ 127*cf84ac9aSAndroid Build Coastguard Worker #endif 128*cf84ac9aSAndroid Build Coastguard Worker 129*cf84ac9aSAndroid Build Coastguard Worker #if GNUC_PREREQ(6, 0) 130*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE \ 131*cf84ac9aSAndroid Build Coastguard Worker _Pragma("GCC diagnostic push"); \ 132*cf84ac9aSAndroid Build Coastguard Worker _Pragma("GCC diagnostic ignored \"-Wtautological-compare\""); 133*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE \ 134*cf84ac9aSAndroid Build Coastguard Worker _Pragma("GCC diagnostic pop"); 135*cf84ac9aSAndroid Build Coastguard Worker #else 136*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE /* empty */ 137*cf84ac9aSAndroid Build Coastguard Worker # define DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE /* empty */ 138*cf84ac9aSAndroid Build Coastguard Worker #endif 139*cf84ac9aSAndroid Build Coastguard Worker 140*cf84ac9aSAndroid Build Coastguard Worker #endif /* !STRACE_GCC_COMPAT_H */ 141