aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2017-06-16 21:03:46 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2017-06-16 21:03:46 +0000
commitbf35d17a30c0a476b6abc82e0b029029c5599104 (patch)
treec0f1dda648777a99dec0f285e53000a81810a6fc /gcc
parent357e1023c9b10e98d1aa4d59fdb876078de47608 (diff)
downloadgcc-bf35d17a30c0a476b6abc82e0b029029c5599104.zip
gcc-bf35d17a30c0a476b6abc82e0b029029c5599104.tar.gz
gcc-bf35d17a30c0a476b6abc82e0b029029c5599104.tar.bz2
[arm] Allow new extended syntax CPU and architecture
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/config.gcc6
-rw-r--r--gcc/config/arm/arm.c8
-rw-r--r--gcc/config/arm/parsecpu.awk36
4 files changed, 50 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2764dda..3299cde 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,17 @@
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
when an option is an alias of another.
* config/arm/parsecpu.awk (optalias): New parser token.
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 8b00e66..620a5b2 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -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
;;
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 55ea22e..9e857a2 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -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;
}
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])