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