diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/compiler-gcc.h | 10 | ||||
| -rw-r--r-- | include/linux/compiler-gcc4.h | 4 | 
2 files changed, 13 insertions, 1 deletions
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 73dcf804bc9..0da5b187f12 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -58,8 +58,12 @@   * naked functions because then mcount is called without stack and frame pointer   * being set up and there is no chance to restore the lr register to the value   * before mcount was called. + * + * The asm() bodies of naked functions often depend on standard calling conventions, + * therefore they must be noinline and noclone.  GCC 4.[56] currently fail to enforce + * this, so we must do so ourselves.  See GCC PR44290.   */ -#define __naked				__attribute__((naked)) notrace +#define __naked				__attribute__((naked)) noinline __noclone notrace  #define __noreturn			__attribute__((noreturn)) @@ -85,3 +89,7 @@  #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)  #define gcc_header(x) _gcc_header(x)  #include gcc_header(__GNUC__) + +#if !defined(__noclone) +#define __noclone	/* not needed */ +#endif diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 94dea3ffbfa..fcfa5b9a431 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h @@ -48,6 +48,10 @@   * unreleased.  Really, we need to have autoconf for the kernel.   */  #define unreachable() __builtin_unreachable() + +/* Mark a function definition as prohibited from being cloned. */ +#define __noclone	__attribute__((__noclone__)) +  #endif  #endif  |