diff mbox series

[12/30,arm] Allow new extended syntax CPU and architecture names during configure

Message ID 3868848ea778bb498c716d5d8bad2c5b4c1cc2e4.1497004220.git.Richard.Earnshaw@arm.com
State New
Headers show
Series Reworking the -mcpu, -march and -mfpu options | expand

Commit Message

Richard Earnshaw (lists) June 9, 2017, 12:53 p.m. UTC
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.
---
 gcc/config.gcc              |  6 +++---
 gcc/config/arm/arm.c        |  8 +++++++-
 gcc/config/arm/parsecpu.awk | 36 ++++++++++++++++++++++++++++--------
 3 files changed, 38 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index f55dcaa..4d0f7ec 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1159,7 +1159,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"
@@ -4494,9 +4494,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
 		;;
 
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 73b1369..7296ad3 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3161,7 +3161,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
@@ -3172,6 +3174,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.  */
@@ -3259,6 +3263,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;
     }
 
diff --git a/gcc/config/arm/parsecpu.awk b/gcc/config/arm/parsecpu.awk
index 61e8bc2..b6e5093 100644
--- a/gcc/config/arm/parsecpu.awk
+++ b/gcc/config/arm/parsecpu.awk
@@ -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])