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)
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 */
func_ptr *end = &__DTOR_END__[0];
for ( ; ptr != end; ptr++)
- (*ptr)();
+ if (*ptr)
+ (*ptr)();
}
.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 */
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 */
(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" "")
(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")