summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-02-23 21:24:56 -0500
committerRich Felker <dalias@aerifal.cx>2012-02-23 21:24:56 -0500
commitbae2e52bfd676c447862b9baec535db401aab075 (patch)
tree2ce86c4968124da4cd7b27b02ea8570e2bc49bdd
parent00b883a95561b7ed31b0907fcd7cb16267de6e4d (diff)
downloadmusl-bae2e52bfd676c447862b9baec535db401aab075.tar.gz
cleanup and work around visibility bug in gcc 3 that affects x86_64
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.
-rw-r--r--src/internal/libc.c2
-rw-r--r--src/internal/libc.h15
-rw-r--r--src/multibyte/internal.c2
-rw-r--r--src/multibyte/internal.h8
4 files changed, 15 insertions, 12 deletions
diff --git a/src/internal/libc.c b/src/internal/libc.c
index 5f12e295..59d302d4 100644
--- a/src/internal/libc.c
+++ b/src/internal/libc.c
@@ -7,5 +7,5 @@ struct __libc *__libc_loc()
return &__libc;
}
#else
-struct __libc __libc;
+struct __libc __libc ATTR_LIBC_VISIBILITY;
#endif
diff --git a/src/internal/libc.h b/src/internal/libc.h
index d985902c..45d5c9e7 100644
--- a/src/internal/libc.h
+++ b/src/internal/libc.h
@@ -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())
diff --git a/src/multibyte/internal.c b/src/multibyte/internal.c
index 11b9818f..1a4ddc3f 100644
--- a/src/multibyte/internal.c
+++ b/src/multibyte/internal.c
@@ -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),
diff --git a/src/multibyte/internal.h b/src/multibyte/internal.h
index df47331e..cd1196ba 100644
--- a/src/multibyte/internal.h
+++ b/src/multibyte/internal.h
@@ -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 */