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