]> git.ozlabs.org Git - ccan/blobdiff - ccan/compiler/_info
compiler: header for compiler-specific wrappers.
[ccan] / ccan / compiler / _info
diff --git a/ccan/compiler/_info b/ccan/compiler/_info
new file mode 100644 (file)
index 0000000..ea4fe70
--- /dev/null
@@ -0,0 +1,62 @@
+#include <string.h>
+#include <stdio.h>
+#include "config.h"
+
+/**
+ * compiler - macros for common compiler extensions
+ *
+ * Abstracts away some compiler hints.  Currently these include:
+ * - UNLIKELY_FUNCTION_ATTRIBUTE
+ *     For functions not called in fast paths (aka. cold functions)
+ * - PRINTF_ATTRIBUTE
+ *     For functions which take printf-style parameters.
+ * - IDEMPOTENT_ATTRIBUTE
+ *     For functions which return the same value for same parameters.
+ * - NEEDED_ATTRIBUTE
+ *     For functions and variables which must be emitted even if unused.
+ * - UNNEEDED_ATTRIBUTE
+ *     For functions and variables which need not be emitted if unused.
+ * - IS_COMPILE_CONSTANT
+ *     For using different tradeoffs for compiletime vs runtime evaluation.
+ *
+ * Licence: LGPL (3 or any later version)
+ * Author: Rusty Russell <rusty@rustcorp.com.au>
+ *
+ * Example:
+ *     #include <ccan/compiler/attributs.h>
+ *     #include <stdio.h>
+ *     #include <stdarg.h>
+ *
+ *     // Example of a (slow-path) logging function.
+ *     static int log_threshold = 2;
+ *     static void UNLIKELY_FUNCTION_ATTRIBUTE PRINTF_ATTRIBUTE(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[])
+ *     {
+ *             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;
+}