aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/func_attr.h
diff options
context:
space:
mode:
authorEliseo Martínez <eliseomarmol@gmail.com>2014-05-12 02:25:17 +0200
committerEliseo Martínez <eliseomarmol@gmail.com>2014-05-15 20:46:01 +0200
commitda51dc9cf202772f60bd2da975dbef257bd9237c (patch)
tree5c16b93238a153f55634e9323077f30c8133970c /src/nvim/func_attr.h
parentffe61e5ba1721340ca51d56bae3ddaca415fb5bc (diff)
downloadrneovim-da51dc9cf202772f60bd2da975dbef257bd9237c.tar.gz
rneovim-da51dc9cf202772f60bd2da975dbef257bd9237c.tar.bz2
rneovim-da51dc9cf202772f60bd2da975dbef257bd9237c.zip
Introduce nvim namespace: Move files.
Move files from src/ to src/nvim/. - src/nvim/ becomes the new root dir for nvim executable sources. - src/libnvim/ is planned to become root dir of the neovim library.
Diffstat (limited to 'src/nvim/func_attr.h')
-rw-r--r--src/nvim/func_attr.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/nvim/func_attr.h b/src/nvim/func_attr.h
new file mode 100644
index 0000000000..4275d23ff1
--- /dev/null
+++ b/src/nvim/func_attr.h
@@ -0,0 +1,110 @@
+#ifndef NEOVIM_FUNC_ATTR_H
+#define NEOVIM_FUNC_ATTR_H
+
+// gcc and clang expose their version as follows:
+//
+// gcc 4.7.2:
+// __GNUC__ = 4
+// __GNUC_MINOR__ = 7
+// __GNUC_PATCHLEVEL = 2
+//
+// clang 3.4 (claims compat with gcc 4.2.1):
+// __GNUC__ = 4
+// __GNUC_MINOR__ = 2
+// __GNUC_PATCHLEVEL = 1
+// __clang__ = 1
+// __clang_major__ = 3
+// __clang_minor__ = 4
+//
+// To view the default defines of these compilers, you can perform:
+//
+// $ 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
+#endif
+
+// define function attributes that haven't been defined for this specific
+// compiler.
+
+#ifndef FUNC_ATTR_MALLOC
+ #define FUNC_ATTR_MALLOC
+#endif
+
+#ifndef FUNC_ATTR_ALLOC_SIZE
+ #define FUNC_ATTR_ALLOC_SIZE(x)
+#endif
+
+#ifndef FUNC_ATTR_ALLOC_SIZE_PROD
+ #define FUNC_ATTR_ALLOC_SIZE_PROD(x,y)
+#endif
+
+#ifndef FUNC_ATTR_ALLOC_ALIGN
+ #define FUNC_ATTR_ALLOC_ALIGN(x)
+#endif
+
+#ifndef FUNC_ATTR_PURE
+ #define FUNC_ATTR_PURE
+#endif
+
+#ifndef FUNC_ATTR_CONST
+ #define FUNC_ATTR_CONST
+#endif
+
+#ifndef FUNC_ATTR_WARN_UNUSED_RESULT
+ #define FUNC_ATTR_WARN_UNUSED_RESULT
+#endif
+
+#ifndef FUNC_ATTR_ALWAYS_INLINE
+ #define FUNC_ATTR_ALWAYS_INLINE
+#endif
+
+#ifndef FUNC_ATTR_UNUSED
+ #define FUNC_ATTR_UNUSED
+#endif
+
+#ifndef FUNC_ATTR_NONNULL_ALL
+ #define FUNC_ATTR_NONNULL_ALL
+#endif
+
+#ifndef FUNC_ATTR_NONNULL_ARG
+ #define FUNC_ATTR_NONNULL_ARG(...)
+#endif
+
+#ifndef FUNC_ATTR_NONNULL_RET
+ #define FUNC_ATTR_NONNULL_RET
+#endif
+
+#endif // NEOVIM_FUNC_ATTR_H