From 7546aa9db2c3002376076fc37b02678f42cdfbc7 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 26 Nov 2011 13:16:49 -0800 Subject: [PATCH] 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. From-SVN: r181744 --- libgcc/ChangeLog | 9 +++++ libgcc/crtstuff.c | 94 ++++++++++++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 38 deletions(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 305e8ad3c3c3..93c58707ce40 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,12 @@ +2011-11-26 Richard Henderson + + * 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 * config/darwin-crt-tm.c: New file. diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c index 6f06b6296020..77b8d4201cdd 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 -- 2.39.5