summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-26 21:16:49 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-26 21:16:49 +0000
commitd9ca835b3b4ef766be2771d39b804e7e617ca9f2 (patch)
tree02ea37e2e5f9a575226f09236d4eb72a053aeb89
parentacc48fa68c0ec925302564118d343d6cafa8fccb (diff)
downloadgcc-d9ca835b3b4ef766be2771d39b804e7e617ca9f2.tar.gz
crtstuff: adjust tm clones for no attribute hidden
* crtstuff.c (__TMC_LIST__): Mark used not unused. (__TMC_END__): Only declare if hidden is available; in the definition, if hidden is unavailable add a null record. (deregister_tm_clones, register_tm_clones): New. (__do_global_dtors_aux, frame_dummy): Use them. (__do_global_dtors, __do_global_ctors_1): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181744 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libgcc/ChangeLog9
-rw-r--r--libgcc/crtstuff.c94
2 files changed, 65 insertions, 38 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 305e8ad3c3c..93c58707ce4 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,12 @@
+2011-11-26 Richard Henderson <rth@redhat.com>
+
+ * crtstuff.c (__TMC_LIST__): Mark used not unused.
+ (__TMC_END__): Only declare if hidden is available; in the definition,
+ if hidden is unavailable add a null record.
+ (deregister_tm_clones, register_tm_clones): New.
+ (__do_global_dtors_aux, frame_dummy): Use them.
+ (__do_global_dtors, __do_global_ctors_1): Likewise.
+
2011-11-22 Iain Sandoe <iains@gcc.gnu.org>
* config/darwin-crt-tm.c: New file.
diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c
index 6f06b629602..77b8d4201cd 100644
--- a/libgcc/crtstuff.c
+++ b/libgcc/crtstuff.c
@@ -252,9 +252,51 @@ STATIC void *__JCR_LIST__[]
#if USE_TM_CLONE_REGISTRY
STATIC func_ptr __TMC_LIST__[]
- __attribute__((unused, section(".tm_clone_table"), aligned(sizeof(void*))))
+ __attribute__((used, section(".tm_clone_table"), aligned(sizeof(void*))))
= { };
+# ifdef HAVE_GAS_HIDDEN
extern func_ptr __TMC_END__[] __attribute__((__visibility__ ("hidden")));
+# endif
+
+static inline void
+deregister_tm_clones (void)
+{
+ void (*fn) (void *);
+
+#ifdef HAVE_GAS_HIDDEN
+ if (__TMC_END__ - __TMC_LIST__ == 0)
+ return;
+#else
+ if (__TMC_LIST__[0] == NULL)
+ return;
+#endif
+
+ fn = _ITM_deregisterTMCloneTable;
+ __asm ("" : "+r" (fn));
+ if (fn)
+ fn (__TMC_LIST__);
+}
+
+static inline void
+register_tm_clones (void)
+{
+ void (*fn) (void *, size_t);
+ size_t size;
+
+#ifdef HAVE_GAS_HIDDEN
+ size = (__TMC_END__ - __TMC_LIST__) / 2;
+#else
+ for (size = 0; __TMC_LIST__[size * 2] != NULL; size++)
+ continue;
+#endif
+ if (size == 0)
+ return;
+
+ fn = _ITM_registerTMCloneTable;
+ __asm ("" : "+r" (fn));
+ if (fn)
+ fn (__TMC_LIST__, size);
+}
#endif /* USE_TM_CLONE_REGISTRY */
#if defined(INIT_SECTION_ASM_OP) || defined(INIT_ARRAY_SECTION_ASM_OP)
@@ -347,13 +389,7 @@ __do_global_dtors_aux (void)
#endif /* !defined(FINI_ARRAY_SECTION_ASM_OP) */
#if USE_TM_CLONE_REGISTRY
- if (__TMC_END__ - __TMC_LIST__ > 0)
- {
- void (*deregister_clones) (void *) = _ITM_deregisterTMCloneTable;
- __asm ("" : "+r" (deregister_clones));
- if (deregister_clones)
- deregister_clones (__TMC_LIST__);
- }
+ deregister_tm_clones ();
#endif /* USE_TM_CLONE_REGISTRY */
#ifdef USE_EH_FRAME_REGISTRY
@@ -422,16 +458,7 @@ frame_dummy (void)
#endif /* JCR_SECTION_NAME */
#if USE_TM_CLONE_REGISTRY
- if (__TMC_END__ - __TMC_LIST__ > 0)
- {
- void (*register_clones) (void *, size_t) = _ITM_registerTMCloneTable;
- __asm ("" : "+r" (register_clones));
- if (register_clones)
- {
- size_t size = (size_t)(__TMC_END__ - __TMC_LIST__) / 2;
- _ITM_registerTMCloneTable (__TMC_LIST__, size);
- }
- }
+ register_tm_clones ();
#endif /* USE_TM_CLONE_REGISTRY */
}
@@ -500,13 +527,7 @@ __do_global_dtors (void)
f ();
#if USE_TM_CLONE_REGISTRY
- if (__TMC_END__ - __TMC_LIST__ > 0)
- {
- void (*deregister_clones) (void *) = _ITM_deregisterTMCloneTable;
- __asm ("" : "+r" (deregister_clones));
- if (deregister_clones)
- deregister_clones (__TMC_LIST__);
- }
+ deregister_tm_clones ();
#endif /* USE_TM_CLONE_REGISTRY */
#ifdef USE_EH_FRAME_REGISTRY
@@ -542,16 +563,7 @@ __do_global_ctors_1(void)
#endif
#if USE_TM_CLONE_REGISTRY
- if (__TMC_END__ - __TMC_LIST__ > 0)
- {
- void (*register_clones) (void *, size_t) = _ITM_registerTMCloneTable;
- __asm ("" : "+r" (register_clones));
- if (register_clones)
- {
- size_t size = (size_t)(__TMC_END__ - __TMC_LIST__) / 2;
- register_clones (__TMC_LIST__, size);
- }
- }
+ register_tm_clones ();
#endif /* USE_TM_CLONE_REGISTRY */
}
#endif /* USE_EH_FRAME_REGISTRY || JCR_SECTION_NAME || USE_TM_CLONE_REGISTRY */
@@ -639,10 +651,16 @@ STATIC void *__JCR_END__[1]
#endif /* JCR_SECTION_NAME */
#if USE_TM_CLONE_REGISTRY
+# ifndef HAVE_GAS_HIDDEN
+static
+# endif
func_ptr __TMC_END__[]
- __attribute__((unused, section(".tm_clone_table"), aligned(sizeof(void *)),
- __visibility__ ("hidden")))
- = { };
+ __attribute__((used, section(".tm_clone_table"), aligned(sizeof(void *))))
+# ifdef HAVE_GAS_HIDDEN
+ __attribute__((__visibility__ ("hidden"))) = { };
+# else
+ = { 0, 0 };
+# endif
#endif /* USE_TM_CLONE_REGISTRY */
#ifdef INIT_ARRAY_SECTION_ASM_OP