public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/2] rh2059646 - compilation of prusa-slicer hangs
@ 2022-03-09  5:25 Alan Modra
  2022-03-09  5:25 ` [PATCH 1/2] Reduce duplicated symbol_clone_if_forward_ref work Alan Modra
  2022-03-09  5:25 ` [PATCH 2/2] Constant fold view increment expressions Alan Modra
  0 siblings, 2 replies; 6+ messages in thread
From: Alan Modra @ 2022-03-09  5:25 UTC (permalink / raw)
  To: binutils

rh2059646-reduced.s is a 10M source for one function extracted from
the 386M source attached to
https://bugzilla.redhat.com/show_bug.cgi?id=2059646

Assembly even of the reduced file takes a long time, and the default
stack of 8M is not enough to handle recursion of resolve_symbol_value
starting from case rs_leb128 in gas/write.c:relax_segment.  There is
one extremely long chain of expressions evaluating view numbers,
123582 deep if I calculated correctly.  The source has that many .loc
directives in a row without intervening assembly instructions!

$ time ~/build/gas-virgin/all/gas/as-new -o xxx.o rh2059646-reduced.s
Segmentation fault (core dumped)

real	4m10.792s
user	4m9.810s
sys	0m0.080s

$ ulimit -s 65536
$ time ~/build/gas-virgin/all/gas/as-new -o xxx.o rh2059646-reduced.s

real	37m38.141s
user	37m37.930s
sys	0m0.052s

After applying the following patches:

$ time ~/build/gas/all/gas/as-new -o yyy.o rh2059646-reduced.s

real	0m0.350s
user	0m0.330s
sys	0m0.020s


Alan Modra (2):
  Reduce duplicated symbol_clone_if_forward_ref work
  Constant fold view increment expressions

 gas/dwarf2dbg.c |  1 +
 gas/symbols.c   | 11 ++++++++---
 2 files changed, 9 insertions(+), 3 deletions(-)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] Reduce duplicated symbol_clone_if_forward_ref work
  2022-03-09  5:25 [PATCH 0/2] rh2059646 - compilation of prusa-slicer hangs Alan Modra
@ 2022-03-09  5:25 ` Alan Modra
  2022-03-09  5:25 ` [PATCH 2/2] Constant fold view increment expressions Alan Modra
  1 sibling, 0 replies; 6+ messages in thread
From: Alan Modra @ 2022-03-09  5:25 UTC (permalink / raw)
  To: binutils

	* symbol.c (struct symbol_flags): Add forward_resolved.
	(symbol_entry_find): Update needle initialisation.
	(symbol_clone_if_forward_ref): Do no work when forward_resolved
	is already set.  Set forward_resolved.

diff --git a/gas/symbols.c b/gas/symbols.c
index 2a0ee7783c0..b35c6d25aca 100644
--- a/gas/symbols.c
+++ b/gas/symbols.c
@@ -61,8 +61,10 @@ struct symbol_flags
   /* Whether the symbol can be re-defined.  */
   unsigned int volatil : 1;
 
-  /* Whether the symbol is a forward reference.  */
+  /* Whether the symbol is a forward reference, and whether such has
+     been determined.  */
   unsigned int forward_ref : 1;
