Hi.
As you probably noticed, current trunk accepts extended format
of -falign-FOO options.
However there are some limitations that are addressed in the patchset:
1) E.g. align_labels_max_skip and align_labels_log are separate
values and targets can override them via LABEL_ALIGN and
LABEL_ALIGN_MAX_SKIP. If you take a look at code in final.c:
if (max_log < log)
{
max_log = log;
max_skip = targetm.asm_out.label_align_max_skip (label);
}
It improves alignment, but max_skip can be zero and then we end up
with no alignment. Thus I see it saner to provide just a single hook
and return align_flags class instance.
2) In final.c we mix label, jump and loop alignments. I believe when
combining them together, one should do maximum and not rely on:
#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
/* Above, we don't know whether a label, jump or loop
alignment was used. Conservatively apply
label subalignment, not jump or loop
subalignment (they are almost always larger). */
That's implemented in align_flags::max function. When combining
for instance -falign-labels=1000 and -falign-jumps=2000, I hope
using alignment of 2000 is the right choice.
3) I removed various align_* defines and use directly
align_{*}.
4) I ported visium target to provide always secondary alignment of 8B.
That's the same what x86_64 does and was factored out in previous commits
I did.
5) Globally MAX_CODE_ALIGN is introduced.
6) Various coding styles are fixes in target code.
7) OPT_falign_* is not set with -Os. Then --help=common -Q reports proper
values.
I tested that on x86_64-linux-gnu and ppc64le-linux. And also I tested all
targets
that I touched, these should provide equal results.
Martin
marxin (4):
Clean up of new format of -falign-FOO.
Fix coding style of ASM_OUTPUT_ALIGN.
Define MAX_CODE_ALIGN globally.
Do not enable OPT_falign_* for -Os.
gcc/align.h | 80 ++++++++++++
gcc/common/config/i386/i386-common.c | 3 -
gcc/config/alpha/alpha.c | 5 +-
gcc/config/i386/att.h | 2 +-
gcc/config/i386/cygming.h | 2 +-
gcc/config/i386/gas.h | 2 +-
gcc/config/i386/i386.c | 5 +-
gcc/config/i386/x86-64.h | 2 +-
gcc/config/iq2000/iq2000.h | 2 +-
gcc/config/m32r/m32r.h | 3 +-
gcc/config/m68k/m68k.c | 10 +-
gcc/config/nds32/nds32.h | 9 +-
gcc/config/pa/pa.h | 2 +-
gcc/config/powerpcspe/powerpcspe.c | 18 +--
gcc/config/rs6000/rs6000-protos.h | 2 +-
gcc/config/rs6000/rs6000.c | 18 +--
gcc/config/rx/rx-protos.h | 2 +-
gcc/config/rx/rx.c | 59 +++++----
gcc/config/rx/rx.h | 6 +-
gcc/config/s390/s390.c | 9 +-
gcc/config/sh/sh.c | 19 +--
gcc/config/sparc/sol2.h | 2 +-
gcc/config/sparc/sparc.h | 2 +-
gcc/config/spu/spu.c | 6 +-
gcc/config/spu/spu.h | 2 +-
gcc/config/visium/visium.c | 2 +-
gcc/config/visium/visium.h | 17 +--
gcc/coretypes.h | 1 +
gcc/doc/tm.texi | 24 ----
gcc/doc/tm.texi.in | 8 --
gcc/final.c | 189 ++++++++-------------------
gcc/flags.h | 38 +-----
gcc/opts.c | 12 +-
gcc/output.h | 6 +-
gcc/system.h | 2 -
gcc/target.def | 40 ------
gcc/targhooks.h | 4 -
gcc/toplev.c | 44 ++-----
gcc/varasm.c | 14 +-
39 files changed, 262 insertions(+), 411 deletions(-)
create mode 100644 gcc/align.h
--
2.18.0