re PR target/67745 ([ARM] wrong alignments when __attribute__ ((optimize,target,align...
authorChristian Bruel <christian.bruel@st.com>
Fri, 16 Oct 2015 13:52:51 +0000 (15:52 +0200)
committerChristian Bruel <chrbr@gcc.gnu.org>
Fri, 16 Oct 2015 13:52:51 +0000 (15:52 +0200)
2015-10-16  Christian Bruel  <christian.bruel@st.com>

  PR target/67745
  * config/arm/arm.h (FUNCTION_BOUNDARY): Use FUNCTION_BOUNDARY_P.
  (FUNCTION_BOUNDARY_P): New macro:
  * config/arm/arm.c (TARGET_RELAYOUT_FUNCTION, arm_relayout_function):
  New hook.
  * doc/tm.texi.in (TARGET_RELAYOUT_FUNCTION): Document.
  * doc/tm.texi (TARGET_RELAYOUT_FUNCTION): New hook.
  * gcc/target.def (TARGET_RELAYOUT_FUNCTION): Likewise.
  * gcc/function.c (allocate_struct_function): Call relayout_function hook.
  * gcc/passes.c (rest_of_decl_compilation): Likewise.

From-SVN: r228912

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.h
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/function.c
gcc/passes.c
gcc/target.def

index 24deaaccef39a9a78301f9de4e75db928a7a6bc8..fe2d8ce67b114b044cebf8bb1f0948966c0d9bbf 100644 (file)
@@ -1,3 +1,16 @@
+2015-10-16  Christian Bruel  <christian.bruel@st.com>
+
+       PR target/67745
+       * config/arm/arm.h (FUNCTION_BOUNDARY): Use FUNCTION_BOUNDARY_P.
+       (FUNCTION_BOUNDARY_P): New macro:
+       * config/arm/arm.c (TARGET_RELAYOUT_FUNCTION, arm_relayout_function): 
+       New hook.
+       * doc/tm.texi.in (TARGET_RELAYOUT_FUNCTION): Document.
+       * doc/tm.texi (TARGET_RELAYOUT_FUNCTION): New hook.
+       * gcc/target.def (TARGET_RELAYOUT_FUNCTION): Likewise.
+       * gcc/function.c (allocate_struct_function): Call relayout_function hook.
+       * gcc/passes.c (rest_of_decl_compilation): Likewise.
+
 2015-10-16  Christian Bruel  <christian.bruel@st.com>
 
        PR target/67745
index 2c8215cb5133ef63f6b40185284728ae2aab17a6..b80ec08512af829cc4dede6f195dd160b6f9145c 100644 (file)
@@ -250,6 +250,7 @@ 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);
+static void arm_relayout_function (tree);
 static bool arm_valid_target_attribute_p (tree, tree, tree, int);
 static unsigned HOST_WIDE_INT arm_shift_truncation_mask (machine_mode);
 static bool arm_macro_fusion_p (void);
@@ -405,6 +406,9 @@ static const struct attribute_spec arm_attribute_table[] =
 #undef TARGET_CAN_INLINE_P
 #define TARGET_CAN_INLINE_P arm_can_inline_p
 
+#undef TARGET_RELAYOUT_FUNCTION
+#define TARGET_RELAYOUT_FUNCTION arm_relayout_function
+
 #undef  TARGET_OPTION_OVERRIDE
 #define TARGET_OPTION_OVERRIDE arm_option_override
 
@@ -29825,6 +29829,23 @@ arm_can_inline_p (tree caller ATTRIBUTE_UNUSED, tree callee ATTRIBUTE_UNUSED)
   return true;
 }
 
+/* Hook to fix function's alignment affected by target attribute.  */
+
+static void
+arm_relayout_function (tree fndecl)
+{
+  if (DECL_USER_ALIGN (fndecl))
+    return;
+
+  tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
+
+  if (!callee_tree)
+    callee_tree = target_option_default_node;
+
+  DECL_ALIGN (fndecl) =
+    FUNCTION_BOUNDARY_P (TREE_TARGET_OPTION (callee_tree)->x_target_flags);
+}
+
 /* Inner function to process the attribute((target(...))), take an argument and
    set the current options from the argument.  If we have a list, recursively
    go over the list.  */
index 9715969a5e560135629d114535c69962354d1173..585bd1d95f37fba65dec1d8b99e7a9392299a603 100644 (file)
@@ -565,7 +565,8 @@ extern int arm_arch_crc;
 #define PREFERRED_STACK_BOUNDARY \
     (arm_abi == ARM_ABI_ATPCS ? 64 : STACK_BOUNDARY)
 
-#define FUNCTION_BOUNDARY           (TARGET_THUMB ? 16 : 32)
+#define FUNCTION_BOUNDARY_P(flags)  (TARGET_THUMB_P (flags) ? 16 : 32)
+#define FUNCTION_BOUNDARY           (FUNCTION_BOUNDARY_P (target_flags))
 
 /* The lowest bit is used to indicate Thumb-mode functions, so the
    vbit must go into the delta field of pointers to member
index d09e6461683a1ae25ab9bcd2531be9706053897e..731e63043f3af2203cf80d27c315e922fe4382a5 100644 (file)
@@ -9985,6 +9985,10 @@ default, inlining is not allowed if the callee function has function
 specific target options and the caller does not use the same options.
 @end deftypefn
 
+@deftypefn {Target Hook} void TARGET_RELAYOUT_FUNCTION (tree @var{fndecl})
+This target hook fixes function @var{fndecl} after attributes are processed. Default does nothing. On ARM, the default function's alignment is updated with the attribute target.
+@end deftypefn
+
 @node Emulated TLS
 @section Emulating TLS
 @cindex Emulated TLS
index 33939ec77f4d32bb2e8c8faff7f10e5940c18e55..0b52250d372192420456d3ff9b86647f1006af16 100644 (file)
@@ -7274,6 +7274,8 @@ on this implementation detail.
 
 @hook TARGET_CAN_INLINE_P
 
+@hook TARGET_RELAYOUT_FUNCTION
+
 @node Emulated TLS
 @section Emulating TLS
 @cindex Emulated TLS
index db5bc1c475439f43433766ba737d4eaadfea56c2..f7742148cfb7b7a8d7557636661d3e9a15bfd2cf 100644 (file)
@@ -4840,6 +4840,9 @@ allocate_struct_function (tree fndecl, bool abstract_p)
          for (tree parm = DECL_ARGUMENTS (fndecl); parm;
               parm = DECL_CHAIN (parm))
            relayout_decl (parm);
+
+         /* Similarly relayout the function decl.  */
+         targetm.target_option.relayout_function (fndecl);
        }
 
       if (!abstract_p && aggregate_value_p (result, fndecl))
