1 /* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 2 3 This program is free software; you can redistribute it and/or modify 4 it under the terms of the GNU General Public License as published by 5 the Free Software Foundation; version 2 of the License. 6 7 This program is distributed in the hope that it will be useful, 8 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 GNU General Public License for more details. 11 12 You should have received a copy of the GNU General Public License 13 along with this program; if not, write to the Free Software 14 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ 15 16 /* 17 Helper macros used for setting different __attributes__ 18 on functions in a portable fashion 19 */ 20 21 #ifndef _my_attribute_h 22 #define _my_attribute_h 23 24 #if defined(__GNUC__) 25 # ifndef GCC_VERSION 26 # define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) 27 # endif 28 #endif 29 30 /* 31 Disable __attribute__() on gcc < 2.7, g++ < 3.4, and non-gcc compilers. 32 Some forms of __attribute__ are actually supported in earlier versions of 33 g++, but we just disable them all because we only use them to generate 34 compilation warnings. 35 */ 36 #ifndef __attribute__ 37 # if !defined(__GNUC__) && !defined(__clang__) 38 # define __attribute__(A) 39 # elif defined(__GNUC__) 40 # ifndef GCC_VERSION 41 # define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) 42 # endif 43 # if GCC_VERSION < 2008 44 # define __attribute__(A) 45 # elif defined(__cplusplus) && GCC_VERSION < 3004 46 # define __attribute__(A) 47 # endif 48 # endif 49 #endif 50 51 /* 52 __attribute__((format(...))) is only supported in gcc >= 2.8 and g++ >= 3.4 53 But that's already covered by the __attribute__ tests above, so this is 54 just a convenience macro. 55 */ 56 #ifndef ATTRIBUTE_FORMAT 57 # define ATTRIBUTE_FORMAT(style, m, n) __attribute__((format(style, m, n))) 58 #endif 59 60 /* 61 62 __attribute__((format(...))) on a function pointer is not supported 63 until gcc 3.1 64 */ 65 #ifndef ATTRIBUTE_FORMAT_FPTR 66 # if (GCC_VERSION >= 3001) 67 # define ATTRIBUTE_FORMAT_FPTR(style, m, n) ATTRIBUTE_FORMAT(style, m, n) 68 # else 69 # define ATTRIBUTE_FORMAT_FPTR(style, m, n) 70 # endif /* GNUC >= 3.1 */ 71 #endif 72 73 74 #endif 75