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 5f12e29588cf1cccba4f8e967c7fe7927b14e3c3..59d302d47fee716a592b8543ecbf27851aa17395 100644 (file)
@@ -7,5 +7,5 @@ struct __libc *__libc_loc()
        return &__libc;
 }
 #else
-struct __libc __libc;
+struct __libc __libc ATTR_LIBC_VISIBILITY;
 #endif
index d985902c6389a82403e04640341e620426808899..45d5c9e785f9318123559cdf9b309581e176d742 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 USE_LIBC_ACCESSOR
+#define ATTR_LIBC_VISIBILITY
 extern struct __libc *__libc_loc(void) __attribute__((const));
 #define libc (*__libc_loc())
 
index 11b9818fc479e6c7148ab3ced563233352f04ce8..1a4ddc3f366edbbe348676c830fcd94e0429aca1 100644 (file)
@@ -23,7 +23,7 @@
              | ( 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),
index df47331e11b215db6b67cef434a24c3be7702d2d..cd1196baff00df9cacc7911d9c63d13ba978ae4f 100644 (file)
@@ -6,11 +6,9 @@
 
 #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      */