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 <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
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;
}