aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2017-12-07 14:54:22 +0000
committerTamar Christina <tnfchris@gcc.gnu.org>2017-12-07 14:54:22 +0000
commit1d8b0222b15f2188b659de4a731d8fd5ea23bed0 (patch)
treefe2fe58d70ea116377d7bd4621ca28e15299aff3 /gcc/config
parent1cc521f1a824b5913aeda06ebe296de98f2d9453 (diff)
downloadgcc-1d8b0222b15f2188b659de4a731d8fd5ea23bed0.zip
gcc-1d8b0222b15f2188b659de4a731d8fd5ea23bed0.tar.gz
gcc-1d8b0222b15f2188b659de4a731d8fd5ea23bed0.tar.bz2
re PR target/82641 (Unable to enable crc32 for a certain function with target attribute on ARM (aarch32))
2017-12-07 Tamar Christina <tamar.christina@arm.com> PR target/82641 * config/arm/arm.c (INCLUDE_STRING): Define. (arm_last_printed_arch_string, arm_last_printed_fpu_string): New. (arm_declare_function_name): Conservatively emit .arch, .arch_extensions and .fpu. gcc/testsuite/ 2017-12-07 Tamar Christina <tamar.christina@arm.com> PR target/82641 * gcc.target/arm/pragma_arch_attribute_2.c: New. * gcc.target/arm/pragma_arch_attribute_2.c: New. * gcc.target/arm/pragma_arch_attribute_3.c: New. * gcc.target/arm/pragma_fpu_attribute.c: New. * gcc.target/arm/pragma_fpu_attribute_2.c: New. From-SVN: r255468
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/arm/arm.c62
1 files changed, 58 insertions, 4 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 64dc8cd..b986377 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -21,6 +21,7 @@
<http://www.gnu.org/licenses/>. */
#include "config.h"
+#define INCLUDE_STRING
#include "system.h"
#include "coretypes.h"
#include "backend.h"
@@ -30956,9 +30957,57 @@ arm_identify_fpu_from_isa (sbitmap isa)
gcc_unreachable ();
}
+/* The last .arch and .fpu assembly strings that we printed. */
+static std::string arm_last_printed_arch_string;
+static std::string arm_last_printed_fpu_string;
+
+/* Implement ASM_DECLARE_FUNCTION_NAME. Output the ISA features used
+ by the function fndecl. */
void
arm_declare_function_name (FILE *stream, const char *name, tree decl)
{
+ tree target_parts = DECL_FUNCTION_SPECIFIC_TARGET (decl);
+
+ struct cl_target_option *targ_options;
+ if (target_parts)
+ targ_options = TREE_TARGET_OPTION (target_parts);
+ else
+ targ_options = TREE_TARGET_OPTION (target_option_current_node);
+ gcc_assert (targ_options);
+
+ /* Only update the assembler .arch string if it is distinct from the last
+ such string we printed. */
+ std::string arch_to_print = targ_options->x_arm_arch_string;
+ if (arch_to_print != arm_last_printed_arch_string)
+ {
+ std::string arch_name
+ = arch_to_print.substr (0, arch_to_print.find ("+"));
+ asm_fprintf (asm_out_file, "\t.arch %s\n", arch_name.c_str ());
+ const arch_option *arch
+ = arm_parse_arch_option_name (all_architectures, "-march",
+ targ_options->x_arm_arch_string);
+ auto_sbitmap opt_bits (isa_num_bits);
+
+ gcc_assert (arch);
+ if (arch->common.extensions)
+ {
+ for (const struct cpu_arch_extension *opt = arch->common.extensions;
+ opt->name != NULL;
+ opt++)
+ {
+ if (!opt->remove)
+ {
+ arm_initialize_isa (opt_bits, opt->isa_bits);
+ if (bitmap_subset_p (opt_bits, arm_active_target.isa)
+ && !bitmap_subset_p (opt_bits, isa_all_fpubits))
+ asm_fprintf (asm_out_file, "\t.arch_extension %s\n",
+ opt->name);
+ }
+ }
+ }
+
+ arm_last_printed_arch_string = arch_to_print;
+ }
fprintf (stream, "\t.syntax unified\n");
@@ -30976,10 +31025,15 @@ arm_declare_function_name (FILE *stream, const char *name, tree decl)
else
fprintf (stream, "\t.arm\n");
- asm_fprintf (asm_out_file, "\t.fpu %s\n",
- (TARGET_SOFT_FLOAT
- ? "softvfp"
- : arm_identify_fpu_from_isa (arm_active_target.isa)));
+ std::string fpu_to_print
+ = TARGET_SOFT_FLOAT
+ ? "softvfp" : arm_identify_fpu_from_isa (arm_active_target.isa);
+
+ if (fpu_to_print != arm_last_printed_arch_string)
+ {
+ asm_fprintf (asm_out_file, "\t.fpu %s\n", fpu_to_print.c_str ());
+ arm_last_printed_fpu_string = fpu_to_print;
+ }
if (TARGET_POKE_FUNCTION_NAME)
arm_poke_function_name (stream, (const char *) name);