diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2019-02-10 04:34:10 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2019-02-10 04:34:22 -0800 |
commit | db22231044df03bbcb987496f3f29f0462b2e9ee (patch) | |
tree | 192c026a57355102d8022e6600d95d916e9ff375 /gas/config/tc-i386.h | |
parent | ab759ca8db37ffd3e32df5226e0b4ea16a81c849 (diff) | |
download | gdb-db22231044df03bbcb987496f3f29f0462b2e9ee.zip gdb-db22231044df03bbcb987496f3f29f0462b2e9ee.tar.gz gdb-db22231044df03bbcb987496f3f29f0462b2e9ee.tar.bz2 |
gas: Pass max_bytes to TC_FRAG_INIT
ommit 3ae729d5a4f63740ed9a778960b17c2912b0bbdd
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Mar 7 04:18:45 2018 -0800
x86: Rewrite NOP generation for fill and alignment
increased MAX_MEM_FOR_RS_ALIGN_CODE to 4095 which resulted in increase
of assembler time and memory usage by 5 times for inputs with many
.p2align directives, which is typical for LTO output. This patch passes
max_bytes to TC_FRAG_INIT so that MAX_MEM_FOR_RS_ALIGN_CODE can be set
as needed and tracked by backend it so that HANDLE_ALIGN can check the
maximum alignment for each rs_align_code frag. Wall time to assemble
the same cc1plus.s:
before:
423.78user 0.89system 7:05.71elapsed 99%CPU
after:
102.35user 0.27system 1:42.89elapsed 99%CPU
PR gas/24165
* frags.c (frag_var_init): Pass max_chars to TC_FRAG_INIT as
max_bytes.
* config/tc-aarch64.h (TC_FRAG_INIT): Add and pass max_bytes to
aarch64_init_frag.
* /config/tc-arm.h (TC_FRAG_INIT): And and pass max_bytes to
arm_init_frag.
* config/tc-avr.h (TC_FRAG_INIT): And and ignore max_bytes.
* config/tc-ia64.h (TC_FRAG_INIT): Likewise.
* config/tc-mmix.h (TC_FRAG_INIT): Likewise.
* config/tc-nds32.h (TC_FRAG_INIT): Likewise.
* config/tc-ns32k.h (TC_FRAG_INIT): Likewise.
* config/tc-rl78.h (TC_FRAG_INIT): Likewise.
* config/tc-rx.h (TC_FRAG_INIT): Likewise.
* config/tc-score.h (TC_FRAG_INIT): Likewise.
* config/tc-tic54x.h (TC_FRAG_INIT): Likewise.
* config/tc-tic6x.h (TC_FRAG_INIT): Likewise.
* config/tc-xtensa.h (TC_FRAG_INIT): Likewise.
* config/tc-i386.h (MAX_MEM_FOR_RS_ALIGN_CODE): Set to
(alignment ? ((1 << alignment) - 1) : 1)
(i386_tc_frag_data): Add max_bytes.
(TC_FRAG_INIT): Add and track max_bytes.
(HANDLE_ALIGN): Replace MAX_MEM_FOR_RS_ALIGN_CODE with
fragP->tc_frag_data.max_bytes.
* doc/internals.texi: Update TC_FRAG_TYPE with max_bytes.
Diffstat (limited to 'gas/config/tc-i386.h')
-rw-r--r-- | gas/config/tc-i386.h | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index f10b00d..1f740e4 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -206,7 +206,7 @@ if ((n) \ goto around; \ } -#define MAX_MEM_FOR_RS_ALIGN_CODE 4095 +#define MAX_MEM_FOR_RS_ALIGN_CODE (alignment ? ((1 << alignment) - 1) : 1) void i386_print_statistics (FILE *); #define tc_print_statistics i386_print_statistics @@ -251,6 +251,7 @@ struct i386_tc_frag_data enum processor_type isa; i386_cpu_flags isa_flags; enum processor_type tune; + unsigned int max_bytes; }; /* We need to emit the right NOP pattern in .align frags. This is @@ -258,12 +259,13 @@ struct i386_tc_frag_data the isa/tune settings at the time the .align was assembled. */ #define TC_FRAG_TYPE struct i386_tc_frag_data -#define TC_FRAG_INIT(FRAGP) \ +#define TC_FRAG_INIT(FRAGP, MAX_BYTES) \ do \ { \ (FRAGP)->tc_frag_data.isa = cpu_arch_isa; \ (FRAGP)->tc_frag_data.isa_flags = cpu_arch_isa_flags; \ (FRAGP)->tc_frag_data.tune = cpu_arch_tune; \ + (FRAGP)->tc_frag_data.max_bytes = (MAX_BYTES); \ } \ while (0) @@ -280,7 +282,8 @@ if (fragP->fr_type == rs_align_code) \ offsetT __count = (fragP->fr_next->fr_address \ - fragP->fr_address \ - fragP->fr_fix); \ - if (__count > 0 && __count <= MAX_MEM_FOR_RS_ALIGN_CODE) \ + if (__count > 0 \ + && (unsigned int) __count <= fragP->tc_frag_data.max_bytes) \ md_generate_nops (fragP, fragP->fr_literal + fragP->fr_fix, \ __count, 0); \ } |