From: Alan Modra Date: Tue, 8 Mar 2022 12:18:51 +0000 (+1030) Subject: Constant fold view increment expressions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fb0e49d8e05e61ca2af9b5f60b01ad5fb6d274ff;p=binutils-gdb.git Constant fold view increment expressions 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 *.*