[PATCH v3 3/6] opcodes/loongarch: implement style support in the disassembler
Andrew Burgess
aburgess@redhat.com
Tue Jan 17 10:37:44 GMT 2023
WANG Xuerui <i.swmail@xen0n.name> writes:
> From: WANG Xuerui <git@xen0n.name>
>
> Update the LoongArch disassembler to supply style information to the
> disassembler output. The output formatting remains unchanged.
> ---
> opcodes/disassemble.c | 5 +++++
> opcodes/loongarch-dis.c | 41 ++++++++++++++++++++++-------------------
> 2 files changed, 27 insertions(+), 19 deletions(-)
>
> diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c
> index b8e0bd14b51..f4adbe555ee 100644
> --- a/opcodes/disassemble.c
> +++ b/opcodes/disassemble.c
> @@ -647,6 +647,11 @@ disassemble_init_for_target (struct disassemble_info * info)
> info->skip_zeroes = 16;
> break;
> #endif
> +#ifdef ARCH_loongarch
> + case bfd_arch_loongarch:
> + info->created_styled_output = true;
> + break;
> +#endif
> #ifdef ARCH_tic4x
> case bfd_arch_tic4x:
> info->skip_zeroes = 32;
> diff --git a/opcodes/loongarch-dis.c b/opcodes/loongarch-dis.c
> index d0a66e7a2a4..44f035b2181 100644
> --- a/opcodes/loongarch-dis.c
> +++ b/opcodes/loongarch-dis.c
> @@ -136,7 +136,7 @@ dis_one_arg (char esc1, char esc2, const char *bit_field,
> if (esc1)
> {
> if (need_comma)
> - info->fprintf_func (info->stream, ", ");
> + info->fprintf_styled_func (info->stream, dis_style_text, ", ");
> need_comma = 1;
> imm = loongarch_decode_imm (bit_field, insn, 1);
> u_imm = loongarch_decode_imm (bit_field, insn, 0);
> @@ -145,35 +145,38 @@ dis_one_arg (char esc1, char esc2, const char *bit_field,
> switch (esc1)
> {
> case 'r':
> - info->fprintf_func (info->stream, "%s", loongarch_r_disname[u_imm]);
> + info->fprintf_styled_func (info->stream, dis_style_register, "%s", loongarch_r_disname[u_imm]);
> break;
> case 'f':
> - info->fprintf_func (info->stream, "%s", loongarch_f_disname[u_imm]);
> + info->fprintf_styled_func (info->stream, dis_style_register, "%s", loongarch_f_disname[u_imm]);
> break;
> case 'c':
> switch (esc2)
> {
> case 'r':
> - info->fprintf_func (info->stream, "%s", loongarch_cr_disname[u_imm]);
> + info->fprintf_styled_func (info->stream, dis_style_register, "%s", loongarch_cr_disname[u_imm]);
> break;
> default:
> - info->fprintf_func (info->stream, "%s", loongarch_c_disname[u_imm]);
> + info->fprintf_styled_func (info->stream, dis_style_register, "%s", loongarch_c_disname[u_imm]);
> }
> break;
> case 'v':
> - info->fprintf_func (info->stream, "%s", loongarch_v_disname[u_imm]);
> + info->fprintf_styled_func (info->stream, dis_style_register, "%s", loongarch_v_disname[u_imm]);
> break;
> case 'x':
> - info->fprintf_func (info->stream, "%s", loongarch_x_disname[u_imm]);
> + info->fprintf_styled_func (info->stream, dis_style_register, "%s", loongarch_x_disname[u_imm]);
> break;
> case 'u':
> - info->fprintf_func (info->stream, "0x%x", u_imm);
> + info->fprintf_styled_func (info->stream, dis_style_immediate, "0x%x", u_imm);
> break;
> case 's':
> if (imm == 0)
> - info->fprintf_func (info->stream, "%d", imm);
> + info->fprintf_styled_func (info->stream, dis_style_immediate, "%d", imm);
> else
> - info->fprintf_func (info->stream, "%d(0x%x)", imm, u_imm);
> + {
> + info->fprintf_styled_func (info->stream, dis_style_immediate, "%d", imm);
> + info->fprintf_styled_func (info->stream, dis_style_text, "(0x%x)", u_imm);
> + }
> switch (esc2)
> {
> case 'b':
> @@ -227,32 +230,32 @@ disassemble_one (insn_t insn, struct disassemble_info *info)
> for (i = 31; 0 <= i; i--)
> {
> if (t & insn)
> - info->fprintf_func (info->stream, "1");
> + info->fprintf_styled_func (info->stream, dis_style_text, "1");
> else
> - info->fprintf_func (info->stream, "0");
> + info->fprintf_styled_func (info->stream, dis_style_text, "0");
> if (have_space[i])
> - info->fprintf_func (info->stream, " ");
> + info->fprintf_styled_func (info->stream, dis_style_text, " ");
> t = t >> 1;
> }
> - info->fprintf_func (info->stream, "\t");
> + info->fprintf_styled_func (info->stream, dis_style_text, "\t");
> #endif
>
> if (!opc)
> {
> info->insn_type = dis_noninsn;
> - info->fprintf_func (info->stream, "0x%08x", insn);
> + info->fprintf_styled_func (info->stream, dis_style_immediate, "0x%08x", insn);
> return;
> }
>
> info->insn_type = dis_nonbranch;
> - info->fprintf_func (info->stream, "%-12s", opc->name);
> + info->fprintf_styled_func (info->stream, dis_style_mnemonic, "%-12s", opc->name);
>
> {
> char *fake_args = xmalloc (strlen (opc->format) + 1);
> const char *fake_arg_strs[MAX_ARG_NUM_PLUS_2];
> strcpy (fake_args, opc->format);
> if (0 < loongarch_split_args_by_comma (fake_args, fake_arg_strs))
> - info->fprintf_func (info->stream, "\t");
> + info->fprintf_styled_func (info->stream, dis_style_text, "\t");
> info->private_data = &insn;
> loongarch_foreach_args (opc->format, fake_arg_strs, dis_one_arg, info);
> free (fake_args);
> @@ -260,11 +263,11 @@ disassemble_one (insn_t insn, struct disassemble_info *info)
>
> if (info->insn_type == dis_branch || info->insn_type == dis_condbranch
> /* Someother if we have extra info to print. */)
> - info->fprintf_func (info->stream, "\t#");
> + info->fprintf_styled_func (info->stream, dis_style_text, "\t#");
Based just on the preceding comment, I'm guessing the '#' here is the
start of a comment. There is a dis_style_comment_start which styles
everything from the first dis_style_comment_start until the end of the
line, as a comment, thus:
info->fprintf_styled_func (info->stream, dis_style_comment_start, "#");
info->fprintf_styled_func (info->stream, dis_style_text, " This is text!");
Will style both of these using the comment style, despite the second
item being given the dis_style_text.
Additionally, I notice that the `if` condition that guards the printing
of '\t#' is identical to the immediately following `if`, so you could
fold the `\t#` into the second if block.
Thanks,
Andrew
>
> if (info->insn_type == dis_branch || info->insn_type == dis_condbranch)
> {
> - info->fprintf_func (info->stream, " ");
> + info->fprintf_styled_func (info->stream, dis_style_text, " ");
> info->print_address_func (info->target, info);
> }
> }
> --
> 2.38.1
More information about the Binutils
mailing list