fix performance problem in Xtensa port of GAS
Bob Wilson
bwilson@tensilica.com
Fri Sep 12 00:12:00 GMT 2003
The Xtensa port of GAS had a serious performance problem with input files
containing lots of labels. It was building a list of all the labels and
searching it repeatedly. This patch changes it to keep two lists: 1) a list
of all the symbols attached to literal values, and 2) a running list of
labels on the current instruction (as is also done by the MIPS port). The
literal list may be long (although still much shorter than the previous list
of all symbols) but it's only traversed once. The list of current labels
will always be reasonably short. This reduces the time to assemble one
particular file from GCC's libstdc++ from over 14 minutes to just a few
seconds on my machine.
I've tested this on as many inputs as I could conveniently run and haven't
seen any problems. Committed on the mainline.
Thanks to Sterling Augustine who identified the problem and developed an
earlier version of this patch!
2003-09-11 Bob Wilson <bob.wilson@acm.org>
* config/tc-xtensa.c (insn_labels, free_insn_labels, saved_insn_labels,
literal_syms): New global variables.
(xtensa_define_label, add_target_symbol, xtensa_find_label,
map_over_defined_symbols, is_loop_target_label,
xtensa_mark_target_fragments, xtensa_move_frag_symbol,
xtensa_move_frag_symbols, defined_symbols, branch_targets): Delete.
(xtensa_begin_directive): Call md_flush_pending_output. Move symbols
from insn_labels to saved_insn_labels when entering a literal region.
(xtensa_end_directive): Call md_flush_pending_output. Restore
insn_labels list when leaving a literal region.
(xtensa_literal_position): Call xtensa_clear_insn_labels.
(xtensa_literal_pseudo): Add check to disallow .literal inside a
literal region. Move insn_labels to saved_insn_labels and then restore
insn_labels on exit.
(xg_add_branch_and_loop_targets): Replace add_target_symbol calls with
code to set is_loop_target or is_branch_target flag on the symbol
(xtensa_create_literal_symbol): Call xtensa_add_literal_sym.
(xtensa_add_literal_sym, xtensa_add_insn_label,
xtensa_clear_insn_labels): New functions.
(xtensa_move_labels): Remove old_frag and old_offset arguments. Add
loops_ok argument. Rewrite to use insn_labels list instead of
calling xtensa_find_label and to check the is_loop_target flag on
symbols when loops_ok is false.
(xtensa_frob_label): Remove call to xtensa_define_label. Add call
to either xtensa_add_literal_sym or xtensa_add_insn_label. Adjust
call to xtensa_move_labels. Propagate is_branch_target and
is_loop_target flags from symbols to frags.
(xtensa_flush_pending_output): Call xtensa_clear_insn_labels.
(md_assemble): Use xtensa_move_labels with loops_ok = FALSE when
aligning a loop instruction. Adjust call to xtensa_move_labels for
aligning entry instructions. Add call to xtensa_clear_insn_labels.
(xtensa_end): Remove call to xtensa_mark_target_fragments.
(xtensa_move_literals): Replace xtensa_move_frag_symbols call with
code to use new literal_syms list.
* config/tc-xtensa.h (xtensa_symfield_type): Add is_loop_target and
is_branch_target flags.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: gas-speedup2.patch
Type: text/x-diff
Size: 17064 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20030912/e2d4a560/attachment.bin>
More information about the Binutils
mailing list