diff options
Diffstat (limited to 'linuxthreads')
-rw-r--r-- | linuxthreads/ChangeLog | 8 | ||||
-rw-r--r-- | linuxthreads/sysdeps/powerpc/tls.h | 17 |
2 files changed, 19 insertions, 6 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 69c0c63161..c6060a5c51 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,11 @@ +2004-04-09 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/powerpc/tls.h (TLS_INIT_TP): Eliminate lvalue cast from + __thread_self assignment. + (THREAD_DTV): Replace __thread_register with __thread_self. + (INIT_THREAD_SELF): Eliminate lvalue cast from __thread_self + assignment. + 2004-04-08 Alexandre Oliva <aoliva@redhat.com> * signals.c (pthread_sigmask): Don't ever block or mask diff --git a/linuxthreads/sysdeps/powerpc/tls.h b/linuxthreads/sysdeps/powerpc/tls.h index 76104cd14c..f6eb48b434 100644 --- a/linuxthreads/sysdeps/powerpc/tls.h +++ b/linuxthreads/sysdeps/powerpc/tls.h @@ -92,19 +92,24 @@ typedef struct /* Return dtv of given thread descriptor. */ # define GET_DTV(TCBP) (((tcbhead_t *) (TCBP))[-1].dtv) -/* The global register variable is declared in pt-machine.h with - the wrong type, but the compiler doesn't like us declaring another. */ +/* We still need this define so that tcb-offsets.sym can override it and + use THREAD_SELF to generate MULTIPLE_THREADS_OFFSET. */ # define __thread_register ((void *) __thread_self) /* Code to initially initialize the thread pointer. This might need special attention since 'errno' is not yet available and if the - operation can cause a failure 'errno' must not be touched. */ + operation can cause a failure 'errno' must not be touched. + + The global register variable is declared in pt-machine.h with the + wrong type, so we need some extra casts to get the desired result. + This avoids a lvalue cast that gcc-3.4 does not like. */ # define TLS_INIT_TP(TCBP, SECONDCALL) \ - (__thread_register = (void *) (TCBP) + TLS_TCB_OFFSET, NULL) + (__thread_self = (struct _pthread_descr_struct *) \ + ((void *) (TCBP) + TLS_TCB_OFFSET), NULL) /* Return the address of the dtv for the current thread. */ # define THREAD_DTV() \ - (((tcbhead_t *) (__thread_register - TLS_TCB_OFFSET))[-1].dtv) + (((tcbhead_t *) ((void *) __thread_self - TLS_TCB_OFFSET))[-1].dtv) /* Return the thread descriptor for the current thread. */ # undef THREAD_SELF @@ -114,7 +119,7 @@ typedef struct # undef INIT_THREAD_SELF # define INIT_THREAD_SELF(DESCR, NR) \ - (__thread_register = ((void *) (DESCR) \ + (__thread_self = (struct _pthread_descr_struct *)((void *) (DESCR) \ + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE)) /* Make sure we have the p_multiple_threads member in the thread structure. |