about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-12-20 10:55:59 +0000
committerJakub Jelinek <jakub@redhat.com>2005-12-20 10:55:59 +0000
commit24a640bf2a13a96aa3b582c13c767effcd946dbf (patch)
tree427bcf280f6c0454caed84b744cfdfaeec7eafc2
parent7d0bcd10a7e3455697985522580267c8470cfcb9 (diff)
downloadglibc-24a640bf2a13a96aa3b582c13c767effcd946dbf.tar.gz
glibc-24a640bf2a13a96aa3b582c13c767effcd946dbf.tar.xz
glibc-24a640bf2a13a96aa3b582c13c767effcd946dbf.zip
Workaround for http://gcc.gnu.org/PR25240
	* include/libc-symbols.h (weak_extern): Define using weak attribute.
	(_weak_extern): Remove.
	(weak_tls_extern): Define.
	* locale/uselocale.c (DEFINE_CATEGORY): Use weak_tls_extern for
	_nl_current_##category.
	* locale/setlocale.c (DEFINE_CATEGORY): Likewise.
-rw-r--r--ChangeLog10
-rw-r--r--include/libc-symbols.h4
-rw-r--r--locale/setlocale.c2
-rw-r--r--locale/uselocale.c2
4 files changed, 14 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index d409260f9e..490da6a622 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2005-12-20  Jakub Jelinek  <jakub@redhat.com>
+
+	Workaround for http://gcc.gnu.org/PR25240
+	* include/libc-symbols.h (weak_extern): Define using weak attribute.
+	(_weak_extern): Remove.
+	(weak_tls_extern): Define.
+	* locale/uselocale.c (DEFINE_CATEGORY): Use weak_tls_extern for
+	_nl_current_##category.
+	* locale/setlocale.c (DEFINE_CATEGORY): Likewise.
+
 2005-12-19  Ulrich Drepper  <drepper@redhat.com>
 
 	[BZ #1955]
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 8ee940719e..f69bf8350d 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -114,8 +114,8 @@
   extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
 
 /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined).  */
-#  define weak_extern(symbol) _weak_extern (weak symbol)
-#  define _weak_extern(expr) _Pragma (#expr)
+#  define weak_extern(symbol) extern __typeof (symbol) symbol __attribute__ ((weak));
+#  define weak_tls_extern(symbol) extern __thread __typeof (symbol) symbol __attribute__ ((weak));
 
 # else
 
diff --git a/locale/setlocale.c b/locale/setlocale.c
index 50bf8e772f..dc65d93b30 100644
--- a/locale/setlocale.c
+++ b/locale/setlocale.c
@@ -39,7 +39,7 @@
 # define DEFINE_CATEGORY(category, category_name, items, a) \
     extern char _nl_current_##category##_used; \
     weak_extern (_nl_current_##category##_used) \
-    weak_extern (_nl_current_##category)
+    weak_tls_extern (_nl_current_##category)
 # include "categories.def"
 # undef	DEFINE_CATEGORY
 
diff --git a/locale/uselocale.c b/locale/uselocale.c
index 4e63dabd8e..671c519531 100644
--- a/locale/uselocale.c
+++ b/locale/uselocale.c
@@ -54,7 +54,7 @@ __uselocale (locale_t newloc)
       {									      \
 	extern char _nl_current_##category##_used;			      \
 	weak_extern (_nl_current_##category##_used)			      \
-	weak_extern (_nl_current_##category)				      \
+	weak_tls_extern (_nl_current_##category)				      \
 	if (&_nl_current_##category##_used != 0)			      \
 	  _nl_current_##category = &locobj->__locales[category];	      \
       }