diff mbox series

avoid early asm output

Message ID nycvar.YFH.7.76.2006181108310.4397@zhemvz.fhfr.qr
State New
Headers show
Series avoid early asm output | expand

Commit Message

Richard Biener June 18, 2020, 9:08 a.m. UTC
This avoids early assembler output via the gimplifier creating
new static CTORs.  The output machinery seems to be prepared to
output constants recursively and it's just a matter of
appropriately defering or not defering output.

This also has the advantage of not outputting .string for
optimized away local aggregate initializers containing string
references.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

2020-06-18  Richard Biener  <rguenther@suse.de>

	* varasm.c (assemble_variable): Make sure to not
	defer output when outputting addressed constants.
	(output_constant_def_contents): Likewise.
	(add_constant_to_table): Take and pass on whether to
	defer output.
	(output_addressed_constants): Likewise.
	(output_constant_def): Pass on whether to defer output
	to add_constant_to_table.
	(tree_output_constant_def): Defer output of constants.
---
 gcc/varasm.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

Comments

Jakub Jelinek June 18, 2020, 9:39 a.m. UTC | #1
On Thu, Jun 18, 2020 at 11:08:53AM +0200, Richard Biener wrote:
> This avoids early assembler output via the gimplifier creating
> new static CTORs.  The output machinery seems to be prepared to
> output constants recursively and it's just a matter of
> appropriately defering or not defering output.
> 
> This also has the advantage of not outputting .string for
> optimized away local aggregate initializers containing string
> references.
> 
> Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Use bool instead of int?

	Jakub
Richard Biener June 18, 2020, 10:03 a.m. UTC | #2
On Thu, 18 Jun 2020, Jakub Jelinek wrote:

> On Thu, Jun 18, 2020 at 11:08:53AM +0200, Richard Biener wrote:
> > This avoids early assembler output via the gimplifier creating
> > new static CTORs.  The output machinery seems to be prepared to
> > output constants recursively and it's just a matter of
> > appropriately defering or not defering output.
> > 
> > This also has the advantage of not outputting .string for
> > optimized away local aggregate initializers containing string
> > references.
> > 
> > Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
> 
> Use bool instead of int?

Shortly thought about it but then went with int because of the
pre-existing interface of output_constant_def which "interferes"
with this (ripples down into users in expr.c as well).

If you insist I'll hunt them all down ...

Thanks,
Richard.
Jakub Jelinek June 18, 2020, 10:08 a.m. UTC | #3
On Thu, Jun 18, 2020 at 12:03:26PM +0200, Richard Biener wrote:
> Shortly thought about it but then went with int because of the
> pre-existing interface of output_constant_def which "interferes"
> with this (ripples down into users in expr.c as well).
> 
> If you insist I'll hunt them all down ...

I don't insist, it was just a random comment.

	Jakub
diff mbox series

Patch

diff --git a/gcc/varasm.c b/gcc/varasm.c
index 4070f9c17e8..84df52013d7 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -110,7 +110,7 @@  static void decode_addr_const (tree, class addr_const *);
 static hashval_t const_hash_1 (const tree);
 static int compare_constant (const tree, const tree);
 static void output_constant_def_contents (rtx);
-static void output_addressed_constants (tree);
+static void output_addressed_constants (tree, int);
 static unsigned HOST_WIDE_INT output_constant (tree, unsigned HOST_WIDE_INT,
 					       unsigned int, bool, bool);
 static void globalize_decl (tree);
@@ -2272,7 +2272,7 @@  assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
 
   /* Output any data that we will need to use the address of.  */
   if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node)
-    output_addressed_constants (DECL_INITIAL (decl));
+    output_addressed_constants (DECL_INITIAL (decl), 0);
 
   /* dbxout.c needs to know this.  */
   if (sect && (sect->common.flags & SECTION_CODE) != 0)
@@ -3426,11 +3426,11 @@  build_constant_desc (tree exp)
    already have labels.  */
 
 static constant_descriptor_tree *
-add_constant_to_table (tree exp)
+add_constant_to_table (tree exp, int defer)
 {
   /* The hash table methods may call output_constant_def for addressed
      constants, so handle them first.  */
-  output_addressed_constants (exp);
+  output_addressed_constants (exp, defer);
 
   /* Sanity check to catch recursive insertion.  */
   static bool inserting;
@@ -3474,7 +3474,7 @@  add_constant_to_table (tree exp)
 rtx
 output_constant_def (tree exp, int defer)
 {
-  struct constant_descriptor_tree *desc = add_constant_to_table (exp);
+  struct constant_descriptor_tree *desc = add_constant_to_table (exp, defer);
   maybe_output_constant_def_contents (desc, defer);
   return desc->rtl;
 }
@@ -3544,7 +3544,7 @@  output_constant_def_contents (rtx symbol)
 
   /* Make sure any other constants whose addresses appear in EXP
      are assigned label numbers.  */
-  output_addressed_constants (exp);
+  output_addressed_constants (exp, 0);
 
   /* We are no longer deferring this constant.  */
   TREE_ASM_WRITTEN (decl) = TREE_ASM_WRITTEN (exp) = 1;
@@ -3608,7 +3608,7 @@  lookup_constant_def (tree exp)
 tree
 tree_output_constant_def (tree exp)
 {
-  struct constant_descriptor_tree *desc = add_constant_to_table (exp);
+  struct constant_descriptor_tree *desc = add_constant_to_table (exp, 1);
   tree decl = SYMBOL_REF_DECL (XEXP (desc->rtl, 0));
   varpool_node::finalize_decl (decl);
   return decl;
@@ -4327,7 +4327,7 @@  compute_reloc_for_constant (tree exp)
    Indicate whether an ADDR_EXPR has been encountered.  */
 
 static void
-output_addressed_constants (tree exp)
+output_addressed_constants (tree exp, int defer)
 {
   tree tem;
 
@@ -4347,21 +4347,21 @@  output_addressed_constants (tree exp)
 	tem = DECL_INITIAL (tem);
 
       if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
-	output_constant_def (tem, 0);
+	output_constant_def (tem, defer);
 
       if (TREE_CODE (tem) == MEM_REF)
-	output_addressed_constants (TREE_OPERAND (tem, 0));
+	output_addressed_constants (TREE_OPERAND (tem, 0), defer);
       break;
 
     case PLUS_EXPR:
     case POINTER_PLUS_EXPR:
     case MINUS_EXPR:
-      output_addressed_constants (TREE_OPERAND (exp, 1));
+      output_addressed_constants (TREE_OPERAND (exp, 1), defer);
       gcc_fallthrough ();
 
     CASE_CONVERT:
     case VIEW_CONVERT_EXPR:
-      output_addressed_constants (TREE_OPERAND (exp, 0));
+      output_addressed_constants (TREE_OPERAND (exp, 0), defer);
       break;
 
     case CONSTRUCTOR:
@@ -4369,7 +4369,7 @@  output_addressed_constants (tree exp)
 	unsigned HOST_WIDE_INT idx;
 	FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem)
 	  if (tem != 0)
-	    output_addressed_constants (tem);
+	    output_addressed_constants (tem, defer);
       }
       break;