diff options
Diffstat (limited to 'ccan/compiler')
| l--------- | ccan/compiler/LICENSE | 1 | ||||
| -rw-r--r-- | ccan/compiler/_info | 64 | ||||
| -rw-r--r-- | ccan/compiler/compiler.h | 231 | ||||
| -rw-r--r-- | ccan/compiler/test/compile_fail-printf.c | 24 | ||||
| -rw-r--r-- | ccan/compiler/test/run-is_compile_constant.c | 17 |
5 files changed, 0 insertions, 337 deletions
diff --git a/ccan/compiler/LICENSE b/ccan/compiler/LICENSE deleted file mode 120000 index b7951da..0000000 --- a/ccan/compiler/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../licenses/CC0
\ No newline at end of file diff --git a/ccan/compiler/_info b/ccan/compiler/_info deleted file mode 100644 index 12cb247..0000000 --- a/ccan/compiler/_info +++ /dev/null @@ -1,64 +0,0 @@ -#include "config.h" -#include <string.h> -#include <stdio.h> - -/** - * compiler - macros for common compiler extensions - * - * Abstracts away some compiler hints. Currently these include: - * - COLD - * For functions not called in fast paths (aka. cold functions) - * - PRINTF_FMT - * For functions which take printf-style parameters. - * - CONST_FUNCTION - * For functions which return the same value for same parameters. - * - NEEDED - * For functions and variables which must be emitted even if unused. - * - UNNEEDED - * For functions and variables which need not be emitted if unused. - * - UNUSED - * For parameters which are not used. - * - IS_COMPILE_CONSTANT() - * For using different tradeoffs for compiletime vs runtime evaluation. - * - * License: CC0 (Public domain) - * Author: Rusty Russell <rusty@rustcorp.com.au> - * - * Example: - * #include <ccan/compiler/compiler.h> - * #include <stdio.h> - * #include <stdarg.h> - * - * // Example of a (slow-path) logging function. - * static int log_threshold = 2; - * static void COLD PRINTF_FMT(2,3) - * logger(int level, const char *fmt, ...) - * { - * va_list ap; - * va_start(ap, fmt); - * if (level >= log_threshold) - * vfprintf(stderr, fmt, ap); - * va_end(ap); - * } - * - * int main(int argc, char *argv[] UNNEEDED) - * { - * if (argc != 1) { - * logger(3, "Don't want %i arguments!\n", argc-1); - * return 1; - * } - * return 0; - * } - */ -int main(int argc, char *argv[]) -{ - /* Expect exactly one argument */ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - return 0; - } - - return 1; -} diff --git a/ccan/compiler/compiler.h b/ccan/compiler/compiler.h deleted file mode 100644 index bce4f25..0000000 --- a/ccan/compiler/compiler.h +++ /dev/null @@ -1,231 +0,0 @@ -/* 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. - * - * Used to mark an unlikely code path and optimize appropriately. - * It is usually used on logging or error routines. - * - * Example: - * static void COLD moan(const char *reason) - * { - * fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno)); - * } - */ -#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 - * @nfmt: the 1-based number of the function's format argument. - * @narg: the 1-based number of the function's first variable argument. - * - * This allows the compiler to check your parameters as it does for printf(). - * - * Example: - * void PRINTF_FMT(2,3) my_printf(const char *prefix, const char *fmt, ...); - */ -#define PRINTF_FMT(nfmt, narg) \ - __attribute__((format(__printf__, nfmt, narg))) -#else -#define PRINTF_FMT(nfmt, narg) -#endif -#endif - -#ifndef CONST_FUNCTION -#if HAVE_ATTRIBUTE_CONST -/** - * 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 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 PURE_FUNCTION -#endif -#endif -#endif - -#if HAVE_ATTRIBUTE_UNUSED -#ifndef UNNEEDED -/** - * UNNEEDED - a variable/function may not be needed - * - * This suppresses warnings about unused variables or functions, but tells - * the compiler that if it is unused it need not emit it into the source code. - * - * Example: - * // With some preprocessor options, this is unnecessary. - * static UNNEEDED int counter; - * - * // With some preprocessor options, this is unnecessary. - * static UNNEEDED void add_to_counter(int add) - * { - * counter += add; - * } - */ -#define UNNEEDED __attribute__((__unused__)) -#endif - -#ifndef NEEDED -#if HAVE_ATTRIBUTE_USED -/** - * NEEDED - a variable/function is needed - * - * This suppresses warnings about unused variables or functions, but tells - * the compiler that it must exist even if it (seems) unused. - * - * Example: - * // Even if this is unused, these are vital for debugging. - * static NEEDED int counter; - * static NEEDED void dump_counter(void) - * { - * printf("Counter is %i\n", counter); - * } - */ -#define NEEDED __attribute__((__used__)) -#else -/* Before used, unused functions and vars were always emitted. */ -#define NEEDED __attribute__((__unused__)) -#endif -#endif - -#ifndef UNUSED -/** - * UNUSED - a parameter is unused - * - * Some compilers (eg. gcc with -W or -Wunused) warn about unused - * function parameters. This suppresses such warnings and indicates - * to the reader that it's deliberate. - * - * Example: - * // This is used as a callback, so needs to have this prototype. - * static int some_callback(void *unused UNUSED) - * { - * return 0; - * } - */ -#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? - * @expr: the expression to evaluate - * - * When an expression manipulation is complicated, it is usually better to - * implement it in a function. However, if the expression being manipulated is - * known at compile time, it is better to have the compiler see the entire - * expression so it can simply substitute the result. - * - * This can be done using the IS_COMPILE_CONSTANT() macro. - * - * Example: - * enum greek { ALPHA, BETA, GAMMA, DELTA, EPSILON }; - * - * // Out-of-line version. - * const char *greek_name(enum greek greek); - * - * // Inline version. - * static inline const char *_greek_name(enum greek greek) - * { - * switch (greek) { - * case ALPHA: return "alpha"; - * case BETA: return "beta"; - * case GAMMA: return "gamma"; - * case DELTA: return "delta"; - * case EPSILON: return "epsilon"; - * default: return "**INVALID**"; - * } - * } - * - * // Use inline if compiler knows answer. Otherwise call function - * // to avoid copies of the same code everywhere. - * #define greek_name(g) \ - * (IS_COMPILE_CONSTANT(greek) ? _greek_name(g) : greek_name(g)) - */ -#define IS_COMPILE_CONSTANT(expr) __builtin_constant_p(expr) -#else -/* 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. - * - * Used to mark a function where it is extremely unlikely that the caller - * can ignore the result, eg realloc(). - * - * Example: - * // buf param may be freed by this; need return value! - * static char *WARN_UNUSED_RESULT enlarge(char *buf, unsigned *size) - * { - * return realloc(buf, (*size) *= 2); - * } - */ -#define WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) -#else -#define WARN_UNUSED_RESULT -#endif -#endif -#endif /* CCAN_COMPILER_H */ diff --git a/ccan/compiler/test/compile_fail-printf.c b/ccan/compiler/test/compile_fail-printf.c deleted file mode 100644 index 7664f65..0000000 --- a/ccan/compiler/test/compile_fail-printf.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <ccan/compiler/compiler.h> - -static void PRINTF_FMT(2,3) my_printf(int x, const char *fmt, ...) -{ - (void)x; - (void)fmt; -} - -int main(void) -{ - unsigned int i = 0; - - my_printf(1, "Not a pointer " -#ifdef FAIL - "%p", -#if !HAVE_ATTRIBUTE_PRINTF -#error "Unfortunately we don't fail if !HAVE_ATTRIBUTE_PRINTF." -#endif -#else - "%i", -#endif - i); - return 0; -} diff --git a/ccan/compiler/test/run-is_compile_constant.c b/ccan/compiler/test/run-is_compile_constant.c deleted file mode 100644 index c914c68..0000000 --- a/ccan/compiler/test/run-is_compile_constant.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <ccan/compiler/compiler.h> -#include <ccan/tap/tap.h> - -int main(int argc, char *argv[]) -{ - (void)argc; - (void)argv; - plan_tests(2); - - ok1(!IS_COMPILE_CONSTANT(argc)); -#if HAVE_BUILTIN_CONSTANT_P - ok1(IS_COMPILE_CONSTANT(7)); -#else - pass("If !HAVE_BUILTIN_CONSTANT_P, IS_COMPILE_CONSTANT always false"); -#endif - return exit_status(); -} |
