mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
LoongArch: Scan all illegal operand instructions without interruption
Currently, gas will exit immediately and report an error when it sees illegal operands, and will not process the remaining instructions. Replace as_fatal with as_bad to check for all illegal operands. Add test cases for illegal operands of some instructions.
This commit is contained in:
@@ -958,8 +958,8 @@ check_this_insn_before_appending (struct loongarch_cl_insn *ip)
|
||||
/* For AMO insn amswap.[wd], amadd.[wd], etc. */
|
||||
if (ip->args[0] != 0
|
||||
&& (ip->args[0] == ip->args[1] || ip->args[0] == ip->args[2]))
|
||||
as_fatal (_("AMO insns require rd != base && rd != rt"
|
||||
" when rd isn't $r0"));
|
||||
as_bad (_("automic memory operations insns require rd != rj"
|
||||
" && rd != rk when rd isn't r0"));
|
||||
}
|
||||
else if ((ip->insn->mask == 0xffe08000
|
||||
/* bstrins.w rd, rj, msbw, lsbw */
|
||||
@@ -970,12 +970,13 @@ check_this_insn_before_appending (struct loongarch_cl_insn *ip)
|
||||
{
|
||||
/* For bstr(ins|pick).[wd]. */
|
||||
if (ip->args[2] < ip->args[3])
|
||||
as_fatal (_("bstr(ins|pick).[wd] require msbd >= lsbd"));
|
||||
as_bad (_("bstr(ins|pick).[wd] require msbd >= lsbd"));
|
||||
}
|
||||
else if (ip->insn->mask != 0 && (ip->insn_bin & 0xfe0003c0) == 0x04000000
|
||||
/* csrxchg rd, rj, csr_num */
|
||||
&& (strcmp ("csrxchg", ip->name) == 0))
|
||||
as_fatal (_("csrxchg require rj != $r0 && rj != $r1"));
|
||||
&& (strcmp ("csrxchg", ip->name) == 0
|
||||
|| strcmp ("gcsrxchg", ip->name) == 0))
|
||||
as_bad (_("g?csrxchg require rj != r0 && rj != r1"));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
18
gas/testsuite/gas/loongarch/check_bstrins-pick.d
Normal file
18
gas/testsuite/gas/loongarch/check_bstrins-pick.d
Normal file
@@ -0,0 +1,18 @@
|
||||
#as:
|
||||
#objdump: -d
|
||||
#skip: loongarch32-*-*
|
||||
|
||||
.*:[ ]+file format .*
|
||||
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
0+ <.*>:
|
||||
0: 00682041 bstrins\.w \$ra, \$tp, 0x8, 0x8
|
||||
4: 00882041 bstrins\.d \$ra, \$tp, 0x8, 0x8
|
||||
8: 0068a041 bstrpick\.w \$ra, \$tp, 0x8, 0x8
|
||||
c: 00c82041 bstrpick\.d \$ra, \$tp, 0x8, 0x8
|
||||
10: 00680041 bstrins\.w \$ra, \$tp, 0x8, 0x0
|
||||
14: 00880041 bstrins\.d \$ra, \$tp, 0x8, 0x0
|
||||
18: 00688041 bstrpick\.w \$ra, \$tp, 0x8, 0x0
|
||||
1c: 00c80041 bstrpick\.d \$ra, \$tp, 0x8, 0x0
|
||||
9
gas/testsuite/gas/loongarch/check_bstrins-pick.s
Normal file
9
gas/testsuite/gas/loongarch/check_bstrins-pick.s
Normal file
@@ -0,0 +1,9 @@
|
||||
bstrins.w $r1,$r2,8,8
|
||||
bstrins.d $r1,$r2,8,8
|
||||
bstrpick.w $r1,$r2,8,8
|
||||
bstrpick.d $r1,$r2,8,8
|
||||
|
||||
bstrins.w $r1,$r2,8,0
|
||||
bstrins.d $r1,$r2,8,0
|
||||
bstrpick.w $r1,$r2,8,0
|
||||
bstrpick.d $r1,$r2,8,0
|
||||
113
gas/testsuite/gas/loongarch/illegal-operand.l
Normal file
113
gas/testsuite/gas/loongarch/illegal-operand.l
Normal file
@@ -0,0 +1,113 @@
|
||||
.*: Assembler messages:
|
||||
.*:2: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:3: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:4: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:5: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:6: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:7: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:8: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:9: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:10: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:11: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:12: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:13: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:14: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:15: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:16: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:17: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:18: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:19: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:20: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:21: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:22: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:23: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:24: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:25: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:26: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:27: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:28: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:29: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:30: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:31: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:32: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:33: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:34: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:35: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:36: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:37: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:38: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:39: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:40: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:41: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:42: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:43: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:44: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:45: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:46: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:47: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:48: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:49: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:50: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:51: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:52: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:53: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:54: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:55: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:56: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:57: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:58: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:59: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:60: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:61: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:62: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:63: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:64: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:65: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:66: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:67: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:68: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:69: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:70: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:71: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:72: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:73: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:74: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:75: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:76: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:77: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:78: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:79: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:80: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:81: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:82: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:83: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:84: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:85: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:86: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:87: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:88: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:89: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:90: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:91: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:92: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:93: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:94: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:95: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:96: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:97: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:98: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:99: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:100: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:101: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:102: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:103: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:104: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:105: Error: automic memory operations insns require rd != rj && rd != rk when rd isn't r0
|
||||
.*:108: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
|
||||
.*:109: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
|
||||
.*:110: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
|
||||
.*:111: Error: bstr\(ins\|pick\)\.\[wd\] require msbd >= lsbd
|
||||
.*:114: Error: g\?csrxchg require rj != r0 && rj != r1
|
||||
.*:115: Error: g\?csrxchg require rj != r0 && rj != r1
|
||||
.*:116: Error: g\?csrxchg require rj != r0 && rj != r1
|
||||
.*:117: Error: g\?csrxchg require rj != r0 && rj != r1
|
||||
117
gas/testsuite/gas/loongarch/illegal-operand.s
Normal file
117
gas/testsuite/gas/loongarch/illegal-operand.s
Normal file
@@ -0,0 +1,117 @@
|
||||
# Illegal operand of atomic memory access instruction.
|
||||
amcas.b $r1,$r1,$r2
|
||||
amcas.b $r1,$r2,$r1
|
||||
amcas.h $r1,$r1,$r2
|
||||
amcas.h $r1,$r2,$r1
|
||||
amcas.w $r1,$r1,$r2
|
||||
amcas.w $r1,$r2,$r1
|
||||
amcas.d $r1,$r1,$r2
|
||||
amcas.d $r1,$r2,$r1
|
||||
amcas_db.b $r1,$r1,$r2
|
||||
amcas_db.b $r1,$r2,$r1
|
||||
amcas_db.h $r1,$r1,$r2
|
||||
amcas_db.h $r1,$r2,$r1
|
||||
amcas_db.w $r1,$r1,$r2
|
||||
amcas_db.w $r1,$r2,$r1
|
||||
amcas_db.d $r1,$r1,$r2
|
||||
amcas_db.d $r1,$r2,$r1
|
||||
amswap.b $r1,$r1,$r2
|
||||
amswap.b $r1,$r2,$r1
|
||||
amswap.h $r1,$r1,$r2
|
||||
amswap.h $r1,$r2,$r1
|
||||
amadd.b $r1,$r1,$r2
|
||||
amadd.b $r1,$r2,$r1
|
||||
amadd.h $r1,$r1,$r2
|
||||
amadd.h $r1,$r2,$r1
|
||||
amswap_db.b $r1,$r1,$r2
|
||||
amswap_db.b $r1,$r2,$r1
|
||||
amswap_db.h $r1,$r1,$r2
|
||||
amswap_db.h $r1,$r2,$r1
|
||||
amadd_db.b $r1,$r1,$r2
|
||||
amadd_db.b $r1,$r2,$r1
|
||||
amadd_db.h $r1,$r1,$r2
|
||||
amadd_db.h $r1,$r2,$r1
|
||||
amswap.w $r1,$r1,$r2
|
||||
amswap.w $r1,$r2,$r1
|
||||
amswap.d $r1,$r1,$r2
|
||||
amswap.d $r1,$r2,$r1
|
||||
amadd.w $r1,$r1,$r2
|
||||
amadd.w $r1,$r2,$r1
|
||||
amadd.d $r1,$r1,$r2
|
||||
amadd.d $r1,$r2,$r1
|
||||
amand.w $r1,$r1,$r2
|
||||
amand.w $r1,$r2,$r1
|
||||
amand.d $r1,$r1,$r2
|
||||
amand.d $r1,$r2,$r1
|
||||
amor.w $r1,$r1,$r2
|
||||
amor.w $r1,$r2,$r1
|
||||
amor.d $r1,$r1,$r2
|
||||
amor.d $r1,$r2,$r1
|
||||
amxor.w $r1,$r1,$r2
|
||||
amxor.w $r1,$r2,$r1
|
||||
amxor.d $r1,$r1,$r2
|
||||
amxor.d $r1,$r2,$r1
|
||||
ammax.w $r1,$r1,$r2
|
||||
ammax.w $r1,$r2,$r1
|
||||
ammax.d $r1,$r1,$r2
|
||||
ammax.d $r1,$r2,$r1
|
||||
ammin.w $r1,$r1,$r2
|
||||
ammin.w $r1,$r2,$r1
|
||||
ammin.d $r1,$r1,$r2
|
||||
ammin.d $r1,$r2,$r1
|
||||
ammax.wu $r1,$r1,$r2
|
||||
ammax.wu $r1,$r2,$r1
|
||||
ammax.du $r1,$r1,$r2
|
||||
ammax.du $r1,$r2,$r1
|
||||
ammin.wu $r1,$r1,$r2
|
||||
ammin.wu $r1,$r2,$r1
|
||||
ammin.du $r1,$r1,$r2
|
||||
ammin.du $r1,$r2,$r1
|
||||
amswap_db.w $r1,$r1,$r2
|
||||
amswap_db.w $r1,$r2,$r1
|
||||
amswap_db.d $r1,$r1,$r2
|
||||
amswap_db.d $r1,$r2,$r1
|
||||
amadd_db.w $r1,$r1,$r2
|
||||
amadd_db.w $r1,$r2,$r1
|
||||
amadd_db.d $r1,$r1,$r2
|
||||
amadd_db.d $r1,$r2,$r1
|
||||
amand_db.w $r1,$r1,$r2
|
||||
amand_db.w $r1,$r2,$r1
|
||||
amand_db.d $r1,$r1,$r2
|
||||
amand_db.d $r1,$r2,$r1
|
||||
amor_db.w $r1,$r1,$r2
|
||||
amor_db.w $r1,$r2,$r1
|
||||
amor_db.d $r1,$r1,$r2
|
||||
amor_db.d $r1,$r2,$r1
|
||||
amxor_db.w $r1,$r1,$r2
|
||||
amxor_db.w $r1,$r2,$r1
|
||||
amxor_db.d $r1,$r1,$r2
|
||||
amxor_db.d $r1,$r2,$r1
|
||||
ammax_db.w $r1,$r1,$r2
|
||||
ammax_db.w $r1,$r2,$r1
|
||||
ammax_db.d $r1,$r1,$r2
|
||||
ammax_db.d $r1,$r2,$r1
|
||||
ammin_db.w $r1,$r1,$r2
|
||||
ammin_db.w $r1,$r2,$r1
|
||||
ammin_db.d $r1,$r1,$r2
|
||||
ammin_db.d $r1,$r2,$r1
|
||||
ammax_db.wu $r1,$r1,$r2
|
||||
ammax_db.wu $r1,$r2,$r1
|
||||
ammax_db.du $r1,$r1,$r2
|
||||
ammax_db.du $r1,$r2,$r1
|
||||
ammin_db.wu $r1,$r1,$r2
|
||||
ammin_db.wu $r1,$r2,$r1
|
||||
ammin_db.du $r1,$r1,$r2
|
||||
ammin_db.du $r1,$r2,$r1
|
||||
|
||||
# Illegal operand of bstr(ins|pick).[wd]
|
||||
bstrins.w $r1,$r2,0,8
|
||||
bstrins.d $r1,$r2,0,8
|
||||
bstrpick.w $r1,$r2,0,8
|
||||
bstrpick.d $r1,$r2,0,8
|
||||
|
||||
# Illegal operand of csrxchg/gcsrxchg
|
||||
csrxchg $r0,$r0,1
|
||||
csrxchg $r0,$r1,1
|
||||
gcsrxchg $r0,$r0,1
|
||||
gcsrxchg $r0,$r1,1
|
||||
@@ -32,4 +32,8 @@ if [istarget loongarch*-*-*] {
|
||||
|
||||
run_list_test "align"
|
||||
run_list_test "reg-s9"
|
||||
|
||||
if [istarget loongarch64-*-*] {
|
||||
run_list_test "illegal-operand"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ Disassembly of section .text:
|
||||
00000000.* <.text>:
|
||||
[ ]*0:[ ]*05000400[ ]*gcsrrd[ ]*\$zero,[ ]*0x1[ ]*
|
||||
[ ]*4:[ ]*05000420[ ]*gcsrwr[ ]*\$zero,[ ]*0x1[ ]*
|
||||
[ ]*8:[ ]*05000420[ ]*gcsrwr[ ]*\$zero,[ ]*0x1[ ]*
|
||||
[ ]*8:[ ]*05000440[ ]*gcsrxchg[ ]*\$zero,[ ]*\$tp,[ ]*0x1[ ]*
|
||||
[ ]*c:[ ]*06482401[ ]*gtlbflush[ ]*
|
||||
[ ]*10:[ ]*002b8001[ ]*hvcl[ ]*0x1[ ]*
|
||||
[ ]*14:[ ]*00000820[ ]*movgr2scr[ ]*\$scr0,[ ]*\$ra[ ]*
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
gcsrrd $r0, 1
|
||||
gcsrwr $r0, 1
|
||||
gcsrxchg $r0, $r1, 1
|
||||
gcsrxchg $r0, $r2, 1
|
||||
gtlbflush
|
||||
hvcl 1
|
||||
movgr2scr $scr0, $r1
|
||||
|
||||
Reference in New Issue
Block a user