summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorJeroen Hofstee <jeroen@myspectrum.nl>2014-07-30 21:54:52 +0200
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>2014-09-09 13:51:08 +0200
commitc65a2abb6c0a9ab1c70f5241716066c9480ce96a (patch)
treec675b1eb38c962cc2007de8c9d7cbfc4cdcbb27a /arch
parent1401d87b444bf114528e997db552d22142918d33 (diff)
ARM: make gd a function for clang
"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>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/include/asm/global_data.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 63e4ad5a67..c69d0646f5 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -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 */