diff options
author | Christian Bruel <christian.bruel@st.com> | 2015-06-22 09:32:15 +0200 |
---|---|---|
committer | Christian Bruel <chrbr@gcc.gnu.org> | 2015-06-22 09:32:15 +0200 |
commit | e65530503a4bc35f009c8f6afdfd01d6ab13383f (patch) | |
tree | d66f77f31f9b2697a0441ff1de7eec1d80e41c70 | |
parent | 1628e36bcf93a88d29885dd4e47e44ba80f909c6 (diff) | |
download | gcc-e65530503a4bc35f009c8f6afdfd01d6ab13383f.zip gcc-e65530503a4bc35f009c8f6afdfd01d6ab13383f.tar.gz gcc-e65530503a4bc35f009c8f6afdfd01d6ab13383f.tar.bz2 |
Add -mflip-thumb for testing.
PR target/52144n
* config/arm/arm.c (add_attribute, arm_insert_attributes): New functions
(TARGET_INSERT_ATTRIBUTES): Define.
(thumb_flipper): New var.
* config/arm/arm.opt (-mflip-thumb): New switch.
PR target/52144
* gcc.target/arm/flip-thumb.c: New test.
From-SVN: r224721
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 58 | ||||
-rw-r--r-- | gcc/config/arm/arm.opt | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/flip-thumb.c | 24 |
5 files changed, 98 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0bcee8..b968069 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-06-22 Christian Bruel <christian.bruel@st.com> + + * config/arm/arm.c (add_attribute, arm_insert_attributes): New functions + (TARGET_INSERT_ATTRIBUTES): Define. + (thumb_flipper): New var. + * config/arm/arm.opt (-mflip-thumb): New switch. + 2015-06-22 Jan Hubicka <hubicka@ucw.cz> Martin Liska <mliska@suse.cz> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index e79a369..ced4231 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -84,6 +84,7 @@ #include "tm-constrs.h" #include "rtl-iter.h" #include "sched-int.h" +#include "tree.h" /* Forward definitions of types. */ typedef struct minipool_node Mnode; @@ -218,6 +219,7 @@ static void arm_encode_section_info (tree, rtx, int); static void arm_file_end (void); static void arm_file_start (void); +static void arm_insert_attributes (tree, tree *); static void arm_setup_incoming_varargs (cumulative_args_t, machine_mode, tree, int *, int); @@ -376,6 +378,9 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_ATTRIBUTE_TABLE #define TARGET_ATTRIBUTE_TABLE arm_attribute_table +#undef TARGET_INSERT_ATTRIBUTES +#define TARGET_INSERT_ATTRIBUTES arm_insert_attributes + #undef TARGET_ASM_FILE_START #define TARGET_ASM_FILE_START arm_file_start #undef TARGET_ASM_FILE_END @@ -2792,6 +2797,10 @@ arm_option_params_internal (struct gcc_options *opts) ? 1 : current_tune->max_insns_skipped; } +/* True if -mflip-thumb should next add an attribute for the default + mode, false if it should next add an attribute for the opposite mode. */ +static GTY(()) bool thumb_flipper; + /* Options after initial target override. */ static GTY(()) tree init_optimize; @@ -3369,6 +3378,9 @@ arm_option_override (void) options. */ target_option_default_node = target_option_current_node = build_target_option_node (&global_options); + + /* Init initial mode for testing. */ + thumb_flipper = TARGET_THUMB; } static void @@ -29459,6 +29471,52 @@ arm_valid_target_attribute_tree (tree args, struct gcc_options *opts, return build_target_option_node (opts); } +static void +add_attribute (const char * mode, tree *attributes) +{ + size_t len = strlen (mode); + tree value = build_string (len, mode); + + TREE_TYPE (value) = build_array_type (char_type_node, + build_index_type (size_int (len))); + + *attributes = tree_cons (get_identifier ("target"), + build_tree_list (NULL_TREE, value), + *attributes); +} + +/* For testing. Insert thumb or arm modes alternatively on functions. */ + +static void +arm_insert_attributes (tree fndecl, tree * attributes) +{ + const char *mode; + + if (! TARGET_FLIP_THUMB) + return; + + if (TREE_CODE (fndecl) != FUNCTION_DECL || DECL_EXTERNAL(fndecl) + || DECL_BUILT_IN (fndecl) || DECL_ARTIFICIAL (fndecl)) + return; + + /* Nested definitions must inherit mode. */ + if (current_function_decl) + { + mode = TARGET_THUMB ? "thumb" : "arm"; + add_attribute (mode, attributes); + return; + } + + /* If there is already a setting don't change it. */ + if (lookup_attribute ("target", *attributes) != NULL) + return; + + mode = thumb_flipper ? "thumb" : "arm"; + add_attribute (mode, attributes); + + thumb_flipper = !thumb_flipper; +} + /* Hook to validate attribute((target("string"))). */ static bool diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt index 59e5385..c9095b9 100644 --- a/gcc/config/arm/arm.opt +++ b/gcc/config/arm/arm.opt @@ -122,6 +122,10 @@ Enum(float_abi_type) String(softfp) Value(ARM_FLOAT_ABI_SOFTFP) EnumValue Enum(float_abi_type) String(hard) Value(ARM_FLOAT_ABI_HARD) +mflip-thumb +Target Report Var(TARGET_FLIP_THUMB) Undocumented +Switch ARM/Thumb modes on alternating functions for compiler testing + mfp16-format= Target RejectNegative Joined Enum(arm_fp16_format_type) Var(arm_fp16_format) Init(ARM_FP16_FORMAT_NONE) Specify the __fp16 floating-point format diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0e33302..666acc1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-22 Christian Bruel <christian.bruel@st.com> + + PR target/52144 + * gcc.target/arm/flip-thumb.c: New test. + 2015-06-22 Jan Hubicka <hubicka@ucw.cz> Martin Liska <mliska@suse.cz> diff --git a/gcc/testsuite/gcc.target/arm/flip-thumb.c b/gcc/testsuite/gcc.target/arm/flip-thumb.c new file mode 100644 index 0000000..05f6bb7 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/flip-thumb.c @@ -0,0 +1,24 @@ +/* Check -mflip-thumb. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mflip-thumb -mno-restrict-it" } */ +/* { dg-final { scan-assembler ".arm" } } */ +/* { dg-final { scan-assembler-times ".thumb_func" 1} } */ + +int +foo(int a) +{ + return a ? 1 : 5; +} + +int +bar(int a) +{ + return a ? 1 : 5; +} + +/* { dg-final { scan-assembler-times "ite" 1 { target { arm_thumb2_ok } } } } */ + + + + + |