From: Michael Meissner Date: Thu, 11 Jan 1996 16:36:41 +0000 (+0000) Subject: insure eabi destructors get called X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0780f386d71137d9d3f836a9e296b25c34446cb0;p=gcc.git insure eabi destructors get called From-SVN: r10962 --- diff --git a/gcc/config/rs6000/eabi-ctors.c b/gcc/config/rs6000/eabi-ctors.c index 6f6a891eca0..69a78af7cc4 100644 --- a/gcc/config/rs6000/eabi-ctors.c +++ b/gcc/config/rs6000/eabi-ctors.c @@ -34,6 +34,11 @@ extern func_ptr __CTOR_END__ []; extern func_ptr __DTOR_LIST__[]; extern func_ptr __DTOR_END__ []; +extern void __do_global_ctors (void); +extern void __do_global_dtors (void); + +void (*__atexit)(func_ptr); + /* Call all global constructors */ void __do_global_ctors (void) @@ -41,8 +46,12 @@ __do_global_ctors (void) func_ptr *ptr = &__CTOR_LIST__[0]; func_ptr *end = &__CTOR_END__[0]; + if (__atexit) + __atexit (__do_global_dtors); + for ( ; ptr != end; ptr++) - (*ptr)(); + if (*ptr) + (*ptr)(); } /* Call all global destructors */ @@ -53,6 +62,7 @@ __do_global_dtors (void) func_ptr *end = &__DTOR_END__[0]; for ( ; ptr != end; ptr++) - (*ptr)(); + if (*ptr) + (*ptr)(); } diff --git a/gcc/config/rs6000/eabi.asm b/gcc/config/rs6000/eabi.asm index 23199980ec6..af5b7de8bf6 100644 --- a/gcc/config/rs6000/eabi.asm +++ b/gcc/config/rs6000/eabi.asm @@ -80,6 +80,13 @@ .Ldtore = .-.LCTOC1 .long __DTOR_END__ /* end of .dtor section */ +.Linit = .-.LCTOC1 + .long .Linit_p /* address of variable to say we've been called */ + + .data +.Linit_p: + .long 0 + .text .Lptr: .long .LCTOC1-.Laddr /* PC relative pointer to .got2 */ @@ -92,9 +99,14 @@ FUNC_START(__eabi) lwz 11,(.Lptr-.Laddr)(12) /* linker generated address of .LCTOC1 */ add 11,11,12 /* correct to real pointer */ lwz 12,.Ltable(11) /* get linker's idea of where .Laddr is */ + lwz 10,.Linit(11) /* address of init flag */ subf. 12,12,11 /* calculate difference */ mtlr 0 /* restore link register */ - bc 4,2,.Lreloc /* skip if we need to relocate */ + lwzx 9,10,12 /* done flag */ + cmplwi 2,9,0 /* init flag != 0? */ + bnelr 2 /* return now, if we've been called already */ + stwx 1,10,12 /* store a non-zero value in the done flag */ + bne 0,.Lreloc /* skip if we need to relocate */ /* Only load up register 2 if there is a .got section */ diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 8cb317c8639..1be7f52e598 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -2917,7 +2917,7 @@ (match_operand:SF 2 "gpc_reg_operand" "f")))] "! TARGET_POWERPC && TARGET_HARD_FLOAT" "{fm|fmul} %0,%1,%2" - [(set_attr "type" "fp")]) + [(set_attr "type" "dmul")]) (define_expand "divsf3" [(set (match_operand:SF 0 "gpc_reg_operand" "") @@ -2940,7 +2940,7 @@ (match_operand:SF 2 "gpc_reg_operand" "f")))] "! TARGET_POWERPC && TARGET_HARD_FLOAT" "{fd|fdiv} %0,%1,%2" - [(set_attr "type" "sdiv")]) + [(set_attr "type" "ddiv")]) (define_insn "" [(set (match_operand:SF 0 "gpc_reg_operand" "=f")