index 5b41102e04f126b19f276ec1267cc28c607ca1be..6ef6d2e50ff6994cf39de7173097be928b1f4160 100644 (file)
@@ -253,6 +253,11 @@ rest_of_decl_compilation (tree decl,
        }
 #endif
 
+      /* Now that we have activated any function-specific attributes
+        that might affect function decl, particularly align, relayout it.  */
+      if (TREE_CODE (decl) == FUNCTION_DECL)
+       targetm.target_option.relayout_function (decl);
+
       timevar_pop (TV_VARCONST);
     }
   else if (TREE_CODE (decl) == TYPE_DECL
index d29aad5c3f89805c8ee882934b5645c12621fce0..694e455f570056fbda6a0a168ad1e235230022bc 100644 (file)
@@ -5620,6 +5620,12 @@ specific target options and the caller does not use the same options.",
  bool, (tree caller, tree callee),
  default_target_can_inline_p)
 
+DEFHOOK
+(relayout_function,
+"This target hook fixes function @var{fndecl} after attributes are processed. Default does nothing. On ARM, the default function's alignment is updated with the attribute target.",
+ void, (tree fndecl),
+ hook_void_tree)
+
 HOOK_VECTOR_END (target_option)
 
 /* For targets that need to mark extra registers as live on entry to