bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug binutils/22870] slow aarch64 assembler for source with lots of .loc


From: amodra at gmail dot com
Subject: [Bug binutils/22870] slow aarch64 assembler for source with lots of .loc directives
Date: Wed, 21 Feb 2018 00:05:21 +0000

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

Alan Modra <amodra at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |amodra at gmail dot com

--- Comment #1 from Alan Modra <amodra at gmail dot com> ---
gas is generating enormous chains of symbols.

(gdb) set args ../pr22870-big.s
(gdb) r
Starting program: /home/alan/build/gas/aarch64-linux/gas/as-new
../pr22870-big.s 
  C-c C-c
Program received signal SIGINT, Interrupt.
0x0000000000423277 in S_GET_SEGMENT (s=<optimised out>) at
/home/alan/src/binutils-gdb/gas/symbols.c:2221
2221      return s->bsym->section;
(gdb) up
#1  resolve_symbol_value (symp=0xb93b70, address@hidden) at
/home/alan/src/binutils-gdb/gas/symbols.c:1177
1177              seg_left = S_GET_SEGMENT (add_symbol);
(gdb) p *add_symbol
$1 = {sy_flags = {sy_local_symbol = 1, sy_written = 0, sy_resolved = 0,
sy_resolving = 0, sy_used_in_reloc = 0, sy_used = 0, sy_volatile = 0,
sy_forward_ref = 0, sy_mri_common = 0, sy_weakrefr = 0, sy_weakrefd = 0}, bsym
= 0x7df660, sy_value = {X_add_symbol = 0xb938a0, X_op_symbol = 0xb93970,
X_add_number = 0, X_op = O_illegal, X_unsigned = 0, X_extrabit = 0, X_md = 0},
sy_next = 0x1304c, sy_previous = 0x0, sy_frag = 0x0, sy_obj = {local =
12140608, size = 0x0, versioned_name = 0x0}, sy_tc = 0}
(gdb) p *((struct local_symbol *)add_symbol)
$2 = {lsy_flags = {sy_local_symbol = 1, sy_written = 0, sy_resolved = 0,
sy_resolving = 0, sy_used_in_reloc = 0, sy_used = 0, sy_volatile = 0,
sy_forward_ref = 0, sy_mri_common = 0, sy_weakrefr = 0, sy_weakrefd = 0},
lsy_section = 0x7df660, lsy_name = 0xb938a0 ".LVU4166", u = {lsy_frag =
0xb93970, lsy_sym = 0xb93970}, lsy_value = 0}
(gdb) up
#2  0x0000000000422d80 in resolve_symbol_value (symp=0xb96020,
address@hidden) at /home/alan/src/binutils-gdb/gas/symbols.c:1176
1176              left = resolve_symbol_value (add_symbol);
(gdb) p *add_symbol
$3 = {sy_flags = {sy_local_symbol = 1, sy_written = 0, sy_resolved = 0,
sy_resolving = 0, sy_used_in_reloc = 0, sy_used = 0, sy_volatile = 0,
sy_forward_ref = 0, sy_mri_common = 0, sy_weakrefr = 0, sy_weakrefd = 0}, bsym
= 0x7df660, sy_value = {X_add_symbol = 0xb93aa0, X_op_symbol = 0xb93b70,
X_add_number = 0, X_op = O_illegal, X_unsigned = 0, X_extrabit = 0, X_md = 0},
sy_next = 0x1304c, sy_previous = 0x0, sy_frag = 0x0, sy_obj = {local =
12140800, size = 0x0, versioned_name = 0x0}, sy_tc = 0}
(gdb) p *((struct local_symbol *)add_symbol)
$4 = {lsy_flags = {sy_local_symbol = 1, sy_written = 0, sy_resolved = 0,
sy_resolving = 0, sy_used_in_reloc = 0, sy_used = 0, sy_volatile = 0,
sy_forward_ref = 0, sy_mri_common = 0, sy_weakrefr = 0, sy_weakrefd = 0},
lsy_section = 0x7df660, lsy_name = 0xb93aa0 ".LVU4167", u = {lsy_frag =
0xb93b70, lsy_sym = 0xb93b70}, lsy_value = 0}
(gdb) up 99999
#4663 main (argc=<optimised out>, argv=<optimised out>) at
/home/alan/src/binutils-gdb/gas/as.c:1283
1283      perform_an_assembly_pass (argc, argv);
(gdb) down
#4662 0x0000000000403fb8 in perform_an_assembly_pass (argv=0x7c8e98,
argc=<optimised out>) at /home/alan/src/binutils-gdb/gas/as.c:1161
1161              read_a_source_file (*argv);
(gdb) 
#4661 0x000000000041ec4b in read_a_source_file (name=<optimised out>) at
/home/alan/src/binutils-gdb/gas/read.c:1148
1148                          (*pop->poc_handler) (pop->poc_val);
(gdb) 
#4660 0x000000000041c32f in cons_worker (nbytes=8, rva=0) at
/home/alan/src/binutils-gdb/gas/read.c:4081
4081              ret = TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
(gdb) 
#4659 0x000000000040f49d in expr (address@hidden,
address@hidden, address@hidden) at
/home/alan/src/binutils-gdb/gas/expr.c:1807
1807      retval = operand (resultP, mode);
(gdb) 
#4658 0x000000000040f21f in operand
(address@hidden, address@hidden) at
/home/alan/src/binutils-gdb/gas/expr.c:1357
1357                  expressionP->X_add_number = S_GET_VALUE (symbolP);
(gdb) p *symbolP
$5 = {sy_flags = {sy_local_symbol = 0, sy_written = 0, sy_resolved = 0,
sy_resolving = 1, sy_used_in_reloc = 0, sy_used = 1, sy_volatile = 0,
sy_forward_ref = 0, sy_mri_common = 0, sy_weakrefr = 0, sy_weakrefd = 0}, bsym
= 0xf7fc70, sy_value = {X_add_symbol = 0xf81fd0, X_op_symbol = 0x0,
X_add_number = 1, X_op = O_symbol, X_unsigned = 1, X_extrabit = 0, X_md = 0},
sy_next = 0xf827c0, sy_previous = 0xf82290, sy_frag = 0x7c6f60
<zero_address_frag>, sy_obj = {local = 0, size = 0x0, versioned_name = 0x0},
sy_tc = 0}
(gdb) p *symbolP->bsym
$6 = {the_bfd = 0x7de110, name = 0xf82300 ".LVU8808", value = 0, flags = 0,
section = 0x7a0590 <_bfd_std_section+560>, udata = {p = 0x0, i = 0}}
(gdb) down
#4657 0x000000000042386c in S_GET_VALUE (s=<optimised out>, address@hidden)
at /home/alan/src/binutils-gdb/gas/symbols.c:1964
1964          valueT val = resolve_symbol_value (s);
(gdb) 
#4656 0x0000000000422d80 in resolve_symbol_value (address@hidden) at
/home/alan/src/binutils-gdb/gas/symbols.c:1176
1176              left = resolve_symbol_value (add_symbol);
(gdb) p *add_symbol
$7 = {sy_flags = {sy_local_symbol = 1, sy_written = 0, sy_resolved = 0,
sy_resolving = 0, sy_used_in_reloc = 0, sy_used = 0, sy_volatile = 0,
sy_forward_ref = 0, sy_mri_common = 0, sy_weakrefr = 0, sy_weakrefd = 0}, bsym
= 0x7df660, sy_value = {X_add_symbol = 0xf81fc0, X_op_symbol = 0xf82090,
X_add_number = 0, X_op = O_illegal, X_unsigned = 0, X_extrabit = 0, X_md = 0},
sy_next = 0x1304c, sy_previous = 0x0, sy_frag = 0x0, sy_obj = {local =
16251728, size = 0x0, versioned_name = 0x0}, sy_tc = 0}
(gdb) p *((struct local_symbol *)add_symbol)
$8 = {lsy_flags = {sy_local_symbol = 1, sy_written = 0, sy_resolved = 0,
sy_resolving = 0, sy_used_in_reloc = 0, sy_used = 0, sy_volatile = 0,
sy_forward_ref = 0, sy_mri_common = 0, sy_weakrefr = 0, sy_weakrefd = 0},
lsy_section = 0x7df660, lsy_name = 0xf81fc0 ".LVU8807", u = {lsy_frag =
0xf82090, lsy_sym = 0xf82090}, lsy_value = 0}
(gdb) 

So .LVU8808 is defined from .LVU8807, which is defined from ... all the way
down to at least .LVU4166 (where the symbol resolution was interrupted) and
I'll bet down to .LVU1.  What's more, this symbol resolution is happening
before finalize_syms is set so the value calculated for .LVU8808 won't be saved
and thus won't cut short the recursion when gas wants the value for .LVU8809.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]