diff options
author | WANG Xuerui <git@xen0n.name> | 2023-06-30 00:35:04 +0800 |
---|---|---|
committer | liuzhensong <liuzhensong@loongson.cn> | 2023-06-30 10:18:04 +0800 |
commit | 6637ae9232f0ba4442a2b171ff9571a5aff0f0e8 (patch) | |
tree | 3d869181eff52ae44d1c204d319aecfd3de8434b /gas | |
parent | 6ad6615a79843aa224710a70a33fd15777f74f49 (diff) | |
download | gdb-6637ae9232f0ba4442a2b171ff9571a5aff0f0e8.zip gdb-6637ae9232f0ba4442a2b171ff9571a5aff0f0e8.tar.gz gdb-6637ae9232f0ba4442a2b171ff9571a5aff0f0e8.tar.bz2 |
LoongArch: Deprecate $v[01], $fv[01] and $x names per spec
As outlined in the LoongArch ELF psABI spec [1], it is actually already
2 versions after the initial LoongArch support, and the $v[01] and
$fv[01] names should really get sunset by now.
In addition, the "$x" name for $r21 was never included in any released
version of the ABI spec, and such usages are all fixed to say just $r21
for every project I could think of that accepted a LoongArch port.
Plus, the upcoming LSX/LASX support makes use of registers named
"$vrNN" and "$xrNN", so having "$vN" and "$x" alongside would almost
certainly create confusion for developers.
Issue warnings for such usages per the deprecation procedure detailed
in the spec, so we can finally remove support in the next release cycle
after this.
[1]: https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html
gas/ChangeLog:
* config/tc-loongarch.c: Init canonical register ABI name
mappings and deprecated register names.
(loongarch_args_parser_can_match_arg_helper): Warn in case of
deprecated register name usage.
* testsuite/gas/loongarch/deprecated_reg_aliases.d: New test.
* testsuite/gas/loongarch/deprecated_reg_aliases.l: Likewise.
* testsuite/gas/loongarch/deprecated_reg_aliases.s: Likewise.
include/ChangeLog:
* opcode/loongarch.h: Rename global variables.
opcodes/ChangeLog:
* loongarch-opc.c: Rename the alternate/deprecated register name
mappings, and move $x to the deprecated name map.
Signed-off-by: WANG Xuerui <git@xen0n.name>
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-loongarch.c | 42 | ||||
-rw-r--r-- | gas/testsuite/gas/loongarch/deprecated_reg_aliases.d | 18 | ||||
-rw-r--r-- | gas/testsuite/gas/loongarch/deprecated_reg_aliases.l | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/loongarch/deprecated_reg_aliases.s | 5 |
4 files changed, 67 insertions, 5 deletions
diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c index 6e8aa35..d23506c 100644 --- a/gas/config/tc-loongarch.c +++ b/gas/config/tc-loongarch.c @@ -223,8 +223,12 @@ md_parse_option (int c, const char *arg) return ret; } +static const char *const *r_abi_names = NULL; +static const char *const *f_abi_names = NULL; static struct htab *r_htab = NULL; +static struct htab *r_deprecated_htab = NULL; static struct htab *f_htab = NULL; +static struct htab *f_deprecated_htab = NULL; static struct htab *fc_htab = NULL; static struct htab *fcn_htab = NULL; static struct htab *c_htab = NULL; @@ -272,7 +276,11 @@ loongarch_after_parse_args () /* Init ilp32/lp64 registers names. */ if (!r_htab) r_htab = str_htab_create (), str_hash_insert (r_htab, "", 0, 0); + if (!r_deprecated_htab) + r_deprecated_htab = str_htab_create (), + str_hash_insert (r_deprecated_htab, "", 0, 0); + r_abi_names = loongarch_r_normal_name; for (i = 0; i < ARRAY_SIZE (loongarch_r_normal_name); i++) str_hash_insert (r_htab, loongarch_r_normal_name[i], (void *) (i + 1), 0); @@ -287,7 +295,11 @@ loongarch_after_parse_args () { if (!f_htab) f_htab = str_htab_create (), str_hash_insert (f_htab, "", 0, 0); + if (!f_deprecated_htab) + f_deprecated_htab = str_htab_create (), + str_hash_insert (f_deprecated_htab, "", 0, 0); + f_abi_names = loongarch_f_normal_name; for (i = 0; i < ARRAY_SIZE (loongarch_f_normal_name); i++) str_hash_insert (f_htab, loongarch_f_normal_name[i], (void *) (i + 1), 0); @@ -338,22 +350,24 @@ loongarch_after_parse_args () /* Init lp64 registers alias. */ if (LARCH_opts.ase_lp64) { + r_abi_names = loongarch_r_lp64_name; for (i = 0; i < ARRAY_SIZE (loongarch_r_lp64_name); i++) str_hash_insert (r_htab, loongarch_r_lp64_name[i], (void *) (i + 1), 0); - for (i = 0; i < ARRAY_SIZE (loongarch_r_lp64_name1); i++) - str_hash_insert (r_htab, loongarch_r_lp64_name1[i], (void *) (i + 1), - 0); + for (i = 0; i < ARRAY_SIZE (loongarch_r_lp64_name_deprecated); i++) + str_hash_insert (r_deprecated_htab, loongarch_r_lp64_name_deprecated[i], + (void *) (i + 1), 0); } /* Init float-lp64 registers alias */ if ((LARCH_opts.ase_sf || LARCH_opts.ase_df) && LARCH_opts.ase_lp64) { + f_abi_names = loongarch_f_lp64_name; for (i = 0; i < ARRAY_SIZE (loongarch_f_lp64_name); i++) str_hash_insert (f_htab, loongarch_f_lp64_name[i], (void *) (i + 1), 0); - for (i = 0; i < ARRAY_SIZE (loongarch_f_lp64_name1); i++) - str_hash_insert (f_htab, loongarch_f_lp64_name1[i], + for (i = 0; i < ARRAY_SIZE (loongarch_f_lp64_name_deprecated); i++) + str_hash_insert (f_deprecated_htab, loongarch_f_lp64_name_deprecated[i], (void *) (i + 1), 0); } } @@ -684,6 +698,15 @@ loongarch_args_parser_can_match_arg_helper (char esc_ch1, char esc_ch2, imm = (intptr_t) str_hash_find (r_htab, arg); ip->match_now = 0 < imm; ret = imm - 1; + if (ip->match_now) + break; + /* Handle potential usage of deprecated register aliases. */ + imm = (intptr_t) str_hash_find (r_deprecated_htab, arg); + ip->match_now = 0 < imm; + ret = imm - 1; + if (ip->match_now && !ip->macro_id) + as_warn (_("register alias %s is deprecated, use %s instead"), + arg, r_abi_names[ret]); break; case 'f': switch (esc_ch2) @@ -700,6 +723,15 @@ loongarch_args_parser_can_match_arg_helper (char esc_ch1, char esc_ch2, } ip->match_now = 0 < imm; ret = imm - 1; + if (ip->match_now && !ip->macro_id) + break; + /* Handle potential usage of deprecated register aliases. */ + imm = (intptr_t) str_hash_find (f_deprecated_htab, arg); + ip->match_now = 0 < imm; + ret = imm - 1; + if (ip->match_now) + as_warn (_("register alias %s is deprecated, use %s instead"), + arg, f_abi_names[ret]); break; case 'c': switch (esc_ch2) diff --git a/gas/testsuite/gas/loongarch/deprecated_reg_aliases.d b/gas/testsuite/gas/loongarch/deprecated_reg_aliases.d new file mode 100644 index 0000000..3ea0806 --- /dev/null +++ b/gas/testsuite/gas/loongarch/deprecated_reg_aliases.d @@ -0,0 +1,18 @@ +#name: Deprecated register aliases +#as-new: +#objdump: -d +#warning_output: deprecated_reg_aliases.l +#skip: loongarch32-*-* + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0000000000000000 <foo>: +[ ]+0:[ ]+14acf125[ ]+lu12i\.w[ ]+\$a1, 354185 +[ ]+4:[ ]+038048a5[ ]+ori[ ]+\$a1, \$a1, 0x12 +[ ]+8:[ ]+16024685[ ]+lu32i\.d[ ]+\$a1, 4660 +[ ]+c:[ ]+08200420[ ]+fmadd\.d[ ]+\$fa0, \$fa1, \$fa1, \$fa0 +[ ]+10:[ ]+380c16a4[ ]+ldx\.d[ ]+\$a0, \$r21, \$a1 +[ ]+14:[ ]+4c000020[ ]+ret[ ]+ diff --git a/gas/testsuite/gas/loongarch/deprecated_reg_aliases.l b/gas/testsuite/gas/loongarch/deprecated_reg_aliases.l new file mode 100644 index 0000000..b82c209 --- /dev/null +++ b/gas/testsuite/gas/loongarch/deprecated_reg_aliases.l @@ -0,0 +1,7 @@ +.*Assembler messages: +.*:2: Warning: register alias \$v1 is deprecated, use \$a1 instead +.*:3: Warning: register alias \$fv0 is deprecated, use \$fa0 instead +.*:3: Warning: register alias \$fv1 is deprecated, use \$fa1 instead +.*:3: Warning: register alias \$fv1 is deprecated, use \$fa1 instead +.*:4: Warning: register alias \$v0 is deprecated, use \$a0 instead +.*:4: Warning: register alias \$x is deprecated, use \$r21 instead diff --git a/gas/testsuite/gas/loongarch/deprecated_reg_aliases.s b/gas/testsuite/gas/loongarch/deprecated_reg_aliases.s new file mode 100644 index 0000000..7848346 --- /dev/null +++ b/gas/testsuite/gas/loongarch/deprecated_reg_aliases.s @@ -0,0 +1,5 @@ +foo: + li.d $v1, 0x123456789012 + fmadd.d $fv0, $fv1, $fv1, $fa0 + ldx.d $v0, $x, $a1 + ret |