Hi Mark
Mark Callaghan wrote:
> There is a macro in my_global.h that defines __attribute__ to be a no-op
> when gcc is used. '__cplusplus' is defined when gcc3.2 and gcc3.4 are
> used
> to compile MySQL on Linux. The result of this is that the many uses of
> __attribute__ are not available, including type-checking the format
> args to
> printf (and printf-like) statements.
>
> This is the macro in 4.0.26 and 5.1.11. Is this definition correct?
>
> #if !defined(__attribute__) && (defined(__cplusplus) ||
> !defined(__GNUC__)
> || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
> #define __attribute__(A)
> #endif
>
> If the macro were defined as this, then it would not be a no-op for gcc
> versions >= 3.4
>
> #if !defined(__attribute__) && \
> (!defined(__GNUC__) || \
> (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || \
> (defined(__cplusplus) && (__GNUC__ < 3 || __GNUC__ == 3
> &&
> __GNUC_MINOR__ < 4)))
> #define __attribute__(A)
> #endif
>
Good catch, verified by this quick test with 5.1-BK & GCC 3.4.6 :
#include "mysql_priv.h"
#ifdef __attribute__
#error why, since I use GCC 3.4.6 which should be told about __attribute__
#endif
To add to the discussion and regarding version numbers, there are
probably two things to consider :
- which version of GCC supports the __attribute__ keyword
- which version of GCC supports each attribute used (weak, unused,
noreturn, etc)
For the first part, /usr/include/ansidecl.h on linux does it the
following way
(much simpler) :
#if (GCC_VERSION < 2007)
# define __attribute__(x)
#endif
For the second part, there is an example in MySQL :
/*
The following macros are used to control inlining a bit more than
usual. These macros are used to ensure that inlining always or
never occurs (independent of compilation mode).
For more input see GCC manual (available in GCC 3.1.1 and later)
*/
#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR > 10)
#define ALWAYS_INLINE __attribute__ ((always_inline))
#define NEVER_INLINE __attribute__ ((noinline))
#else
#define ALWAYS_INLINE
#define NEVER_INLINE
#endif
/usr/include/ansidecl.h on Linux uses GCC_VERSION instead :
/* Attribute __malloc__ on functions was valid as of gcc 2.96. */
#ifndef ATTRIBUTE_MALLOC
# if (GCC_VERSION >= 2096)
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
# else
# define ATTRIBUTE_MALLOC
# endif /* GNUC >= 2.96 */
#endif /* ATTRIBUTE_MALLOC */
So, I don't think a test on 3.4 should be part of the __attribute__ macro.
If a specific attribute only introduced in 3.4
is used, I would define helpers similar to ATTRIBUTE_MALLOC.
Regards,
Marc Alff