OSDN Git Service

insure eabi destructors get called
authormeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Jan 1996 16:36:41 +0000 (16:36 +0000)
committermeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Jan 1996 16:36:41 +0000 (16:36 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@10962 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/config/rs6000/eabi-ctors.c
gcc/config/rs6000/eabi.asm
gcc/config/rs6000/rs6000.md

index 6f6a891..69a78af 100644 (file)
@@ -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)();
 }
 
index 2319998..af5b7de 100644 (file)
 .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 */
 
index 8cb317c..1be7f52 100644 (file)
                 (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")