aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2025-07-23 17:54:55 +0100
committerPeter Maydell <peter.maydell@linaro.org>2025-07-25 10:31:45 +0100
commitb79f944e09657f63b6dd6e78ac7966fdc7a3e6d1 (patch)
treedaa432b9029d5899e67f1e65241a544bf6954585
parentaba39946baaf5ca73aae0b79e2cd0790ddafe291 (diff)
downloadqemu-b79f944e09657f63b6dd6e78ac7966fdc7a3e6d1.zip
qemu-b79f944e09657f63b6dd6e78ac7966fdc7a3e6d1.tar.gz
qemu-b79f944e09657f63b6dd6e78ac7966fdc7a3e6d1.tar.bz2
decodetree: Infer argument set before inferring format
Failure to confirm an argument set first may result in the selection of a format which leaves extra arguments to be filled in by the pattern. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Tested-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20250723165458.3509150-4-peter.maydell@linaro.org Message-id: 20250722183343.273533-1-richard.henderson@linaro.org Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Tested-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--scripts/decodetree.py7
-rw-r--r--tests/decode/meson.build1
-rw-r--r--tests/decode/succ_infer1.decode4
3 files changed, 9 insertions, 3 deletions
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
index e8b72da..f992472 100644
--- a/scripts/decodetree.py
+++ b/scripts/decodetree.py
@@ -1016,9 +1016,12 @@ def infer_format(arg, fieldmask, flds, width):
else:
var_flds[n] = c
+ if not arg:
+ arg = infer_argument_set(flds)
+
# Look for an existing format with the same argument set and fields
for fmt in formats.values():
- if arg and fmt.base != arg:
+ if fmt.base != arg:
continue
if fieldmask != fmt.fieldmask:
continue
@@ -1029,8 +1032,6 @@ def infer_format(arg, fieldmask, flds, width):
return (fmt, const_flds)
name = decode_function + '_Fmt_' + str(len(formats))
- if not arg:
- arg = infer_argument_set(flds)
fmt = Format(name, 0, arg, 0, 0, 0, fieldmask, var_flds, width)
formats[name] = fmt
diff --git a/tests/decode/meson.build b/tests/decode/meson.build
index b13fada..63405ca 100644
--- a/tests/decode/meson.build
+++ b/tests/decode/meson.build
@@ -41,6 +41,7 @@ succ_tests = [
'succ_argset_type1.decode',
'succ_function.decode',
'succ_ident1.decode',
+ 'succ_infer1.decode',
'succ_named_field.decode',
'succ_pattern_group_nest1.decode',
'succ_pattern_group_nest2.decode',
diff --git a/tests/decode/succ_infer1.decode b/tests/decode/succ_infer1.decode
new file mode 100644
index 0000000..6fa40ba
--- /dev/null
+++ b/tests/decode/succ_infer1.decode
@@ -0,0 +1,4 @@
+&rprr_load rd pg rn rm dtype nreg
+@rprr_load .... .... ... rm:5 ... pg:3 rn:5 rd:5 &rprr_load
+
+LD1Q 1100 0100 000 rm:5 101 pg:3 rn:5 rd:5