diff options
Diffstat (limited to 'gcc/config/arm/parsecpu.awk')
-rw-r--r-- | gcc/config/arm/parsecpu.awk | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/gcc/config/arm/parsecpu.awk b/gcc/config/arm/parsecpu.awk index aabe1b0c64c..ba2dee5fdcb 100644 --- a/gcc/config/arm/parsecpu.awk +++ b/gcc/config/arm/parsecpu.awk @@ -261,6 +261,18 @@ function gen_comm_data () { print " { NULL, false, false, {isa_nobit}}" print "};\n" } + + if (cpus[n] in cpu_aliases) { + print "static const cpu_alias cpu_aliastab_" \ + cpu_cnames[cpus[n]] "[] = {" + naliases = split (cpu_aliases[cpus[n]], aliases) + for (alias = 1; alias <= naliases; alias++) { + print " { \"" aliases[alias] "\", " \ + cpu_alias_visible[cpus[n],aliases[alias]] "}," + } + print " { NULL, false}" + print "};\n" + } } print "const cpu_option all_cores[] =" @@ -295,12 +307,16 @@ function gen_comm_data () { } print_isa_bits_for(all_isa_bits, " ") print "\n }," + # aliases + if (cpus[n] in cpu_aliases) { + print " cpu_aliastab_" cpu_cnames[cpus[n]] "," + } else print " NULL," # arch print " TARGET_ARCH_" arch_cnames[feats[1]] print " }," } - print " {{NULL, NULL, {isa_nobit}}, TARGET_ARCH_arm_none}" + print " {{NULL, NULL, {isa_nobit}}, NULL, TARGET_ARCH_arm_none}" print "};" narchs = split (arch_list, archs) @@ -486,13 +502,17 @@ function gen_opt () { function check_cpu (name) { exts = split (name, extensions, "+") - if (! (extensions[1] in cpu_cnames)) { - return "error" + cpu_name = extensions[1] + if (! (cpu_name in cpu_cnames)) { + if (! (cpu_name in cpu_all_aliases)) { + return "error" + } + cpu_name = cpu_all_aliases[cpu_name] } for (n = 2; n <= exts; n++) { - if (!((extensions[1], extensions[n]) in cpu_opt_remove) \ - && !((extensions[1], extensions[n]) in cpu_optaliases)) { + if (!((cpu_name, extensions[n]) in cpu_opt_remove) \ + && !((cpu_name, extensions[n]) in cpu_optaliases)) { return "error" } } @@ -642,6 +662,12 @@ BEGIN { toplevel() cpu_name = $3 parse_ok = 1 + if (cpu_name in cpu_cnames) { + fatal(cpu_name " is already defined") + } + if (cpu_name in cpu_all_aliases) { + fatal(cpu_name " has already been defined as an alias") + } } /^[ ]*cname / { @@ -651,6 +677,33 @@ BEGIN { parse_ok = 1 } +/^[ ]*alias / { + if (NF < 2) fatal("syntax: alias <name>+") + if (cpu_name == "") fatal("\"alias\" outside of cpu block") + alias_count = NF + for (n = 2; n <= alias_count; n++) { + visible = "true" + alias = $n + if (alias ~ /!.*/) { + visible = "false" + gsub(/^!/, "", alias) + } + if (alias in cpu_cnames) { + fatal(alias " is already defined as a cpu name") + } + if (n == 2) { + cpu_aliases[cpu_name] = alias + } else cpu_aliases[cpu_name] = cpu_aliases[cpu_name] " " alias + cpu_alias_visible[cpu_name,alias] = visible + if (alias in cpu_all_aliases) { + fatal(alias " is already an alias for " cpu_all_aliases[alias]) + } + cpu_all_aliases[alias] = cpu_name + } + cpu_has_alias[cpu_name] = 1 + parse_ok = 1 +} + /^[ ]*tune for / { if (NF != 3) fatal("syntax: tune for <cpu-name>") if (cpu_name != "") { |