|
@@ -210,6 +210,23 @@
|
|
|
#define __visible __attribute__((externally_visible))
|
|
|
#endif
|
|
|
|
|
|
+
|
|
|
+#if GCC_VERSION >= 40900
|
|
|
+/*
|
|
|
+ * __assume_aligned(n, k): Tell the optimizer that the returned
|
|
|
+ * pointer can be assumed to be k modulo n. The second argument is
|
|
|
+ * optional (default 0), so we use a variadic macro to make the
|
|
|
+ * shorthand.
|
|
|
+ *
|
|
|
+ * Beware: Do not apply this to functions which may return
|
|
|
+ * ERR_PTRs. Also, it is probably unwise to apply it to functions
|
|
|
+ * returning extra information in the low bits (but in that case the
|
|
|
+ * compiler should see some alignment anyway, when the return value is
|
|
|
+ * massaged by 'flags = ptr & 3; ptr &= ~3;').
|
|
|
+ */
|
|
|
+#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* GCC 'asm goto' miscompiles certain code sequences:
|
|
|
*
|