From f66a9a76137456a12b3720add7b9b2c3bbcfff3f Mon Sep 17 00:00:00 2001 From: Christian Bruel Date: Fri, 16 Oct 2015 15:37:14 +0200 Subject: [PATCH] re PR target/67745 ([ARM] wrong alignments when __attribute__ ((optimize,target,align) is used) 2015-10-16 Christian Bruel PR target/67745 * config/arm/arm.h (FUNCTION_BOUNDARY): Move optimize_size condition to: * config/arm/arm.c (arm_option_override_internal): Call arm_override_options_after_change_1. (arm_override_options_after_change): New function. (arm_override_options_after_change_1): Likewise. (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): Define hook. From-SVN: r228904 --- gcc/ChangeLog | 10 ++++++++ gcc/config/arm/arm.c | 22 ++++++++++++++++++ gcc/config/arm/arm.h | 2 +- gcc/testsuite/ChangeLog | 8 +++++++ gcc/testsuite/gcc.target/arm/attr-align1.c | 27 ++++++++++++++++++++++ gcc/testsuite/gcc.target/arm/attr-align2.c | 15 ++++++++++++ gcc/testsuite/gcc.target/arm/attr-align3.c | 13 +++++++++++ gcc/testsuite/gcc.target/arm/no-align.c | 12 ++++++++++ 8 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/arm/attr-align1.c create mode 100644 gcc/testsuite/gcc.target/arm/attr-align2.c create mode 100644 gcc/testsuite/gcc.target/arm/attr-align3.c create mode 100644 gcc/testsuite/gcc.target/arm/no-align.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9c9cc65cb98..24deaaccef3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2015-10-16 Christian Bruel + + PR target/67745 + * config/arm/arm.h (FUNCTION_BOUNDARY): Move optimize_size condition to: + * config/arm/arm.c (arm_option_override_internal): Call + arm_override_options_after_change_1. + (arm_override_options_after_change): New function. + (arm_override_options_after_change_1): Likewise. + (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): Define hook. + 2015-10-11 Jan Hubicka Revert: diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 0bf1164845c..2c8215cb513 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -246,6 +246,7 @@ static tree arm_build_builtin_va_list (void); static void arm_expand_builtin_va_start (tree, rtx); static tree arm_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *); static void arm_option_override (void); +static void arm_override_options_after_change (void); static void arm_option_print (FILE *, int, struct cl_target_option *); static void arm_set_current_function (tree); static bool arm_can_inline_p (tree, tree); @@ -407,6 +408,9 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_OPTION_OVERRIDE #define TARGET_OPTION_OVERRIDE arm_option_override +#undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE +#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE arm_override_options_after_change + #undef TARGET_OPTION_PRINT #define TARGET_OPTION_PRINT arm_option_print @@ -2810,11 +2814,29 @@ static GTY(()) bool thumb_flipper; /* Options after initial target override. */ static GTY(()) tree init_optimize; +static void +arm_override_options_after_change_1 (struct gcc_options *opts) +{ + if (opts->x_align_functions <= 0) + opts->x_align_functions = TARGET_THUMB_P (opts->x_target_flags) + && opts->x_optimize_size ? 2 : 4; +} + +/* Implement targetm.override_options_after_change. */ + +static void +arm_override_options_after_change (void) +{ + arm_override_options_after_change_1 (&global_options); +} + /* Reset options between modes that the user has specified. */ static void arm_option_override_internal (struct gcc_options *opts, struct gcc_options *opts_set) { + arm_override_options_after_change_1 (opts); + if (TARGET_THUMB_P (opts->x_target_flags) && !(ARM_FSET_HAS_CPU1 (insn_flags, FL_THUMB))) { diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 87c9f904894..9715969a5e5 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -565,7 +565,7 @@ extern int arm_arch_crc; #define PREFERRED_STACK_BOUNDARY \ (arm_abi == ARM_ABI_ATPCS ? 64 : STACK_BOUNDARY) -#define FUNCTION_BOUNDARY ((TARGET_THUMB && optimize_size) ? 16 : 32) +#define FUNCTION_BOUNDARY (TARGET_THUMB ? 16 : 32) /* The lowest bit is used to indicate Thumb-mode functions, so the vbit must go into the delta field of pointers to member diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3d5ad170ac9..8701cb44988 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-10-16 Christian Bruel + + PR target/67745 + * gcc.target/arm/no-align.c: New test. + * gcc.target/arm/attr-align1.c: New test. + * gcc.target/arm/attr-align2.c: New test. + * gcc.target/arm/attr-align3.c: New test. + 2015-10-11 Jan Hubicka * gcc.c-torture/compile/icfmatch.c: Add testcase diff --git a/gcc/testsuite/gcc.target/arm/attr-align1.c b/gcc/testsuite/gcc.target/arm/attr-align1.c new file mode 100644 index 00000000000..96d29a9eed5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/attr-align1.c @@ -0,0 +1,27 @@ +/* PR target/67745 + Verify alignment when both attribute optimize and target are used. */ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */ + +void +__attribute__ ((target ("arm"))) +bar() +{ +} + +void +__attribute__ ((target ("thumb"))) +__attribute__ ((optimize ("Os"))) +foo() +{ +} + +void +__attribute__ ((target ("thumb"))) +__attribute__ ((optimize ("O2"))) +rab() +{ +} + +/* { dg-final { scan-assembler-times ".align\[ \t]2" 2 } } */ +/* { dg-final { scan-assembler ".align\[ \t]1" } } */ diff --git a/gcc/testsuite/gcc.target/arm/attr-align2.c b/gcc/testsuite/gcc.target/arm/attr-align2.c new file mode 100644 index 00000000000..2086f112e43 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/attr-align2.c @@ -0,0 +1,15 @@ +/* PR target/67745 + Verify alignment when attribute optimize is used. */ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */ +/* { dg-options "-O2 -mthumb" } */ + +/* Check that thumb code is always 2 bytes aligned for -Os. */ + +void +__attribute__ ((optimize("Os"))) +foo() +{ +} + +/* { dg-final { scan-assembler ".align\[ \t]1" } } */ diff --git a/gcc/testsuite/gcc.target/arm/attr-align3.c b/gcc/testsuite/gcc.target/arm/attr-align3.c new file mode 100644 index 00000000000..edcf64b45e0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/attr-align3.c @@ -0,0 +1,13 @@ +/* PR target/67745 + Verify alignment when attribute target is used. */ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */ +/* { dg-options "-Os -mthumb" } */ + +/* Check that arm code is always 4 bytes aligned. */ +void __attribute__ ((target ("arm"))) +c(void) +{ +} + +/* { dg-final { scan-assembler-not ".align\[ \t]1" } } */ diff --git a/gcc/testsuite/gcc.target/arm/no-align.c b/gcc/testsuite/gcc.target/arm/no-align.c new file mode 100644 index 00000000000..03811c34582 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/no-align.c @@ -0,0 +1,12 @@ +/* PR target/67745 + Verify that -mthumb code is not aligned. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mthumb -fno-align-functions" } */ +/* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */ + +void +foo() +{ +} + +/* { dg-final { scan-assembler-not ".align\[ \t]2" } } */ -- 2.30.2