X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fcompiler%2Fcompiler.h;h=bce4f25a122612d7f26f8e846564747a01836b3b;hb=ac29ec5d15e8b108cb75cfb4fe13d79739e9c5cf;hp=d57d814b3711213c978602cd46c7c6e2e67ccf7d;hpb=a40b318e7a07a452ae7456053727bd11b2fa49b4;p=ccan diff --git a/ccan/compiler/compiler.h b/ccan/compiler/compiler.h index d57d814b..bce4f25a 100644 --- a/ccan/compiler/compiler.h +++ b/ccan/compiler/compiler.h @@ -1,7 +1,9 @@ +/* CC0 (Public domain) - see LICENSE file for details */ #ifndef CCAN_COMPILER_H #define CCAN_COMPILER_H #include "config.h" +#ifndef COLD #if HAVE_ATTRIBUTE_COLD /** * COLD - a function is unlikely to be called. @@ -15,11 +17,33 @@ * fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno)); * } */ -#define COLD __attribute__((cold)) +#define COLD __attribute__((__cold__)) #else #define COLD #endif +#endif +#ifndef NORETURN +#if HAVE_ATTRIBUTE_NORETURN +/** + * NORETURN - a function does not return + * + * Used to mark a function which exits; useful for suppressing warnings. + * + * Example: + * static void NORETURN fail(const char *reason) + * { + * fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno)); + * exit(1); + * } + */ +#define NORETURN __attribute__((__noreturn__)) +#else +#define NORETURN +#endif +#endif + +#ifndef PRINTF_FMT #if HAVE_ATTRIBUTE_PRINTF /** * PRINTF_FMT - a function takes printf-style arguments @@ -36,21 +60,39 @@ #else #define PRINTF_FMT(nfmt, narg) #endif +#endif +#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 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 IDEMPOTENT +#define PURE_FUNCTION +#endif +#endif #endif #if HAVE_ATTRIBUTE_UNUSED +#ifndef UNNEEDED /** * UNNEEDED - a variable/function may not be needed * @@ -67,8 +109,10 @@ * counter += add; * } */ -#define UNNEEDED __attribute__((unused)) +#define UNNEEDED __attribute__((__unused__)) +#endif +#ifndef NEEDED #if HAVE_ATTRIBUTE_USED /** * NEEDED - a variable/function is needed @@ -84,12 +128,14 @@ * 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 +#ifndef UNUSED /** * UNUSED - a parameter is unused * @@ -104,13 +150,21 @@ * return 0; * } */ -#define UNUSED __attribute__((unused)) +#define UNUSED __attribute__((__unused__)) +#endif #else +#ifndef UNNEEDED #define UNNEEDED +#endif +#ifndef NEEDED #define NEEDED +#endif +#ifndef UNUSED #define UNUSED #endif +#endif +#ifndef IS_COMPILE_CONSTANT #if HAVE_BUILTIN_CONSTANT_P /** * IS_COMPILE_CONSTANT - does the compiler know the value of this expression? @@ -130,7 +184,7 @@ * const char *greek_name(enum greek greek); * * // Inline version. - * static inline char *_greek_name(enum greek greek) + * static inline const char *_greek_name(enum greek greek) * { * switch (greek) { * case ALPHA: return "alpha"; @@ -152,7 +206,9 @@ /* If we don't know, assume it's not. */ #define IS_COMPILE_CONSTANT(expr) 0 #endif +#endif +#ifndef WARN_UNUSED_RESULT #if HAVE_WARN_UNUSED_RESULT /** * WARN_UNUSED_RESULT - warn if a function return value is unused. @@ -167,8 +223,9 @@ * 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 #endif /* CCAN_COMPILER_H */