[arm] Allow new extended syntax CPU and architecture
authorRichard Earnshaw <rearnsha@arm.com>
Fri, 16 Jun 2017 21:03:46 +0000 (21:03 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Fri, 16 Jun 2017 21:03:46 +0000 (21:03 +0000)
This patch extends support for the new extended-style architecture
strings to configure and the target default options.  We validate any
options passed by the user to configure against the permitted
extensions for that CPU or architecture.

* config.gcc (arm*-*-fucshia*): Set target_cpu_cname to the real
cpu name.
(arm*-*-*): Set target_cpu_default2 to a quoted string.
* config/arm/parsecpu.awk (check_cpu): Validate any extension
options.
(check_arch): Likewise.
* config/arm/arm.c (arm_configure_build_target): Handle
TARGET_CPU_DEFAULT being a string constant.  Scan any feature
options in the default.

From-SVN: r249290

gcc/ChangeLog
gcc/config.gcc
gcc/config/arm/arm.c
gcc/config/arm/parsecpu.awk

index 2764dda5aba6226725c0f81d010a8285f8d7e5b3..3299cdea1ac603fef7a3acc1bbd7860f9a9e730e 100644 (file)
@@ -1,3 +1,15 @@
+2017-06-16  Richard Earnshaw  <rearnsha@arm.com>
+
+       * config.gcc (arm*-*-fucshia*): Set target_cpu_cname to the real
+       cpu name.
+       (arm*-*-*): Set target_cpu_default2 to a quoted string.
+       * config/arm/parsecpu.awk (check_cpu): Validate any extension
+       options.
+       (check_arch): Likewise.
+       * config/arm/arm.c (arm_configure_build_target): Handle
+       TARGET_CPU_DEFAULT being a string constant.  Scan any feature
+       options in the default.
+
 2017-06-16  Richard Earnshaw  <rearnsha@arm.com>
 
        * config/arm/arm-protos.h (cpu_arch_extension): Add field to record
index 8b00e663a53bf6c632169c4c1e889647a52391ac..620a5b2360e69339b48e533441acb36685aa870a 100644 (file)
@@ -1161,7 +1161,7 @@ arm*-*-eabi* | arm*-*-symbianelf* | arm*-*-rtems* | arm*-*-fuchsia*)
        arm*-*-fuchsia*)
          tm_file="${tm_file} fuchsia.h arm/fuchsia-elf.h glibc-stdint.h"
          tmake_file="${tmake_file} arm/t-bpabi"
-         target_cpu_cname="genericv7a"
+         target_cpu_cname="generic-armv7-a"
          ;;
        arm*-*-rtems*)
          tm_file="${tm_file} rtems.h arm/rtems.h newlib-stdint.h"
@@ -4496,9 +4496,9 @@ case ${target} in
        arm*-*-*)
                if test x$target_cpu_cname = x
                then
-                       target_cpu_default2=TARGET_CPU_arm6
+                       target_cpu_default2="\\\"arm6\\\""
                else
-                       target_cpu_default2=TARGET_CPU_$target_cpu_cname
+                       target_cpu_default2="\\\"$target_cpu_cname\\\""
                fi
                ;;
 
index 55ea22e75f472310683a96c1f3b5bd5f054731a6..9e857a2b011d89b21c98bda7a3cfefd0d7664d7b 100644 (file)
@@ -3143,7 +3143,9 @@ arm_configure_build_target (struct arm_build_target *target,
       bitmap_clear (sought_isa);
       auto_sbitmap default_isa (isa_num_bits);
 
-      arm_selected_cpu = &all_cores[TARGET_CPU_DEFAULT];
+      arm_selected_cpu = arm_parse_cpu_option_name (all_cores, "default CPU",
+                                                   TARGET_CPU_DEFAULT);
+      cpu_opts = strchr (TARGET_CPU_DEFAULT, '+');
       gcc_assert (arm_selected_cpu->common.name);
 
       /* RWE: All of the selection logic below (to the end of this
@@ -3154,6 +3156,8 @@ arm_configure_build_target (struct arm_build_target *target,
         support for the pre-thumb era cores is removed.  */
       sel = arm_selected_cpu;
       arm_initialize_isa (default_isa, sel->common.isa_bits);
+      arm_parse_option_features (default_isa, &arm_selected_cpu->common,
+                                cpu_opts);
 
       /* Now check to see if the user has specified any command line
         switches that require certain abilities from the cpu.  */
@@ -3241,6 +3245,8 @@ arm_configure_build_target (struct arm_build_target *target,
         structure.  */
       target->core_name = arm_selected_cpu->common.name;
       arm_initialize_isa (target->isa, arm_selected_cpu->common.isa_bits);
+      arm_parse_option_features (target->isa, &arm_selected_cpu->common,
+                                cpu_opts);
       arm_selected_arch = all_architectures + arm_selected_cpu->arch;
     }
 
index 61e8bc24ea41aff5e5e9e05d7d9bf2f4bac808f7..b6e50932ddc77d069b99b3352f286c2c000be5af 100644 (file)
@@ -393,9 +393,19 @@ function gen_opt () {
 }
 
 function check_cpu (name) {
-    if (name in cpu_cnames) {
-       print cpu_cnames[name]
-    } else print "error"
+    exts = split (name, extensions, "+")
+
+    if (! extensions[1] in cpu_cnames) {
+       return "error"
+    }
+
+    for (n = 2; n <= exts; n++) {
+       if (!((extensions[1], extensions[n]) in cpu_opt_remove) \
+           && !((extensions[1], extensions[n]) in cpu_optaliases)) {
+           return "error"
+       }
+    }
+    return name
 }
 
 function check_fpu (name) {
@@ -405,9 +415,19 @@ function check_fpu (name) {
 }
 
 function check_arch (name) {
-    if (name in arch_isa) {
-       print name
-    } else print "error"
+    exts = split (name, extensions, "+")
+
+    if (! extensions[1] in arch_isa) {
+       return "error"
+    }
+
+    for (n = 2; n <= exts; n++) {
+       if (!((extensions[1], extensions[n]) in arch_opt_remove)        \
+           && !((extensions[1], extensions[n]) in arch_optaliases)) {
+           return "error"
+       }
+    }
+    return name
 }
 
 BEGIN {
@@ -614,10 +634,10 @@ END {
        gen_opt()
     } else if (cmd ~ /^chk(cpu|tune) /) {
        split (cmd, target)
-       check_cpu(target[2])
+       print check_cpu(target[2])
     } else if (cmd ~ /^chkarch /) {
        split (cmd, target)
-       check_arch(target[2])
+       print check_arch(target[2])
     } else if (cmd ~ /^chkfpu /) {
        split (cmd, target)
        check_fpu(target[2])