aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@gcc.gnu.org>1996-01-11 16:36:41 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1996-01-11 16:36:41 +0000
commit0780f386d71137d9d3f836a9e296b25c34446cb0 (patch)
tree1a4b6cdbf8e9852079d5a598198a98ea492e5fd6
parentffc1e7b2e9b1fb7feef1c158f442afc32729c7f1 (diff)
downloadgcc-0780f386d71137d9d3f836a9e296b25c34446cb0.zip
gcc-0780f386d71137d9d3f836a9e296b25c34446cb0.tar.gz
gcc-0780f386d71137d9d3f836a9e296b25c34446cb0.tar.bz2
insure eabi destructors get called
From-SVN: r10962
-rw-r--r--gcc/config/rs6000/eabi-ctors.c14
-rw-r--r--gcc/config/rs6000/eabi.asm14
-rw-r--r--gcc/config/rs6000/rs6000.md4
3 files changed, 27 insertions, 5 deletions
diff --git a/gcc/config/rs6000/eabi-ctors.c b/gcc/config/rs6000/eabi-ctors.c
index 6f6a891..69a78af 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 2319998..af5b7de 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 8cb317c..1be7f52 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")