diff options
| author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-02 11:24:02 -0300 | 
|---|---|---|
| committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-02 11:24:02 -0300 | 
| commit | cab8cf970c09ea465d30e11eb356e2e5d37dc544 (patch) | |
| tree | 5d274c892e4d53f5e976ae8f6f58aba030785e02 /src/nvim/func_attr.h | |
| parent | 52a9a5b0b0c53a1481d901f39ed0d1e7e86c3853 (diff) | |
| parent | 4aecb71b0e819aa84a430dacdab2146229c410a5 (diff) | |
| download | rneovim-cab8cf970c09ea465d30e11eb356e2e5d37dc544.tar.gz rneovim-cab8cf970c09ea465d30e11eb356e2e5d37dc544.tar.bz2 rneovim-cab8cf970c09ea465d30e11eb356e2e5d37dc544.zip | |
Merge pull request #710 'Automatically generate declarations'
Diffstat (limited to 'src/nvim/func_attr.h')
| -rw-r--r-- | src/nvim/func_attr.h | 221 | 
1 files changed, 159 insertions, 62 deletions
| diff --git a/src/nvim/func_attr.h b/src/nvim/func_attr.h index 6e7149e8fb..6c29f0fed4 100644 --- a/src/nvim/func_attr.h +++ b/src/nvim/func_attr.h @@ -1,5 +1,25 @@ -#ifndef NVIM_FUNC_ATTR_H -#define NVIM_FUNC_ATTR_H +// If DEFINE_FUNC_ATTRIBUTES macro is not defined then all function attributes  +// are defined as empty values. +// +// If DO_NOT_DEFINE_EMPTY_ATTRIBUTES then empty macros are not defined. Thus  +// undefined DEFINE_FUNC_ATTRIBUTES and defined DO_NOT_DEFINE_EMPTY_ATTRIBUTES  +// leaves file with untouched FUNC_ATTR_* macros. This variant is used for  +// scripts/gendeclarations.lua. +// +// Empty macros are used for *.c files. (undefined DEFINE_FUNC_ATTRIBUTES and  +// undefined DO_NOT_DEFINE_EMPTY_ATTRIBUTES) +// +// Macros defined as __attribute__((*)) are used by generated header files.  +// (defined DEFINE_FUNC_ATTRIBUTES and undefined  +// DO_NOT_DEFINE_EMPTY_ATTRIBUTES) +// +// Defined DEFINE_FUNC_ATTRIBUTES and defined DO_NOT_DEFINE_EMPTY_ATTRIBUTES is  +// not used by anything. + +// FUNC_ATTR_* macros should be in *.c files for declarations generator. If you  +// define a function for which declaration is not generated by  +// gendeclarations.lua (e.g. template hash implementation) then you should use  +// REAL_FATTR_* macros.  // gcc and clang expose their version as follows:  // @@ -21,90 +41,167 @@  // $ gcc -E -dM - </dev/null  // $ echo | clang -dM -E - -#ifdef __GNUC__ -  // place defines for all gnulikes here, for now that's gcc, clang and -  // intel. - -  // place these after the argument list of the function declaration -  // (not definition), like so: -  // void myfunc(void) FUNC_ATTR_ALWAYS_INLINE; -  #define FUNC_ATTR_MALLOC __attribute__((malloc)) -  #define FUNC_ATTR_ALLOC_ALIGN(x) __attribute__((alloc_align(x))) -  #define FUNC_ATTR_PURE __attribute__ ((pure)) -  #define FUNC_ATTR_CONST __attribute__((const)) -  #define FUNC_ATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) -  #define FUNC_ATTR_ALWAYS_INLINE __attribute__((always_inline)) -  #define FUNC_ATTR_UNUSED __attribute__((unused)) - -  #ifdef __clang__ -    // clang only -  #elif defined(__INTEL_COMPILER) -    // intel only -  #else -    #define GCC_VERSION \ -           (__GNUC__ * 10000 + \ -            __GNUC_MINOR__ * 100 + \ -            __GNUC_PATCHLEVEL__) -    // gcc only -    #define FUNC_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) -    #define FUNC_ATTR_ALLOC_SIZE_PROD(x,y) __attribute__((alloc_size(x,y))) -    #define FUNC_ATTR_NONNULL_ALL __attribute__((nonnull)) -    #define FUNC_ATTR_NONNULL_ARG(...) __attribute__((nonnull(__VA_ARGS__))) -    #if GCC_VERSION >= 40900 -      #define FUNC_ATTR_NONNULL_RET __attribute__((returns_nonnull)) -    #endif -  #endif +#ifdef FUNC_ATTR_MALLOC +  #undef FUNC_ATTR_MALLOC  #endif -// define function attributes that haven't been defined for this specific -// compiler. +#ifdef FUNC_ATTR_ALLOC_SIZE +  #undef FUNC_ATTR_ALLOC_SIZE +#endif -#ifndef FUNC_ATTR_MALLOC -  #define FUNC_ATTR_MALLOC +#ifdef FUNC_ATTR_ALLOC_SIZE_PROD +  #undef FUNC_ATTR_ALLOC_SIZE_PROD  #endif -#ifndef FUNC_ATTR_ALLOC_SIZE -  #define FUNC_ATTR_ALLOC_SIZE(x) +#ifdef FUNC_ATTR_ALLOC_ALIGN +  #undef FUNC_ATTR_ALLOC_ALIGN  #endif -#ifndef FUNC_ATTR_ALLOC_SIZE_PROD -  #define FUNC_ATTR_ALLOC_SIZE_PROD(x,y) +#ifdef FUNC_ATTR_PURE +  #undef FUNC_ATTR_PURE  #endif -#ifndef FUNC_ATTR_ALLOC_ALIGN -  #define FUNC_ATTR_ALLOC_ALIGN(x) +#ifdef FUNC_ATTR_CONST +  #undef FUNC_ATTR_CONST  #endif -#ifndef FUNC_ATTR_PURE -  #define FUNC_ATTR_PURE +#ifdef FUNC_ATTR_WARN_UNUSED_RESULT +  #undef FUNC_ATTR_WARN_UNUSED_RESULT  #endif -#ifndef FUNC_ATTR_CONST -  #define FUNC_ATTR_CONST +#ifdef FUNC_ATTR_ALWAYS_INLINE +  #undef FUNC_ATTR_ALWAYS_INLINE  #endif -#ifndef FUNC_ATTR_WARN_UNUSED_RESULT -  #define FUNC_ATTR_WARN_UNUSED_RESULT +#ifdef FUNC_ATTR_UNUSED +  #undef FUNC_ATTR_UNUSED  #endif -#ifndef FUNC_ATTR_ALWAYS_INLINE -  #define FUNC_ATTR_ALWAYS_INLINE +#ifdef FUNC_ATTR_NONNULL_ALL +  #undef FUNC_ATTR_NONNULL_ALL  #endif -#ifndef FUNC_ATTR_UNUSED -  #define FUNC_ATTR_UNUSED +#ifdef FUNC_ATTR_NONNULL_ARG +  #undef FUNC_ATTR_NONNULL_ARG  #endif -#ifndef FUNC_ATTR_NONNULL_ALL -  #define FUNC_ATTR_NONNULL_ALL +#ifdef FUNC_ATTR_NONNULL_RET +  #undef FUNC_ATTR_NONNULL_RET  #endif -#ifndef FUNC_ATTR_NONNULL_ARG -  #define FUNC_ATTR_NONNULL_ARG(...) +#ifndef DID_REAL_ATTR +  #define DID_REAL_ATTR +  #ifdef __GNUC__ +    // place defines for all gnulikes here, for now that's gcc, clang and +    // intel. + +    // place these after the argument list of the function declaration +    // (not definition), like so: +    // void myfunc(void) REAL_FATTR_ALWAYS_INLINE; +    #define REAL_FATTR_MALLOC __attribute__((malloc)) +    #define REAL_FATTR_ALLOC_ALIGN(x) __attribute__((alloc_align(x))) +    #define REAL_FATTR_PURE __attribute__ ((pure)) +    #define REAL_FATTR_CONST __attribute__((const)) +    #define REAL_FATTR_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +    #define REAL_FATTR_ALWAYS_INLINE __attribute__((always_inline)) +    #define REAL_FATTR_UNUSED __attribute__((unused)) + +    #ifdef __clang__ +      // clang only +    #elif defined(__INTEL_COMPILER) +      // intel only +    #else +      #define GCC_VERSION \ +            (__GNUC__ * 10000 + \ +              __GNUC_MINOR__ * 100 + \ +              __GNUC_PATCHLEVEL__) +      // gcc only +      #define REAL_FATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) +      #define REAL_FATTR_ALLOC_SIZE_PROD(x,y) __attribute__((alloc_size(x,y))) +      #define REAL_FATTR_NONNULL_ALL __attribute__((nonnull)) +      #define REAL_FATTR_NONNULL_ARG(...) __attribute__((nonnull(__VA_ARGS__))) +      #if GCC_VERSION >= 40900 +        #define REAL_FATTR_NONNULL_RET __attribute__((returns_nonnull)) +      #endif +    #endif +  #endif + +  // define function attributes that haven't been defined for this specific +  // compiler. + +  #ifndef REAL_FATTR_MALLOC +    #define REAL_FATTR_MALLOC +  #endif + +  #ifndef REAL_FATTR_ALLOC_SIZE +    #define REAL_FATTR_ALLOC_SIZE(x) +  #endif + +  #ifndef REAL_FATTR_ALLOC_SIZE_PROD +    #define REAL_FATTR_ALLOC_SIZE_PROD(x,y) +  #endif + +  #ifndef REAL_FATTR_ALLOC_ALIGN +    #define REAL_FATTR_ALLOC_ALIGN(x) +  #endif + +  #ifndef REAL_FATTR_PURE +    #define REAL_FATTR_PURE +  #endif + +  #ifndef REAL_FATTR_CONST +    #define REAL_FATTR_CONST +  #endif + +  #ifndef REAL_FATTR_WARN_UNUSED_RESULT +    #define REAL_FATTR_WARN_UNUSED_RESULT +  #endif + +  #ifndef REAL_FATTR_ALWAYS_INLINE +    #define REAL_FATTR_ALWAYS_INLINE +  #endif + +  #ifndef REAL_FATTR_UNUSED +    #define REAL_FATTR_UNUSED +  #endif + +  #ifndef REAL_FATTR_NONNULL_ALL +    #define REAL_FATTR_NONNULL_ALL +  #endif + +  #ifndef REAL_FATTR_NONNULL_ARG +    #define REAL_FATTR_NONNULL_ARG(...) +  #endif + +  #ifndef REAL_FATTR_NONNULL_RET +    #define REAL_FATTR_NONNULL_RET +  #endif  #endif -#ifndef FUNC_ATTR_NONNULL_RET +#ifdef DEFINE_FUNC_ATTRIBUTES +  #define FUNC_ATTR_MALLOC REAL_FATTR_MALLOC +  #define FUNC_ATTR_ALLOC_SIZE(x) REAL_FATTR_ALLOC_SIZE(x) +  #define FUNC_ATTR_ALLOC_SIZE_PROD(x,y) REAL_FATTR_ALLOC_SIZE_PROD(x,y) +  #define FUNC_ATTR_ALLOC_ALIGN(x) REAL_FATTR_ALLOC_ALIGN(x) +  #define FUNC_ATTR_PURE REAL_FATTR_PURE +  #define FUNC_ATTR_CONST REAL_FATTR_CONST +  #define FUNC_ATTR_WARN_UNUSED_RESULT REAL_FATTR_WARN_UNUSED_RESULT +  #define FUNC_ATTR_ALWAYS_INLINE REAL_FATTR_ALWAYS_INLINE +  #define FUNC_ATTR_UNUSED REAL_FATTR_UNUSED +  #define FUNC_ATTR_NONNULL_ALL REAL_FATTR_NONNULL_ALL +  #define FUNC_ATTR_NONNULL_ARG(...) REAL_FATTR_NONNULL_ARG(__VA_ARGS__) +  #define FUNC_ATTR_NONNULL_RET REAL_FATTR_NONNULL_RET +#elif !defined(DO_NOT_DEFINE_EMPTY_ATTRIBUTES) +  #define FUNC_ATTR_MALLOC +  #define FUNC_ATTR_ALLOC_SIZE(x) +  #define FUNC_ATTR_ALLOC_SIZE_PROD(x,y) +  #define FUNC_ATTR_ALLOC_ALIGN(x) +  #define FUNC_ATTR_PURE +  #define FUNC_ATTR_CONST +  #define FUNC_ATTR_WARN_UNUSED_RESULT +  #define FUNC_ATTR_ALWAYS_INLINE +  #define FUNC_ATTR_UNUSED +  #define FUNC_ATTR_NONNULL_ALL +  #define FUNC_ATTR_NONNULL_ARG(...)    #define FUNC_ATTR_NONNULL_RET  #endif - -#endif // NVIM_FUNC_ATTR_H | 
