Index: gcc/gcc/gthr-vxworks.h |
diff --git a/gcc/gcc/gthr-vxworks.h b/gcc/gcc/gthr-vxworks.h |
index c2fb8e6729f019a4928f4cd4ce7bf7b2890a3db4..d4da14ef49295674f6dfc9fd87436223764f5f49 100644 |
--- a/gcc/gcc/gthr-vxworks.h |
+++ b/gcc/gcc/gthr-vxworks.h |
@@ -115,17 +115,32 @@ __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) |
typedef struct |
{ |
-#ifndef __RTP__ |
+#if !defined(__RTP__) |
+#if defined(__PPC__) |
+ __attribute ((aligned (__alignof (unsigned)))) |
+#endif |
volatile unsigned char busy; |
#endif |
volatile unsigned char done; |
+#if !defined(__RTP__) && defined(__PPC__) |
+ /* PPC's test-and-set implementation requires a 4 byte aligned |
+ object, of which it only sets the first byte. We use padding |
+ here, in order to maintain some amount of backwards |
+ compatibility. Without this padding, gthread_once objects worked |
+ by accident because they happen to be static objects and the ppc |
+ port automatically increased their alignment to 4 bytes. */ |
+ unsigned char pad1; |
+ unsigned char pad2; |
+#endif |
} |
__gthread_once_t; |
-#ifndef __RTP__ |
-# define __GTHREAD_ONCE_INIT { 0, 0 } |
-#else |
+#if defined (__RTP__) |
# define __GTHREAD_ONCE_INIT { 0 } |
+#elif defined (__PPC__) |
+# define __GTHREAD_ONCE_INIT { 0, 0, 0, 0 } |
+#else |
+# define __GTHREAD_ONCE_INIT { 0, 0 } |
#endif |
extern int __gthread_once (__gthread_once_t *__once, void (*__func)(void)); |