OSDN Git Service

* varasm.c (assemble_variable): Use assemble_zeros for
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jul 2004 06:26:08 +0000 (06:26 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 Jul 2004 06:26:08 +0000 (06:26 +0000)
        zero-initialized variables.
        (categorize_decl_for_section): Honor flag_zero_initialized_in_bss
        for SECCAT_BSS and SECCAT_TBSS.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84271 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/varasm.c

index 15bf4ad..66b7075 100644 (file)
@@ -1,9 +1,17 @@
-2004-07-06 Jan Beulich <jbeulich@novell.com>
+2004-07-07  Jan Beulich  <jbeulich@novell.com>
+           Richard Henderson  <rth@redhat.com>
+
+       * varasm.c (assemble_variable): Use assemble_zeros for
+       zero-initialized variables.
+       (categorize_decl_for_section): Honor flag_zero_initialized_in_bss
+       for SECCAT_BSS and SECCAT_TBSS.
+
+2004-07-07  Jan Beulich  <jbeulich@novell.com>
 
        * varasm.c (asm_output_bss): Don't declare unless BSS_SECTION_ASM_OP.
-                                                                                
-        * expmed.c (emit_store_flag): Also special-case double-word
-        (in-)equality comparison against -1.
+
+       * expmed.c (emit_store_flag): Also special-case double-word
+       (in-)equality comparison against -1.
 
        * config/i386/i386.c (ix86_gimplify_va_arg): Don't need temporary for
        passing arguments the containers for which are registers.
index 65875e5..37a7a7c 100644 (file)
@@ -1563,7 +1563,9 @@ assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
 
   if (!dont_output_data)
     {
-      if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node)
+      if (DECL_INITIAL (decl)
+         && DECL_INITIAL (decl) != error_mark_node
+         && !initializer_zerop (DECL_INITIAL (decl)))
        /* Output the actual data.  */
        output_constant (DECL_INITIAL (decl),
                         tree_low_cst (DECL_SIZE_UNIT (decl), 1),
@@ -4611,7 +4613,11 @@ categorize_decl_for_section (tree decl, int reloc, int shlib)
   else if (TREE_CODE (decl) == VAR_DECL)
     {
       if (DECL_INITIAL (decl) == NULL
-         || DECL_INITIAL (decl) == error_mark_node)
+         || DECL_INITIAL (decl) == error_mark_node
+         || (flag_zero_initialized_in_bss
+             /* Leave constant zeroes in .rodata so they can be shared.  */
+             && !TREE_READONLY (decl)
+             && initializer_zerop (DECL_INITIAL (decl))))
        ret = SECCAT_BSS;
       else if (! TREE_READONLY (decl)
               || TREE_SIDE_EFFECTS (decl)
@@ -4653,7 +4659,11 @@ categorize_decl_for_section (tree decl, int reloc, int shlib)
   /* There are no read-only thread-local sections.  */
   if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
     {
-      if (ret == SECCAT_BSS)
+      /* Note that this would be *just* SECCAT_BSS, except that there's
+        no concept of a read-only thread-local-data section.  */
+      if (ret == SECCAT_BSS
+         || (flag_zero_initialized_in_bss
+             && initializer_zerop (DECL_INITIAL (decl))))
        ret = SECCAT_TBSS;
       else
        ret = SECCAT_TDATA;