+  unsigned int forward_resolved : 1;
 
   /* This is set if the symbol is defined in an MRI common section.
      We handle such sections as single common symbols, so symbols
@@ -202,7 +204,7 @@ static void *
 symbol_entry_find (htab_t table, const char *name)
 {
   hashval_t hash = htab_hash_string (name);
-  symbol_entry_t needle = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+  symbol_entry_t needle = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 			      hash, name, 0, 0, 0 } };
   return htab_find_with_hash (table, &needle, hash);
 }
@@ -777,7 +779,9 @@ symbol_clone (symbolS *orgsymP, int replace)
 symbolS *
 symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
 {
-  if (symbolP && !symbolP->flags.local_symbol)
+  if (symbolP
+      && !symbolP->flags.local_symbol
+      && !symbolP->flags.forward_resolved)
     {
       symbolS *orig_add_symbol = symbolP->x->value.X_add_symbol;
       symbolS *orig_op_symbol = symbolP->x->value.X_op_symbol;
@@ -830,6 +834,7 @@ symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
 
       symbolP->x->value.X_add_symbol = add_symbol;
       symbolP->x->value.X_op_symbol = op_symbol;
+      symbolP->flags.forward_resolved = 1;
     }
 
   return symbolP;

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/2] Constant fold view increment expressions
  2022-03-09  5:25 [PATCH 0/2] rh2059646 - compilation of prusa-slicer hangs Alan Modra
  2022-03-09  5:25 ` [PATCH 1/2] Reduce duplicated symbol_clone_if_forward_ref work Alan Modra
@ 2022-03-09  5:25 ` Alan Modra
  2022-03-09  9:23   ` Fix for bug 28924 Viorel Preoteasa
  1 sibling, 1 reply; 6+ messages in thread
From: Alan Modra @ 2022-03-09  5:25 UTC (permalink / raw)
  To: binutils

The idea here is to replace expressions like v + 1 + 1 + 1 with v + 3.

	* dwarf2dbg.c (set_or_check_view): Remove useless assertion.
	Resolve multiple view increments.
	* testsuite/gas/elf/dwarf2-18.d: Don't xfail mep.

diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index 7269c4cdf87..ba97b5f0126 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -402,18 +402,27 @@ set_or_check_view (struct line_entry *e, struct line_entry *p,
   if (viewx.X_op != O_constant || viewx.X_add_number)
     {
       expressionS incv;
+      expressionS *p_view;
 
       if (!p->loc.u.view)
-	{
-	  p->loc.u.view = symbol_temp_make ();
-	  gas_assert (!S_IS_DEFINED (p->loc.u.view));
-	}
+	p->loc.u.view = symbol_temp_make ();
 
       memset (&incv, 0, sizeof (incv));
       incv.X_unsigned = 1;
       incv.X_op = O_symbol;
       incv.X_add_symbol = p->loc.u.view;
       incv.X_add_number = 1;
+      p_view = symbol_get_value_expression (p->loc.u.view);
+      if (p_view->X_op == O_constant || p_view->X_op == O_symbol)
+	{
+	  /* If we can, constant fold increments so that a chain of
+	     expressions v + 1 + 1 ... + 1 is not created.
+	     resolve_expression isn't ideal for this purpose.  The
+	     base v might not be resolvable until later.  */
+	  incv.X_op = p_view->X_op;
+	  incv.X_add_symbol = p_view->X_add_symbol;
+	  incv.X_add_number = p_view->X_add_number + 1;
+	}
 
       if (viewx.X_op == O_constant)
 	{
diff --git a/gas/testsuite/gas/elf/dwarf2-18.d b/gas/testsuite/gas/elf/dwarf2-18.d
index db7a4f9f20b..fbaebaa9019 100644
--- a/gas/testsuite/gas/elf/dwarf2-18.d
+++ b/gas/testsuite/gas/elf/dwarf2-18.d
@@ -2,9 +2,8 @@
 #readelf: -x.rodata -wL
 #name: DWARF2 18
 # The am33 cr16 crx ft32 mn10 msp430 nds32 and rl78 targets do not evaluate the subtraction of symbols at assembly time.
-# The mep targets turns some view computations into complex relocations.
 # The riscv targets do not support the subtraction of symbols.
-#xfail: am3*-* cr16-* crx-* ft32*-* mep-* mn10*-* msp430-* nds32*-* riscv*-* rl78-*
+#xfail: am3*-* cr16-* crx-* ft32*-* mn10*-* msp430-* nds32*-* riscv*-* rl78-*
 
 Hex dump of section '\.rodata':
   0x00000000 0100 *.*

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Fix for bug 28924
  2022-03-09  5:25 ` [PATCH 2/2] Constant fold view increment expressions Alan Modra
@ 2022-03-09  9:23   ` Viorel Preoteasa
  2022-03-09 11:42     ` Nick Clifton
  0 siblings, 1 reply; 6+ messages in thread
From: Viorel Preoteasa @ 2022-03-09  9:23 UTC (permalink / raw)
  To: binutils

Hello,

We have a fix for bug 28924.

https://sourceware.org/bugzilla/show_bug.cgi?id=28924

The fix is very simple and involves very small changes (2 lines). How 
can we have this fix applied? If I send the changes could someone apply 
the fix?

I could also try to produce a test which does not depend on gcc that 
reveals the problem. The dependency on gcc make the test unreliable.

Best regards,

Viorel Preoteasa



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Fix for bug 28924
  2022-03-09  9:23   ` Fix for bug 28924 Viorel Preoteasa
@ 2022-03-09 11:42     ` Nick Clifton
  2022-03-16 19:10       ` Viorel Preoteasa
  0 siblings, 1 reply; 6+ messages in thread
From: Nick Clifton @ 2022-03-09 11:42 UTC (permalink / raw)
  To: Viorel Preoteasa, Alan Matsuoka; +Cc: Binutils

Hi Viorel,

> We have a fix for bug 28924.
> 
> https://sourceware.org/bugzilla/show_bug.cgi?id=28924
> 
> The fix is very simple and involves very small changes (2 lines). How can we have this fix applied? If I send the changes could someone apply the fix?

Please submit the patch to the binutils mailing list, so that it can be reviewed.

It would also help if you can add a link to the email to PR 28924, once the email
appears in the binutils mailing list archive.


> I could also try to produce a test which does not depend on gcc that reveals the problem. The dependency on gcc make the test unreliable.

That would be appreciated.  A patch that includes a test is always better than
one that does not.

Cheers
   Nick


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Fix for bug 28924
  2022-03-09 11:42     ` Nick Clifton
@ 2022-03-16 19:10       ` Viorel Preoteasa
  0 siblings, 0 replies; 6+ messages in thread
From: Viorel Preoteasa @ 2022-03-16 19:10 UTC (permalink / raw)
  To: Nick Clifton, Alan Matsuoka; +Cc: Binutils

Hi Nick,

I noticed that you answered the bug 28924. I have now added a file that 
can be used to reproduce the problem, and I added also the information 
required to fix the problem.

Viorel

On 3/9/2022 1:42 PM, Nick Clifton wrote:
> Hi Viorel,
>
>> We have a fix for bug 28924.
>>
>> https://sourceware.org/bugzilla/show_bug.cgi?id=28924
>>
>> The fix is very simple and involves very small changes (2 lines). How 
>> can we have this fix applied? If I send the changes could someone 
>> apply the fix?
>
> Please submit the patch to the binutils mailing list, so that it can 
> be reviewed.
>
> It would also help if you can add a link to the email to PR 28924, 
> once the email
> appears in the binutils mailing list archive.
>
>
>> I could also try to produce a test which does not depend on gcc that 
>> reveals the problem. The dependency on gcc make the test unreliable.
>
> That would be appreciated.  A patch that includes a test is always 
> better than
> one that does not.
>
> Cheers
>   Nick
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-03-16 19:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-09  5:25 [PATCH 0/2] rh2059646 - compilation of prusa-slicer hangs Alan Modra
2022-03-09  5:25 ` [PATCH 1/2] Reduce duplicated symbol_clone_if_forward_ref work Alan Modra
2022-03-09  5:25 ` [PATCH 2/2] Constant fold view increment expressions Alan Modra
2022-03-09  9:23   ` Fix for bug 28924 Viorel Preoteasa
2022-03-09 11:42     ` Nick Clifton
2022-03-16 19:10       ` Viorel Preoteasa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).