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
This commit is contained in:
parent
1628e36bcf
commit
e65530503a
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
||||
|
24
gcc/testsuite/gcc.target/arm/flip-thumb.c
Normal file
24
gcc/testsuite/gcc.target/arm/flip-thumb.c
Normal file
@ -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 } } } } */
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user