On 18/05/15 09:14, Christian Bruel wrote:
Hi,
Hi Christian,
A couple comments inline.
Overall, the approach looks ok to me, though I think we'll have to
generalise arm_valid_target_attribute_rec in the future if we want
to allow other target attributes.
Thanks,
Kyrill
Here is again a new version for patch [4/6]: (Implements and document
the hooks to support target_attributes.)
- Rewrote for conflicts introduced by the new macros defined in
https://gcc.gnu.org/ml/gcc-patches/2015-05/msg01198.html
- Take your comments and Sandra's for documentation
- I'd like to leave the inlining question apart with its own patch
until we settle it. Is it OK with you ?
https://gcc.gnu.org/ml/gcc-patches/2015-05/msg01527.html
many thanks,
Christian
p4.patch
2014-09-23 Christian Bruel<christian.br...@st.com>
* config/arm/arm.opt (THUMB, arm_restrict_it, inline_asm_unified): Save.
* config/arm/arm.h (arm_valid_target_attribute_tree): Declare.
(arm_reset_previous_fndecl, arm_change_mode_p): Likewise.
(SWITCHABLE_TARGET): Define.
* config/arm/arm.c (arm_reset_previous_fndecl): New functions.
(arm_valid_target_attribute_tree, arm_change_mode_p): Likewise.
(arm_valid_target_attribute_p): Likewise.
(arm_set_current_function, arm_can_inline_p): Likewise.
(arm_valid_target_attribute_rec): Likewise.
(arm_previous_fndecl): New variable.
(TARGET_SET_CURRENT_FUNCTION, TARGET_OPTION_VALID_ATTRIBUTE_P): Define.
(TARGET_CAN_INLINE_P): Define.
(arm_asm_trampoline_template): Emit mode.
(arm_file_start): Don't set unified syntax.
(arm_declare_function_name): Set unified syntax and mode.
(arm_option_override): Init target_option_default_node.
and target_option_current_node.
* config/arm/arm.md (*call_value_symbol): Set mode when possible.
(*call_symbol): Likewise.
* doc/extend.texi: Document ARM/Thumb target attribute.
* doc/invoke.texi: Likewise.
2014-09-23 Christian Bruel<christian.br...@st.com>
* gcc.target/arm/attr_arm.c: New test
* gcc.target/arm/attr_arm-err.c: New test
* gcc.target/arm/attr_thumb.c: New test
* gcc.target/arm/attr_thumb-static.c: New test
Full stops at end of "New test"
<snip>
+/* Check that FUNC is called with a different mode. */
+
+bool
+arm_change_mode_p (tree func)
+{
+ if (TREE_CODE (func) != FUNCTION_DECL)
+ return false;
+
+ tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (func);
+
+ if (!callee_tree)
+ callee_tree = target_option_default_node;
+
+ struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree);
+ int flags = callee_opts ->x_target_flags;
No space after callee_opts.
<snip>
+/* Remember the last target of arm_set_current_function. */
+static GTY(()) tree arm_previous_fndecl;
+
+/* Invalidate arm_previous_fndecl. */
+void
+arm_reset_previous_fndecl (void)
+{
+ arm_previous_fndecl = NULL_TREE;
+}
+
+/* Establish appropriate back-end context for processing the function
+ FNDECL. The argument might be NULL to indicate processing at top
+ level, outside of any function scope. */
+static void
+arm_set_current_function (tree fndecl)
+{
+ if (!fndecl || fndecl == arm_previous_fndecl)
+ return;
+
+ tree old_tree = (arm_previous_fndecl
+ ? DECL_FUNCTION_SPECIFIC_TARGET (arm_previous_fndecl)
+ : NULL_TREE);
+
+ tree new_tree = DECL_FUNCTION_SPECIFIC_TARGET (fndecl);
+
+ arm_previous_fndecl = fndecl;
+ if (old_tree == new_tree)
+ ;
+
+ else if (new_tree)
+ {
+ cl_target_option_restore (&global_options,
+ TREE_TARGET_OPTION (new_tree));
+
+ if (TREE_TARGET_GLOBALS (new_tree))
+ restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
+ else
+ TREE_TARGET_GLOBALS (new_tree)
+ = save_target_globals_default_opts ();
+ }
+
+ else if (old_tree)
+ {
+ new_tree = target_option_current_node;
+
+ cl_target_option_restore (&global_options,
+ TREE_TARGET_OPTION (new_tree));
+ if (TREE_TARGET_GLOBALS (new_tree))
+ restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
+ else if (new_tree == target_option_default_node)
+ restore_target_globals (&default_target_globals);
+ else
+ TREE_TARGET_GLOBALS (new_tree)
+ = save_target_globals_default_opts ();
+ }
+
+ arm_option_params_internal (&global_options);
I thought the more common approach was to define TARGET_OPTION_RESTORE
that was supposed to restore the backend state, including calling
arm_option_params_internal?
That way, cl_target_option_restore would do all that needs to be done to
restore the backend.
<snip>
diff '--exclude=.svn' -ruN
gnu_trunk.p2/gcc/gcc/testsuite/gcc.target/arm/attr_arm.c
gnu_trunk.p4/gcc/gcc/testsuite/gcc.target/arm/attr_arm.c
--- gnu_trunk.p2/gcc/gcc/testsuite/gcc.target/arm/attr_arm.c 1970-01-01
01:00:00.000000000 +0100
+++ gnu_trunk.p4/gcc/gcc/testsuite/gcc.target/arm/attr_arm.c 2015-05-07
18:15:34.177443930 +0200
@@ -0,0 +1,13 @@
+/* Check that attribute target arm is recogniwed. */
s/recogniwed/recognized/
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_arm_ok } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler ".arm" } } */
+/* { dg-final { scan-assembler-not "ite" } } */
+
+int __attribute__((target("arm")))
+foo(int a)
+{
+ return a ? 1 : 5;
+}
+
diff '--exclude=.svn' -ruN
gnu_trunk.p2/gcc/gcc/testsuite/gcc.target/arm/attr_arm-err.c
gnu_trunk.p4/gcc/gcc/testsuite/gcc.target/arm/attr_arm-err.c
--- gnu_trunk.p2/gcc/gcc/testsuite/gcc.target/arm/attr_arm-err.c
1970-01-01 01:00:00.000000000 +0100
+++ gnu_trunk.p4/gcc/gcc/testsuite/gcc.target/arm/attr_arm-err.c
2015-05-07 18:15:34.177443930 +0200
@@ -0,0 +1,13 @@
+/* Check that attribute target arm is rejected for M profile. */
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_arm_ok } */
+/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } {
"-march=armv6-m" } } */
+/* { dg-add-options arm_arch_v6m } */
+
+int __attribute__((target("arm")))
+foo(int a)
+{ /* { dg-error "does not support" } */
+ return a ? 1 : 5;
+}
+
+
diff '--exclude=.svn' -ruN
gnu_trunk.p2/gcc/gcc/testsuite/gcc.target/arm/attr_thumb.c
gnu_trunk.p4/gcc/gcc/testsuite/gcc.target/arm/attr_thumb.c
--- gnu_trunk.p2/gcc/gcc/testsuite/gcc.target/arm/attr_thumb.c 1970-01-01
01:00:00.000000000 +0100
+++ gnu_trunk.p4/gcc/gcc/testsuite/gcc.target/arm/attr_thumb.c 2015-05-07
18:15:34.177443930 +0200
@@ -0,0 +1,13 @@
+/* Check that attribute target thumb is recogniwed. */
s/recogniwed/recognized/