ARM: make gd a function for clang
authorJeroen Hofstee <jeroen@myspectrum.nl>
Wed, 30 Jul 2014 19:54:52 +0000 (21:54 +0200)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Tue, 9 Sep 2014 11:51:08 +0000 (13:51 +0200)
"clang does not support global register variables; this is
unlikely to be implemented soon because it requires additional
LLVM backend support" [1]

Workaround it by obtaining the value of gd/r9 by an inline
asm routine. Note there is no set routine added for ARM at the
moment, since most if not all updates of gd from c are actually
not needed for ARM.

[1] http://clang.llvm.org/docs/UsersManual.html

cc: Albert ARIBAUD <albert.u.boot@aribaud.net>
Signed-off-by: Jeroen Hofstee <jeroen@myspectrum.nl>
arch/arm/include/asm/global_data.h

index 63e4ad5a6744bd777b0d66ec390fca22c97e3fcf..c69d0646f58099caf2e9f664bcaf0ce4cc30fe7e 100644 (file)
@@ -44,10 +44,35 @@ struct arch_global_data {
 
 #include <asm-generic/global_data.h>
 
+#ifdef __clang__
+
+#define DECLARE_GLOBAL_DATA_PTR
+#define gd     get_gd()
+
+static inline gd_t *get_gd(void)
+{
+       gd_t *gd_ptr;
+
+#ifdef CONFIG_ARM64
+       /*
+        * Make will already error that reserving x18 is not supported at the
+        * time of writing, clang: error: unknown argument: '-ffixed-x18'
+        */
+       __asm__ volatile("mov %0, x18\n" : "=r" (gd_ptr));
+#else
+       __asm__ volatile("mov %0, r9\n" : "=r" (gd_ptr));
+#endif
+
+       return gd_ptr;
+}
+
+#else
+
 #ifdef CONFIG_ARM64
 #define DECLARE_GLOBAL_DATA_PTR                register volatile gd_t *gd asm ("x18")
 #else
 #define DECLARE_GLOBAL_DATA_PTR                register volatile gd_t *gd asm ("r9")
 #endif
+#endif
 
 #endif /* __ASM_GBL_DATA_H */