re PR target/82641 (Unable to enable crc32 for a certain function with target attribu...
authorTamar Christina <tamar.christina@arm.com>
Tue, 6 Feb 2018 11:20:55 +0000 (11:20 +0000)
committerTamar Christina <tnfchris@gcc.gnu.org>
Tue, 6 Feb 2018 11:20:55 +0000 (11:20 +0000)
2018-02-06  Tamar Christina  <tamar.christina@arm.com>

PR target/82641
* config/arm/arm.c (arm_print_asm_arch_directives): Record already
emitted arch directives.
* config/arm/arm-c.c (arm_cpu_builtins): Undefine __ARM_ARCH and
__ARM_FEATURE_COPROC before changing architectures.

gcc/testsuite
2018-02-06  Tamar Christina  <tamar.christina@arm.com>

PR target/82641
* gcc.target/arm/pragma_arch_switch_2.c: New.

From-SVN: r257410

gcc/ChangeLog
gcc/config/arm/arm-c.c
gcc/config/arm/arm.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pragma_arch_switch_2.c [new file with mode: 0644]

index 8785b5796037b12fca78382d1e7bea96dd2a2421..b52060946e0c105222ef0dca203393bf4a30d89f 100644 (file)
@@ -1,3 +1,11 @@
+2018-02-06  Tamar Christina  <tamar.christina@arm.com>
+
+       PR target/82641
+       * config/arm/arm.c (arm_print_asm_arch_directives): Record already
+       emitted arch directives.
+       * config/arm/arm-c.c (arm_cpu_builtins): Undefine __ARM_ARCH and
+       __ARM_FEATURE_COPROC before changing architectures.
+
 2018-02-06  Richard Biener  <rguenther@suse.de>
 
        * config/i386/i386.c (print_reg): Fix typo.
index 486cbd132974aba6ac12fa221ed7322d8d54039d..9a16172f1d8af1a2fb3f24b758650e16ff6e810a 100644 (file)
@@ -113,7 +113,10 @@ arm_cpu_builtins (struct cpp_reader* pfile)
      consistency with armcc.  */
   builtin_define ("__arm__");
   if (TARGET_ARM_ARCH)
-    builtin_define_with_int_value ("__ARM_ARCH", TARGET_ARM_ARCH);
+    {
+      cpp_undef (pfile, "__ARM_ARCH");
+      builtin_define_with_int_value ("__ARM_ARCH", TARGET_ARM_ARCH);
+    }
   if (arm_arch_notm)
     builtin_define ("__ARM_ARCH_ISA_ARM");
   builtin_define ("__APCS_32__");
@@ -204,6 +207,7 @@ arm_cpu_builtins (struct cpp_reader* pfile)
 
   def_or_undef_macro (pfile, "__ARM_ASM_SYNTAX_UNIFIED__", inline_asm_unified);
 
+  cpp_undef (pfile, "__ARM_FEATURE_COPROC");
   if (TARGET_32BIT && arm_arch4 && !(arm_arch8 && arm_arch_notm))
     {
       int coproc_level = 0x1;
@@ -217,8 +221,6 @@ arm_cpu_builtins (struct cpp_reader* pfile)
 
       builtin_define_with_int_value ("__ARM_FEATURE_COPROC", coproc_level);
     }
-  else
-      cpp_undef (pfile, "__ARM_FEATURE_COPROC");
 }
 
 void
index 978c44af327b6769c161eeee20ca08300e41d033..17feba46619c2ff729ec81520b516fb616ffcb11 100644 (file)
 typedef struct minipool_node    Mnode;
 typedef struct minipool_fixup   Mfix;
 
+/* 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;
+
 void (*arm_lang_output_object_attributes_hook)(void);
 
 struct four_ints
@@ -26390,6 +26394,7 @@ arm_print_asm_arch_directives ()
   gcc_assert (arch);
 
   asm_fprintf (asm_out_file, "\t.arch %s\n", arm_active_target.arch_name);
+  arm_last_printed_arch_string = arm_active_target.arch_name;
   if (!arch->common.extensions)
     return;
 
@@ -26437,13 +26442,17 @@ arm_file_start (void)
              asm_fprintf (asm_out_file, "\t.arch_extension idiv\n");
              asm_fprintf (asm_out_file, "\t.arch_extension sec\n");
              asm_fprintf (asm_out_file, "\t.arch_extension mp\n");
+             arm_last_printed_arch_string = "armv7ve";
            }
          else
            arm_print_asm_arch_directives ();
        }
       else if (strncmp (arm_active_target.core_name, "generic", 7) == 0)
-       asm_fprintf (asm_out_file, "\t.arch %s\n",
-                    arm_active_target.core_name + 8);
+       {
+         asm_fprintf (asm_out_file, "\t.arch %s\n",
+                      arm_active_target.core_name + 8);
+         arm_last_printed_arch_string = arm_active_target.core_name + 8;
+       }
       else
        {
          const char* truncated_name
@@ -30934,10 +30943,6 @@ 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
index 8fed491f5f04f6a9136eea33c8ba1b6b6bfbdc5d..bdec47bb9612e7e4d2781f07f21d9558986578b7 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-06  Tamar Christina  <tamar.christina@arm.com>
+
+       PR target/82641
+       * gcc.target/arm/pragma_arch_switch_2.c: New.
+
 2018-02-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR target/79975
diff --git a/gcc/testsuite/gcc.target/arm/pragma_arch_switch_2.c b/gcc/testsuite/gcc.target/arm/pragma_arch_switch_2.c
new file mode 100644 (file)
index 0000000..fe52191
--- /dev/null
@@ -0,0 +1,17 @@
+/* Test for switching architectures during compilation.  */
+/* { dg-skip-if "instruction not valid on thumb" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_arm_ok } */
+/* { dg-additional-options "-Wall -O2 -march=armv4t -std=gnu99 -marm" } */
+
+#pragma GCC target ("arch=armv5te")
+void cpu_has_iwmmxt (void)
+{
+   int lo;
+   int hi;
+   __asm__ __volatile__ (
+      "mcrr   p0, 0, %2, %3, c0\n"
+      : "=r" (lo), "=r" (hi)
+      : "r" (0), "r" (0x100));
+}
+