cleanup and work around visibility bug in gcc 3 that affects x86_64
authorRich Felker <dalias@aerifal.cx>
Fri, 24 Feb 2012 02:24:56 +0000 (21:24 -0500)
committerRich Felker <dalias@aerifal.cx>
Fri, 24 Feb 2012 02:24:56 +0000 (21:24 -0500)
in gcc 3, the visibility attribute must be placed on both the
declaration and on the definition. if it's omitted from the
definition, the compiler fails to emit the ".hidden" directive in the
assembly, and the linker will either generate textrels (if supported,
such as on i386) or refuse to link (on targets where certain types of
textrels are forbidden or impossible without further assumptions about
memory layout, such as on x86_64).

this patch also unifies the decision about when to use visibility into
libc.h and makes the visibility in the utf-8 state machine tables
based on libc.h rather than a duplicate test.

src/internal/libc.c
src/internal/libc.h
src/multibyte/internal.c
src/multibyte/internal.h

index 5f12e29..59d302d 100644 (file)
@@ -7,5 +7,5 @@ struct __libc *__libc_loc()
        return &__libc;
 }
 #else
        return &__libc;
 }
 #else
-struct __libc __libc;
+struct __libc __libc ATTR_LIBC_VISIBILITY;
 #endif
 #endif
index d985902..45d5c9e 100644 (file)
@@ -19,16 +19,21 @@ struct __libc {
 };
 
 
 };
 
 
-#if 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
-extern struct __libc __libc __attribute__((visibility("hidden")));
-#define libc __libc
+#if !defined(__PIC__) || 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
 
 
-#elif !defined(__PIC__)
-extern struct __libc __libc;
+#ifdef __PIC__
+#define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden"))) 
+#else
+#define ATTR_LIBC_VISIBILITY
+#endif
+
+extern struct __libc __libc ATTR_LIBC_VISIBILITY;
 #define libc __libc
 
 #else
 #define libc __libc
 
 #else
+
 #define USE_LIBC_ACCESSOR
 #define USE_LIBC_ACCESSOR
+#define ATTR_LIBC_VISIBILITY
 extern struct __libc *__libc_loc(void) __attribute__((const));
 #define libc (*__libc_loc())
 
 extern struct __libc *__libc_loc(void) __attribute__((const));
 #define libc (*__libc_loc())
 
index 11b9818..1a4ddc3 100644 (file)
@@ -23,7 +23,7 @@
              | ( R(0x80,0xc0) >> 12 ) \
              | x )
 
              | ( R(0x80,0xc0) >> 12 ) \
              | x )
 
-const uint32_t bittab[] = {
+const uint32_t bittab[] ATTR_LIBC_VISIBILITY = {
                      C(0x2),C(0x3),C(0x4),C(0x5),C(0x6),C(0x7),
        C(0x8),C(0x9),C(0xa),C(0xb),C(0xc),C(0xd),C(0xe),C(0xf),
        D(0x0),D(0x1),D(0x2),D(0x3),D(0x4),D(0x5),D(0x6),D(0x7),
                      C(0x2),C(0x3),C(0x4),C(0x5),C(0x6),C(0x7),
        C(0x8),C(0x9),C(0xa),C(0xb),C(0xc),C(0xd),C(0xe),C(0xf),
        D(0x0),D(0x1),D(0x2),D(0x3),D(0x4),D(0x5),D(0x6),D(0x7),
index df47331..cd1196b 100644 (file)
@@ -6,11 +6,9 @@
 
 #define bittab __fsmu8
 
 
 #define bittab __fsmu8
 
-#if 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
-extern const uint32_t bittab[] __attribute__((visibility("hidden")));
-#else
-extern const uint32_t bittab[];
-#endif
+#include "libc.h"
+
+extern const uint32_t bittab[] ATTR_LIBC_VISIBILITY;
 
 /* Upper 6 state bits are a negative integer offset to bound-check next byte */
 /*    equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f      */
 
 /* Upper 6 state bits are a negative integer offset to bound-check next byte */
 /*    equivalent to: ( (b-0x80) | (b+offset) ) & ~0x3f      */