From c1123a7dab90a0621db4f7f7e254614a6f3423a9 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 17 Apr 2008 22:01:57 +0000 Subject: [PATCH] declare the GC thread register variable more portably --- rts/sm/GCThread.h | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/rts/sm/GCThread.h b/rts/sm/GCThread.h index 338cca7..42d20bb 100644 --- a/rts/sm/GCThread.h +++ b/rts/sm/GCThread.h @@ -181,8 +181,35 @@ typedef struct gc_thread_ { extern nat n_gc_threads; extern gc_thread **gc_threads; -register gc_thread *gct __asm__("%rbx"); -// extern gc_thread *gct; // this thread's gct TODO: make thread-local + +/* ----------------------------------------------------------------------------- + The gct variable is thread-local and points to the current thread's + gc_thread structure. It is heavily accessed, so we try to put gct + into a global register variable if possible. + -------------------------------------------------------------------------- */ + +#define GLOBAL_REG_DECL(type,name,reg) register type name REG(reg); + +#if defined(REG_Base) + +GLOBAL_REG_DECL(gc_thread*, gct, REG_Base) +#define DECLARE_GCT /* nothing */ + +#elif defined(REG_R1) + +GLOBAL_REG_DECL(gc_thread*, gct, REG_R1) +#define DECLARE_GCT /* nothing */ + +#elif defined(__GNUC__) + +extern __thread gc_thread* gct; +#define DECLARE_GCT __thread gc_thread* gct; + +#else + +#error Cannot find a way to declare the thread-local gct + +#endif #endif // GCTHREAD_H -- 1.7.10.4