X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fcompiler%2Fcompiler.h;h=1bbb3b8b61c6cb4a0fd44ab39e5bf7505eaa91bd;hb=42d7b648bd295e2204c5d064256fb1ad382b41c9;hp=74e0f1835c1207454aa1fdb364d3573df31387d1;hpb=e37b906781eeddb89d2ba6c5c39e9d20e4111c18;p=ccan diff --git a/ccan/compiler/compiler.h b/ccan/compiler/compiler.h index 74e0f183..1bbb3b8b 100644 --- a/ccan/compiler/compiler.h +++ b/ccan/compiler/compiler.h @@ -1,3 +1,4 @@ +/* CC0 (Public domain) - see LICENSE file for details */ #ifndef CCAN_COMPILER_H #define CCAN_COMPILER_H #include "config.h" @@ -16,7 +17,7 @@ * fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno)); * } */ -#define COLD __attribute__((cold)) +#define COLD __attribute__((__cold__)) #else #define COLD #endif @@ -36,7 +37,7 @@ * exit(1); * } */ -#define NORETURN __attribute__((noreturn)) +#define NORETURN __attribute__((__noreturn__)) #else #define NORETURN #endif @@ -61,18 +62,32 @@ #endif #endif -#ifndef IDEMPOTENT +#ifndef CONST_FUNCTION #if HAVE_ATTRIBUTE_CONST /** - * IDEMPOTENT - a function's return depends only on its argument + * CONST_FUNCTION - a function's return depends only on its argument * * This allows the compiler to assume that the function will return the exact * same value for the exact same arguments. This implies that the function * must not use global variables, or dereference pointer arguments. */ -#define IDEMPOTENT __attribute__((const)) +#define CONST_FUNCTION __attribute__((__const__)) #else -#define IDEMPOTENT +#define CONST_FUNCTION +#endif + +#ifndef PURE_FUNCTION +#if HAVE_ATTRIBUTE_PURE +/** + * PURE_FUNCTION - a function is pure + * + * A pure function is one that has no side effects other than it's return value + * and uses no inputs other than it's arguments and global variables. + */ +#define PURE_FUNCTION __attribute__((__pure__)) +#else +#define PURE_FUNCTION +#endif #endif #endif @@ -94,7 +109,7 @@ * counter += add; * } */ -#define UNNEEDED __attribute__((unused)) +#define UNNEEDED __attribute__((__unused__)) #endif #ifndef NEEDED @@ -113,10 +128,10 @@ * printf("Counter is %i\n", counter); * } */ -#define NEEDED __attribute__((used)) +#define NEEDED __attribute__((__used__)) #else /* Before used, unused functions and vars were always emitted. */ -#define NEEDED __attribute__((unused)) +#define NEEDED __attribute__((__unused__)) #endif #endif @@ -135,7 +150,7 @@ * return 0; * } */ -#define UNUSED __attribute__((unused)) +#define UNUSED __attribute__((__unused__)) #endif #else #ifndef UNNEEDED @@ -208,9 +223,82 @@ * return realloc(buf, (*size) *= 2); * } */ -#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#define WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) #else #define WARN_UNUSED_RESULT #endif #endif + + +#if HAVE_ATTRIBUTE_DEPRECATED +/** + * WARN_DEPRECATED - warn that a function/type/variable is deprecated when used. + * + * Used to mark a function, type or variable should not be used. + * + * Example: + * WARN_DEPRECATED char *oldfunc(char *buf); + */ +#define WARN_DEPRECATED __attribute__((__deprecated__)) +#else +#define WARN_DEPRECATED +#endif + + +#if HAVE_ATTRIBUTE_NONNULL +/** + * NO_NULL_ARGS - specify that no arguments to this function can be NULL. + * + * The compiler will warn if any pointer args are NULL. + * + * Example: + * NO_NULL_ARGS char *my_copy(char *buf); + */ +#define NO_NULL_ARGS __attribute__((__nonnull__)) + +/** + * NON_NULL_ARGS - specify that some arguments to this function can't be NULL. + * @...: 1-based argument numbers for which args can't be NULL. + * + * The compiler will warn if any of the specified pointer args are NULL. + * + * Example: + * char *my_copy2(char *buf, char *maybenull) NON_NULL_ARGS(1); + */ +#define NON_NULL_ARGS(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else +#define NO_NULL_ARGS +#define NON_NULL_ARGS(...) +#endif + + +#if HAVE_ATTRIBUTE_SENTINEL +/** + * LAST_ARG_NULL - specify the last argument of a variadic function must be NULL. + * + * The compiler will warn if the last argument isn't NULL. + * + * Example: + * char *join_string(char *buf, ...) LAST_ARG_NULL; + */ +#define LAST_ARG_NULL __attribute__((__sentinel__)) +#else +#define LAST_ARG_NULL +#endif + +#if HAVE_BUILTIN_CPU_SUPPORTS +/** + * cpu_supports - test if current CPU supports the named feature. + * + * This takes a literal string, and currently only works on glibc platforms. + * + * Example: + * if (cpu_supports("mmx")) + * printf("MMX support engaged!\n"); + */ +#define cpu_supports(x) __builtin_cpu_supports(x) +#else +#define cpu_supports(x) 0 +#endif /* HAVE_BUILTIN_CPU_SUPPORTS */ + #endif /* CCAN_COMPILER_H */