2.35 x64 assembler more than 70 times slower than 2.34?
Martin Liška
mliska@suse.cz
Wed Aug 19 10:42:23 GMT 2020
On 8/19/20 12:38 PM, Franz Sirl wrote:
> Am 2020-08-19 um 11:28 schrieb Martin Liška:
>> On 8/19/20 11:20 AM, Franz Sirl wrote:
>>> Am 2020-08-19 um 10:48 schrieb Martin Liška:
>>>> On 8/19/20 10:38 AM, Franz Sirl wrote:
>>>>> Hi,
>>>>>
>>>>> I just stumbled over an extreme slowdown in assembler performance. On a 265 MByte .s file (gcc10 assembly output of a 27000 line C source compiled with debug + ASAN + UBSAN) the assembler of 2.34 takes ~49-59sec, but the 2.35 assembler takes ~65-74min. Both use about 3.6 GBytes of memory. That's quite a performance regression, so hasn't anyone else seen this? Any timed mass rebuilds with binutils-2.35 yet?
>>>>
>>>> Btw. would it be possible to share the .s file to me?
>>>> Or is it a private project?
>>>
>>> Hi Martin,
>>>
>>> unfortunately this is a private project. Additionally the most affected file is a disassembler of a CPU that might still be under NDA.
>>> But that at least makes the structure quite clear, it's a lot of nested switch/case where each case has lots of macros wrapped in do/while(0). I'll check if I can reproduce it with one of GCCs insn-*.c files.
>>
>> I see. Do you generate the code with an optimization level (-O2 or so)?
>
> Yes, -O2 -fno-inline (as inlining doesn't really help here and just blows up compile time).
> Actually I was trying to speed up the compile (refactor case blocks into functions) when I noticed that more time is spent in GAS than GCC.
>
>>>
>>> BTW, I just did a build with debug info and a quick check shows that a CTRL-C usually seems to end up here:
>>
>> Can you please provide perf record && perf report?
>
> I'm not so familiar with perf, what would be a good perf record line in this case? Something like "perf record -F 99 as-new ..."?
>
> With perf top it looks like this after a few minutes:
> 97.75% as-new [.] _bfd_elf_write_secondary_reloc_section
> 2.22% [kernel] [k] 0xffffffffb2a00ae0
> 0.03% as-new [.] bfd_putl64
> 0.00% as-new [.] bfd_elf64_write_relocs
> 0.00% as-new [.] bfd_elf64_swap_reloca_out
>
> Even later:
> 97.95% as-new [.] _bfd_elf_write_secondary_reloc_section
> 2.04% [kernel] [k] 0xffffffffb2a00ae0
> 0.00% as-new [.] bfd_elf64_write_relocs
> 0.00% as-new [.] bfd_map_over_sections
> 0.00% as-new [.] bfd_arch_bits_per_address
>
>>
>>>
>>> Program received signal SIGINT, Interrupt.
>>> 0x00000000004781db in _bfd_elf_write_secondary_reloc_section (abfd=0x7b63c0, sec=<optimized out>) at ../../binutils-2.35-branch/bfd/elf.c:12770
>>> 12770 if (hdr->sh_type == SHT_RELA
>>> (gdb) bt
>>> #0 0x00000000004781db in _bfd_elf_write_secondary_reloc_section (abfd=0x7b63c0, sec=<optimized out>) at
>>
>> I bet it will be a different root case.
>> Can you please bisect which bintuils revision is responsible for that?
>
> Well, that was easy, I just took a wild guess according to git log and was lucky. The responsible commit is:
>
> commit a8e14f4cc2badfcf959f5e2cc57a941dc43f72d4
> Author: Nick Clifton <nickc@redhat.com>
> Date: Thu Mar 5 15:47:15 2020 +0000
>
> Add support for ELF files which contain multiple reloc sections which all target the same section.
>
> Starting with this commit the assembler slows down for me.
Nice catch! That corresponds to the hottest function in perf profile: _bfd_elf_write_secondary_reloc_section.
I bet we want to create a bugzilla entry for this. And please CC Nick to the bug.
Martin
>
> Franz
>
More information about the Binutils
mailing list