diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2017-05-29 12:34:56 +0200 |
---|---|---|
committer | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2017-05-30 10:22:25 +0200 |
commit | a09f2586017aeed82fa07c8bfea6c75859295bd9 (patch) | |
tree | 8e64265ebd74205ae47c7a8dde8db8f64dac8592 /opcodes | |
parent | bfcfbe611b4d7e650236f8b8ba7d0706cfe6a0b7 (diff) | |
download | gdb-a09f2586017aeed82fa07c8bfea6c75859295bd9.zip gdb-a09f2586017aeed82fa07c8bfea6c75859295bd9.tar.gz gdb-a09f2586017aeed82fa07c8bfea6c75859295bd9.tar.bz2 |
S/390: Improve error checking for optional operands
So far we only had an instruction flag which made an arbitrary number
of operands optional. This limits error checking capabilities for
instructions marked that way. With this patch the optparm flag only
allows a single optional parameter and another one is added (optparm2)
allowing 2 optional arguments. Hopefully we won't need more than that
in the future. So far there will be only a single use of optparm2.
gas/ChangeLog:
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* config/tc-s390.c (md_gather_operands): Support new optparm2
instruction flag.
include/ChangeLog:
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* opcode/s390.h: Add new instruction flags optparm2.
opcodes/ChangeLog:
2017-05-30 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* s390-dis.c (s390_print_insn_with_opcode): Support new optparm2
instruction flag.
* s390-mkopc.c (main): Recognize the new instruction flag when
parsing instruction list.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/s390-dis.c | 11 | ||||
-rw-r--r-- | opcodes/s390-mkopc.c | 8 |
2 files changed, 16 insertions, 3 deletions
diff --git a/opcodes/s390-dis.c b/opcodes/s390-dis.c index 8d450b4..16bb5ff 100644 --- a/opcodes/s390-dis.c +++ b/opcodes/s390-dis.c @@ -206,11 +206,20 @@ s390_print_insn_with_opcode (bfd_vma memaddr, /* For instructions with a last optional operand don't print it if zero. */ - if ((opcode->flags & S390_INSTR_FLAG_OPTPARM) + if ((opcode->flags & (S390_INSTR_FLAG_OPTPARM | S390_INSTR_FLAG_OPTPARM2)) && val.u == 0 && opindex[1] == 0) break; + if ((opcode->flags & S390_INSTR_FLAG_OPTPARM2) + && val.u == 0 && opindex[1] != 0 && opindex[2] == 0) + { + union operand_value next_op_val = + s390_extract_operand (buffer, s390_operands + opindex[1]); + if (next_op_val.u == 0) + break; + } + if (flags & S390_OPERAND_GPR) info->fprintf_func (info->stream, "%c%%r%u", separator, val.u); else if (flags & S390_OPERAND_FPR) diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c index 68c55a9..0d4c9df 100644 --- a/opcodes/s390-mkopc.c +++ b/opcodes/s390-mkopc.c @@ -411,12 +411,16 @@ main (void) && (str[7] == 0 || str[7] == ',')) { flag_bits |= S390_INSTR_FLAG_OPTPARM; str += 7; + } else if (strncmp (str, "optparm2", 8) == 0 + && (str[8] == 0 || str[8] == ',')) { + flag_bits |= S390_INSTR_FLAG_OPTPARM2; + str += 8; } else if (strncmp (str, "htm", 3) == 0 - && (str[3] == 0 || str[3] == ',')) { + && (str[3] == 0 || str[3] == ',')) { flag_bits |= S390_INSTR_FLAG_HTM; str += 3; } else if (strncmp (str, "vx", 2) == 0 - && (str[2] == 0 || str[2] == ',')) { + && (str[2] == 0 || str[2] == ',')) { flag_bits |= S390_INSTR_FLAG_VX; str += 2; } else { |