From a2e713754151b737c42ef23afb3909e5c5e4f2d3 Mon Sep 17 00:00:00 2001 From: Pavel Afremov Date: Tue, 20 Mar 2007 15:42:04 +0300 Subject: [PATCH] Makes changes in VM part more compiler independent. --- vm/thread/src/thread_native_tls.c | 38 ++++++++++++++++++++++++++++++++----- 1 files changed, 33 insertions(+), 5 deletions(-) diff --git a/vm/thread/src/thread_native_tls.c b/vm/thread/src/thread_native_tls.c old mode 100644 new mode 100755 index 49ba075..254a744 --- a/vm/thread/src/thread_native_tls.c +++ b/vm/thread/src/thread_native_tls.c @@ -55,17 +55,40 @@ #endif } #if !defined(_WIN32) && defined(HYTHREAD_FAST_TLS) - //TODO: GCC-specific, need to add ICL #if defined(_EM64T_) #define HYTHREAD_TLS_GET_VAR_OFFSET(var,offset) \ - { void* tmp; __asm ("movq " #var "@GOTTPOFF(%%rip), %0" : "=r" (tmp)); offset = tmp; } + { \ + void* tmp1 = &var; \ + void* tmp2; \ + asm(" movq %%fs:0x00, %0": "=r" (tmp2)); \ + offset = tmp1 - tmp2; \ + } + //TODO: GCC-specific, need to add ICL + //#define HYTHREAD_TLS_GET_VAR_OFFSET(var,offset) \ + // { void* tmp; __asm ("movq " #var "@GOTTPOFF(%%rip), %0" : "=r" (tmp)); offset = tmp; } #elif defined(_IA32_) #define HYTHREAD_TLS_GET_VAR_OFFSET(var,offset) \ - { __asm ("movl $" #var "@ntpoff, %0" : "=r" (offset)); } + { \ + void* tmp1 = &var; \ + void* tmp2; \ + asm(" movl %%gs:0x00, %0": "=r" (tmp2)); \ + offset = tmp1 - tmp2; \ + } + //TODO: GCC-specific, need to add ICL + //#define HYTHREAD_TLS_GET_VAR_OFFSET(var,offset) \ + // { __asm ("movl $" #var "@ntpoff, %0" : "=r" (offset)); } #elif defined(_IPF_) - //TODO: NOTE: not even tested, may require fix. #define HYTHREAD_TLS_GET_VAR_OFFSET(var,offset) \ - { __asm ("addl %0 = @tprel(" #var "#), r0 ;;\n" : "=r" (offset)) } + { \ + void* tmp1 = &var; \ + void* tmp2; \ + asm("mov %0 = r13;;": "=r" (tmp2)); \ + offset = tmp1 - tmp2; \ + } + //TODO: GCC-specific, need to add ICL + //TODO: NOTE: not even tested, may require fix. + //#define HYTHREAD_TLS_GET_VAR_OFFSET(var,offset) \ + // { __asm ("addl %0 = @tprel(" #var "#), r0 ;;\n" : "=r" (offset)) } #else #error "Don't know how to get the variable offset in TLS on this platfrom. Try to undef HYTHREAD_FAST_TLS or provide the macros here." #endif @@ -81,6 +104,11 @@ #endif IDATA VMCALL hythread_get_hythread_offset_in_tls(void) { int threadOffset; HYTHREAD_TLS_GET_VAR_OFFSET(tm_self_tls, threadOffset); + //void* tmp1 = &tm_self_tls; + //void* tmp2; + //asm(" movq %%fs:0x00, %0": "=r" (tmp2)); + //threadOffset = tmp1 - tmp2; + return threadOffset; } -- 1.4.2