From 40f66f29e17ee05ec5dd2e48b1eb74e38fa76ee9 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 7 Mar 2018 10:49:47 +0100 Subject: [PATCH] Backport r257842 2018-03-07 Martin Liska Backport from mainline 2018-02-20 Martin Liska PR c/84310 PR target/79747 * final.c (shorten_branches): Build align_tab array with one more element. * opts.c (finish_options): Add alignment option limit check. (MAX_CODE_ALIGN): Likewise. (MAX_CODE_ALIGN_VALUE): Likewise. * doc/invoke.texi: Document maximum allowed option value for all -falign-* options. 2018-03-07 Martin Liska Backport from mainline 2018-02-20 Martin Liska PR c/84310 PR target/79747 * gcc.target/i386/pr84310.c: New test. * gcc.target/i386/pr84310-2.c: Likewise. From-SVN: r258332 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/doc/invoke.texi | 4 ++++ gcc/final.c | 4 ++-- gcc/opts.c | 20 ++++++++++++++++++++ gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/gcc.target/i386/pr84310-2.c | 10 ++++++++++ gcc/testsuite/gcc.target/i386/pr84310.c | 8 ++++++++ 7 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr84310-2.c create mode 100644 gcc/testsuite/gcc.target/i386/pr84310.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a7526091cb8c..f2d0637cce6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2018-03-07 Martin Liska + + Backport from mainline + 2018-02-20 Martin Liska + + PR c/84310 + PR target/79747 + * final.c (shorten_branches): Build align_tab array with one + more element. + * opts.c (finish_options): Add alignment option limit check. + (MAX_CODE_ALIGN): Likewise. + (MAX_CODE_ALIGN_VALUE): Likewise. + * doc/invoke.texi: Document maximum allowed option value for + all -falign-* options. + 2018-03-07 Martin Liska Backport from mainline diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index dbd019f2c79a..df4f5bd17d81 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -7822,6 +7822,7 @@ Some assemblers only support this flag when @var{n} is a power of two; in that case, it is rounded up. If @var{n} is not specified or is zero, use a machine-dependent default. +The maximum allowed @var{n} option value is 65536. Enabled at levels @option{-O2}, @option{-O3}. @@ -7841,6 +7842,7 @@ are greater than this value, then their values are used instead. If @var{n} is not specified or is zero, use a machine-dependent default which is very likely to be @samp{1}, meaning no alignment. +The maximum allowed @var{n} option value is 65536. Enabled at levels @option{-O2}, @option{-O3}. @@ -7854,6 +7856,7 @@ operations. @option{-fno-align-loops} and @option{-falign-loops=1} are equivalent and mean that loops are not aligned. +The maximum allowed @var{n} option value is 65536. If @var{n} is not specified or is zero, use a machine-dependent default. @@ -7871,6 +7874,7 @@ need be executed. equivalent and mean that loops are not aligned. If @var{n} is not specified or is zero, use a machine-dependent default. +The maximum allowed @var{n} option value is 65536. Enabled at levels @option{-O2}, @option{-O3}. diff --git a/gcc/final.c b/gcc/final.c index 55cf509611f7..c07764e02e23 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -901,7 +901,7 @@ shorten_branches (rtx_insn *first) char *varying_length; rtx body; int uid; - rtx align_tab[MAX_CODE_ALIGN]; + rtx align_tab[MAX_CODE_ALIGN + 1]; /* Compute maximum UID and allocate label_align / uid_shuid. */ max_uid = get_max_uid (); @@ -1010,7 +1010,7 @@ shorten_branches (rtx_insn *first) alignment of n. */ uid_align = XCNEWVEC (rtx, max_uid); - for (i = MAX_CODE_ALIGN; --i >= 0;) + for (i = MAX_CODE_ALIGN + 1; --i >= 0;) align_tab[i] = NULL_RTX; seq = get_last_insn (); for (; seq; seq = PREV_INSN (seq)) diff --git a/gcc/opts.c b/gcc/opts.c index 8f9862db57c2..1467782bc3a3 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -972,6 +972,26 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, opts->x_flag_aggressive_loop_optimizations = 0; opts->x_flag_strict_overflow = 0; } + + /* Comes from final.c -- no real reason to change it. */ +#define MAX_CODE_ALIGN 16 +#define MAX_CODE_ALIGN_VALUE (1 << MAX_CODE_ALIGN) + + if (opts->x_align_loops > MAX_CODE_ALIGN_VALUE) + error_at (loc, "-falign-loops=%d is not between 0 and %d", + opts->x_align_loops, MAX_CODE_ALIGN_VALUE); + + if (opts->x_align_jumps > MAX_CODE_ALIGN_VALUE) + error_at (loc, "-falign-jumps=%d is not between 0 and %d", + opts->x_align_jumps, MAX_CODE_ALIGN_VALUE); + + if (opts->x_align_functions > MAX_CODE_ALIGN_VALUE) + error_at (loc, "-falign-functions=%d is not between 0 and %d", + opts->x_align_functions, MAX_CODE_ALIGN_VALUE); + + if (opts->x_align_labels > MAX_CODE_ALIGN_VALUE) + error_at (loc, "-falign-labels=%d is not between 0 and %d", + opts->x_align_labels, MAX_CODE_ALIGN_VALUE); } #define LEFT_COLUMN 27 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2d75729f2961..8421e5002e01 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2018-03-07 Martin Liska + + Backport from mainline + 2018-02-20 Martin Liska + + PR c/84310 + PR target/79747 + * gcc.target/i386/pr84310.c: New test. + * gcc.target/i386/pr84310-2.c: Likewise. + 2018-03-07 Martin Liska Backport from mainline diff --git a/gcc/testsuite/gcc.target/i386/pr84310-2.c b/gcc/testsuite/gcc.target/i386/pr84310-2.c new file mode 100644 index 000000000000..dbf5db6ff877 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr84310-2.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -malign-loops=16" } */ +/* { dg-warning "is obsolete" "" { target *-*-* } 0 } */ + +void +c (void) +{ + for (;;) + ; +} diff --git a/gcc/testsuite/gcc.target/i386/pr84310.c b/gcc/testsuite/gcc.target/i386/pr84310.c new file mode 100644 index 000000000000..f82327e45f36 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr84310.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -falign-functions=100000" } */ +/* { dg-error "is not between 0 and 65536" "" { target *-*-* } 0 } */ + +void +test_func (void) +{ +} -- 2.47.2