Use two-page stacks
[akaros.git] / kern / include / compiler.h
index d43c1c3..df10b87 100644 (file)
@@ -1,15 +1,28 @@
 #pragma once
 
-#ifdef __GNUC__
+/* Linux calls it __ASSEMBLY__ */
+#ifdef __ASSEMBLER__
+#define __ASSEMBLY__ 1
+#endif
 
-#define likely(x) __builtin_expect(!!(x), 1)
-#define unlikely(x) __builtin_expect(!!(x), 0)
-#define __weak __attribute__((weak))
+/* This is a bit hokey.  It turns off the #define inline to include
+ * always_inline, which breaks our uses of "extern inline". */
+#define CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING 1
+#define CONFIG_OPTIMIZE_INLINING 1
 
-#else /* #ifdef __GNUC__ */
+/* Make sure Linux's compiler.h is only included here. */
+#define __AKAROS_COMPILER_H 1
+#include <linux/compiler.h>
+#undef __AKAROS_COMPILER_H
 
-#define likely(x) (x)
-#define unlikely(x) (x)
-#define __weak
+/* Linux uses this as a tag for the __CHECKER__ and either defined it to
+ * nothing or to some attribute.  We use it for the name of the pcpu variables
+ * .section, so need it to not be #defined yet. */
+#undef __percpu
 
-#endif /* #ifdef __GNUC__ */
+/* If __VA_ARGS__ is empty, the ## will eat the comma to the left, so we call
+ * __MACRO_NARG with 1 + NR_ARGS arguments, then the 6, 5, 4, etc.  __MACRO_NARG
+ * will strip the 0 (the _0), then the args (if any), and then return the Nth
+ * integer passed in, which will be the number of original args. */
+#define __MACRO_NARG(_0, _1, _2, _3, _4, _5, _6, x, ...) x
+#define MACRO_NR_ARGS(...) __MACRO_NARG(0, ##__VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)