From c26b88bf644011396b4e4f6f15901a66b87d8c19 Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Wed, 10 Feb 2016 14:51:25 +0100 Subject: [PATCH] x86: fix get_cpu_info() when built with clang Clang understands the GCCism in use here, but still complains that sp is unintialised. In such cases, resort to the older version of this code, which directly reads %rsp into the temporary variable. Note that we still keep the GCCism in the default case, as it causes GCC to create rather better assembly. Signed-off-by: Andrew Cooper Acked-by: Jan Beulich --- xen/include/asm-x86/current.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xen/include/asm-x86/current.h b/xen/include/asm-x86/current.h index f011d2d2a0..15b99ff8c0 100644 --- a/xen/include/asm-x86/current.h +++ b/xen/include/asm-x86/current.h @@ -47,7 +47,13 @@ struct cpu_info { static inline struct cpu_info *get_cpu_info(void) { +#ifdef __clang__ + /* Clang complains that sp in the else case is not initialised. */ + unsigned long sp; + asm ( "mov %%rsp, %0" : "=r" (sp) ); +#else register unsigned long sp asm("rsp"); +#endif return (struct cpu_info *)((sp & ~(STACK_SIZE-1)) + STACK_SIZE) - 1; } -- 2.39.5