This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Introduce TRY_STATIC_TLS macro, used in FR-V


This patch introduces TRY_STATIC_TLS, a macro that can be used to test
whether a module's TLS block is in the static TLS block, or can be
assigned there.

If you use a sufficiently-recent version of GCC and never call
TRY_STATIC_TLS, the new static intermediate function will be fully
inlined into the single caller, without any performance hit
whatsoever.

Index: ChangeLog
2004-11-10  Alexandre Oliva  <aoliva@redhat.com>

	* elf/dl-reloc.c (_dl_try_allocate_static_tls): Move out of...
	(_dl_allocate_static_tls): ... this.
	(TRY_STATIC_TLS): New.

Index: elf/dl-reloc.c
--- elf/dl-reloc.c	2005-01-22 16:18:28.000000000 -0200
+++ elf/dl-reloc.c	2005-01-31 04:37:42.000000000 -0200
@@ -44,16 +44,14 @@
    This function intentionally does not return any value but signals error
    directly, as static TLS should be rare and code handling it should
    not be inlined as much as possible.  */
-void
-internal_function __attribute_noinline__
-_dl_allocate_static_tls (struct link_map *map)
+static int
+_dl_try_allocate_static_tls (struct link_map *map)
 {
   /* If the alignment requirements are too high fail.  */
   if (map->l_tls_align > GL(dl_tls_static_align))
     {
     fail:
-      _dl_signal_error (0, map->l_name, NULL, N_("\
-cannot allocate memory in static TLS block"));
+      return -1;
     }
 
 # if TLS_TCB_AT_TP
@@ -107,6 +105,19 @@
     }
   else
     map->l_need_tls_init = 1;
+
+  return 0;
+}
+
+void
+internal_function __attribute_noinline__
+_dl_allocate_static_tls (struct link_map *map)
+{
+  if (_dl_try_allocate_static_tls (map))
+    {
+      _dl_signal_error (0, map->l_name, NULL, N_("\
+cannot allocate memory in static TLS block"));
+    }
 }
 
 /* Initialize static TLS area and DTV for current (only) thread.
@@ -258,6 +269,10 @@
 	_dl_allocate_static_tls (sym_map);				      \
     } while (0)
 
+#define TRY_STATIC_TLS(map, sym_map)					      \
+    (__builtin_expect ((sym_map)->l_tls_offset != NO_TLS_OFFSET, 1)	      \
+     || _dl_try_allocate_static_tls (sym_map) == 0)
+
 #include "dynamic-link.h"
 
     ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
-- 
Alexandre Oliva             http://www.ic.unicamp.br/~oliva/
Red Hat Compiler Engineer   aoliva@{redhat.com, gcc.gnu.org}
Free Software Evangelist  oliva@{lsd.ic.unicamp.br, gnu.org}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]