diff options
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/disassemble.c | 1 | ||||
-rw-r--r-- | opcodes/s390-dis.c | 87 |
2 files changed, 72 insertions, 16 deletions
diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index 9c0daca..bd37f04 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -721,6 +721,7 @@ disassemble_init_for_target (struct disassemble_info * info) #ifdef ARCH_s390 case bfd_arch_s390: disassemble_init_s390 (info); + info->created_styled_output = true; break; #endif #ifdef ARCH_nds32 diff --git a/opcodes/s390-dis.c b/opcodes/s390-dis.c index 03715ed..df44efb 100644 --- a/opcodes/s390-dis.c +++ b/opcodes/s390-dis.c @@ -186,7 +186,8 @@ s390_print_insn_with_opcode (bfd_vma memaddr, char separator; /* Mnemonic. */ - info->fprintf_func (info->stream, "%s", opcode->name); + info->fprintf_styled_func (info->stream, dis_style_mnemonic, + "%s", opcode->name); /* Operands. */ separator = '\t'; @@ -222,24 +223,60 @@ s390_print_insn_with_opcode (bfd_vma memaddr, } if (flags & S390_OPERAND_GPR) - info->fprintf_func (info->stream, "%c%%r%u", separator, val.u); + { + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); + info->fprintf_styled_func (info->stream, dis_style_register, + "%%r%u", val.u); + } else if (flags & S390_OPERAND_FPR) - info->fprintf_func (info->stream, "%c%%f%u", separator, val.u); + { + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); + info->fprintf_styled_func (info->stream, dis_style_register, + "%%f%u", val.u); + } else if (flags & S390_OPERAND_VR) - info->fprintf_func (info->stream, "%c%%v%i", separator, val.u); + { + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); + info->fprintf_styled_func (info->stream, dis_style_register, + "%%v%i", val.u); + } else if (flags & S390_OPERAND_AR) - info->fprintf_func (info->stream, "%c%%a%u", separator, val.u); + { + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); + info->fprintf_styled_func (info->stream, dis_style_register, + "%%a%u", val.u); + } else if (flags & S390_OPERAND_CR) - info->fprintf_func (info->stream, "%c%%c%u", separator, val.u); + { + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); + info->fprintf_styled_func (info->stream, dis_style_register, + "%%c%u", val.u); + } else if (flags & S390_OPERAND_PCREL) { - info->fprintf_func (info->stream, "%c", separator); + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); info->print_address_func (memaddr + val.i + val.i, info); } else if (flags & S390_OPERAND_SIGNED) - info->fprintf_func (info->stream, "%c%i", separator, val.i); + { + enum disassembler_style style; + + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); + style = ((flags & S390_OPERAND_DISP) + ? dis_style_address_offset : dis_style_immediate); + info->fprintf_styled_func (info->stream, style, "%i", val.i); + } else { + enum disassembler_style style; + if (flags & S390_OPERAND_OR1) val.u &= ~1; if (flags & S390_OPERAND_OR2) @@ -251,14 +288,18 @@ s390_print_insn_with_opcode (bfd_vma memaddr, && val.u == 0 && opindex[1] == 0) break; - info->fprintf_func (info->stream, "%c%u", separator, val.u); + info->fprintf_styled_func (info->stream, dis_style_text, + "%c", separator); + style = ((flags & S390_OPERAND_DISP) + ? dis_style_address_offset : dis_style_immediate); + info->fprintf_styled_func (info->stream, style, "%u", val.u); } if (flags & S390_OPERAND_DISP) separator = '('; else if (flags & S390_OPERAND_BASE) { - info->fprintf_func (info->stream, ")"); + info->fprintf_styled_func (info->stream, dis_style_text, ")"); separator = ','; } else @@ -361,19 +402,33 @@ print_insn_s390 (bfd_vma memaddr, struct disassemble_info *info) value = (value << 8) + (unsigned int) buffer[1]; value = (value << 8) + (unsigned int) buffer[2]; value = (value << 8) + (unsigned int) buffer[3]; - info->fprintf_func (info->stream, ".long\t0x%08x", value); + info->fprintf_styled_func (info->stream, dis_style_assembler_directive, + ".long"); + info->fprintf_styled_func (info->stream, dis_style_text, + "\t"); + info->fprintf_styled_func (info->stream, dis_style_immediate, + "0x%08x", value); return 4; case 2: value = (unsigned int) buffer[0]; value = (value << 8) + (unsigned int) buffer[1]; - info->fprintf_func (info->stream, ".short\t0x%04x", value); + info->fprintf_styled_func (info->stream, dis_style_assembler_directive, + ".short"); + info->fprintf_styled_func (info->stream, dis_style_text, + "\t"); + info->fprintf_styled_func (info->stream, dis_style_immediate, + "0x%04x", value); return 2; default: - info->fprintf_func (info->stream, ".byte\t0x%02x", - (unsigned int) buffer[0]); + info->fprintf_styled_func (info->stream, dis_style_assembler_directive, + ".byte"); + info->fprintf_styled_func (info->stream, dis_style_text, + "\t"); + info->fprintf_styled_func (info->stream, dis_style_immediate, + "0x%02x", (unsigned int) buffer[0]); for (i = 1; i < bytes_to_dump; i++) - info->fprintf_func (info->stream, ",0x%02x", - (unsigned int) buffer[i]); + info->fprintf_styled_func (info->stream, dis_style_immediate, + "0x%02x", (unsigned int) buffer[i]); return bytes_to_dump; } return 0; |