From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by sourceware.org (Postfix) with ESMTPS id 43C2F3858C51 for ; Mon, 18 Jul 2022 11:25:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 43C2F3858C51 Received: by mail-wm1-x336.google.com with SMTP id x23-20020a05600c179700b003a30e3e7989so4946710wmo.0 for ; Mon, 18 Jul 2022 04:25:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4eO/YAVolSA8tWs1BLmgYU7YWwBS4lZCrhuAzoFpCOI=; b=cCugrJ2cyHu6cKHILRxoEN5oBSeEd78pw/r/GG5wIUXOC1atH68i5CcM3dt+UhJwW/ bVDXdoh3AaeFvICw6lopPQ66K5cL14u3IA+mGeAbTcgnqNylwEG/dx4ZUehhLJJ1k8ZQ EDgZgvxpILUe8wAIdjKvgv55Na2PEvcItQ4iIxq9RsQ6qvwUYEYaotAmKmkvNm6vH4ib tyHb4/yKyUYlovvcoqJUXCOyIjowBrLcdmRYBNxlow6pNKNahABxlAl1dX22JRQXv5g5 Y/xnDb2TinTptnpW4l6+5DfStB+8SP4fEhjLbm0g0+LAIf/QK1YOue1YTzwxiePM+dPw Y29Q== X-Gm-Message-State: AJIora+qyTWsEFJYzr/Y8pCdG8bC2ug+jwxwUTt2lnkisKc6BcZkRyRM uzxD8lP8kTvYVEPqLT6g33h3M7rgXNo= X-Google-Smtp-Source: AGRyM1tbr/SlzlaoqUQQTawxCR9WSBg97ENNjp+6Q++dtwuQ8FPmAa6vbha+Ohe02ja2wcEBBS8l0Q== X-Received: by 2002:a05:600c:4e46:b0:3a0:4d54:f206 with SMTP id e6-20020a05600c4e4600b003a04d54f206mr32683225wmq.151.1658143515594; Mon, 18 Jul 2022 04:25:15 -0700 (PDT) Received: from fatty.nomansland ([193.187.151.25]) by smtp.gmail.com with ESMTPSA id g20-20020a05600c4ed400b003a2cfb9f5basm21000119wmq.16.2022.07.18.04.25.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Jul 2022 04:25:15 -0700 (PDT) From: Claudiu Zissulescu To: binutils@sourceware.org Cc: fbedard@synopsys.com Subject: [committed 2/2] opcodes/arc: Implement style support in the disassembler Date: Mon, 18 Jul 2022 14:25:01 +0300 Message-Id: <20220718112501.3284580-2-claziss@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220718112501.3284580-1-claziss@gmail.com> References: <20220718112501.3284580-1-claziss@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jul 2022 11:25:19 -0000 Update the ARC disassembler to supply style information to the disassembler output. The output formatting remains unchanged. opcodes/ChangeLog: * disassemble.c (disassemble_init_for_target): Set created_styled_output for ARC based targets. * arc-dis.c (find_format_from_table): Use fprintf_styled_ftype instead of fprintf_ftype throughout. (find_format): Likewise. (print_flags): Likewise. (print_insn_arc): Likewise. Signed-off-by: Claudiu Zissulescu --- opcodes/ChangeLog | 10 +++ opcodes/arc-dis.c | 148 +++++++++++++++++++++++++++++------------- opcodes/disassemble.c | 5 ++ 3 files changed, 117 insertions(+), 46 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 3456b46f29e..3889a80f427 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,13 @@ +2022-07-18 Claudiu Zissulescu + + * disassemble.c (disassemble_init_for_target): Set + created_styled_output for ARC based targets. + * arc-dis.c (find_format_from_table): Use fprintf_styled_ftype + instead of fprintf_ftype throughout. + (find_format): Likewise. + (print_flags): Likewise. + (print_insn_arc): Likewise. + 2022-07-08 Nick Clifton * 2.39 branch created. diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c index 771f786d18e..dbaa96178a8 100644 --- a/opcodes/arc-dis.c +++ b/opcodes/arc-dis.c @@ -375,11 +375,12 @@ find_format_from_table (struct disassemble_info *info, if (warn_p) { - info->fprintf_func (info->stream, - _("\nWarning: disassembly may be wrong due to " - "guessed opcode class choice.\n" - "Use -M to select the correct " - "opcode class(es).\n\t\t\t\t")); + info->fprintf_styled_func + (info->stream, dis_style_text, + _("\nWarning: disassembly may be wrong due to " + "guessed opcode class choice.\n" + "Use -M to select the correct " + "opcode class(es).\n\t\t\t\t")); return t_op; } @@ -436,9 +437,10 @@ find_format (bfd_vma memaddr, opcode = arcExtMap_genOpcode (i, isa_mask, &errmsg); if (opcode == NULL) { - (*info->fprintf_func) (info->stream, - _("An error occurred while generating the " - "extension instruction operations")); + (*info->fprintf_styled_func) + (info->stream, dis_style_text, + _("An error occurred while generating " + "the extension instruction operations")); *opcode_result = NULL; return false; } @@ -514,7 +516,8 @@ print_flags (const struct arc_opcode *opcode, name = arcExtMap_condCodeName (value); if (name) { - (*info->fprintf_func) (info->stream, ".%s", name); + (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic, + ".%s", name); continue; } } @@ -545,7 +548,8 @@ print_flags (const struct arc_opcode *opcode, { /* FIXME!: print correctly nt/t flag. */ if (!special_flag_p (opcode->name, flg_operand->name)) - (*info->fprintf_func) (info->stream, "."); + (*info->fprintf_styled_func) (info->stream, + dis_style_mnemonic, "."); else if (info->insn_type == dis_dref) { switch (flg_operand->name[0]) @@ -580,7 +584,8 @@ print_flags (const struct arc_opcode *opcode, if (cl_flags->flag_class & F_CLASS_WB) arc_infop->writeback_mode = flg_operand->code; - (*info->fprintf_func) (info->stream, "%s", flg_operand->name); + (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic, + "%s", flg_operand->name); } } } @@ -1061,13 +1066,28 @@ print_insn_arc (bfd_vma memaddr, switch (size) { case 1: - (*info->fprintf_func) (info->stream, ".byte\t0x%02lx", data); + (*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%02lx", data); break; case 2: - (*info->fprintf_func) (info->stream, ".short\t0x%04lx", data); + (*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%04lx", data); break; case 4: - (*info->fprintf_func) (info->stream, ".word\t0x%08lx", data); + (*info->fprintf_styled_func) (info->stream, + dis_style_assembler_directive, + ".word"); + (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t"); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "0x%08lx", data); break; default: return -1; @@ -1157,27 +1177,45 @@ print_insn_arc (bfd_vma memaddr, switch (insn_len) { case 2: - (*info->fprintf_func) (info->stream, ".shor\t%#04llx", - insn & 0xffff); + (*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%04llx", insn & 0xffff); break; case 4: - (*info->fprintf_func) (info->stream, ".word\t%#08llx", - insn & 0xffffffff); + (*info->fprintf_styled_func) (info->stream, + dis_style_assembler_directive, + ".word"); + (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t"); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "0x%08llx", insn & 0xffffffff); break; case 6: - (*info->fprintf_func) (info->stream, ".long\t%#08llx", - insn & 0xffffffff); - (*info->fprintf_func) (info->stream, ".long\t%#04llx", - (insn >> 32) & 0xffff); + (*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%08llx", insn & 0xffffffff); + (*info->fprintf_styled_func) (info->stream, dis_style_text, " "); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "0x%04llx", (insn >> 32) & 0xffff); break; case 8: - (*info->fprintf_func) (info->stream, ".long\t%#08llx", - insn & 0xffffffff); - (*info->fprintf_func) (info->stream, ".long\t%#08llx", - insn >> 32); + (*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%08llx", insn & 0xffffffff); + (*info->fprintf_styled_func) (info->stream, dis_style_text, " "); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "0x%08llx", (insn >> 32)); break; default: @@ -1189,7 +1227,8 @@ print_insn_arc (bfd_vma memaddr, } /* Print the mnemonic. */ - (*info->fprintf_func) (info->stream, "%s", opcode->name); + (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic, + "%s", opcode->name); /* Preselect the insn class. */ info->insn_type = arc_opcode_to_insn_type (opcode); @@ -1199,7 +1238,7 @@ print_insn_arc (bfd_vma memaddr, print_flags (opcode, &insn, info); if (opcode->operands[0] != 0) - (*info->fprintf_func) (info->stream, "\t"); + (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t"); need_comma = false; open_braket = false; @@ -1212,7 +1251,7 @@ print_insn_arc (bfd_vma memaddr, { if (open_braket && (operand->flags & ARC_OPERAND_BRAKET)) { - (*info->fprintf_func) (info->stream, "]"); + (*info->fprintf_styled_func) (info->stream, dis_style_text, "]"); open_braket = false; continue; } @@ -1228,16 +1267,16 @@ print_insn_arc (bfd_vma memaddr, if (operand->flags & ARC_OPERAND_COLON) { - (*info->fprintf_func) (info->stream, ":"); + (*info->fprintf_styled_func) (info->stream, dis_style_text, ":"); continue; } if (need_comma) - (*info->fprintf_func) (info->stream, ","); + (*info->fprintf_styled_func) (info->stream, dis_style_text,","); if (!open_braket && (operand->flags & ARC_OPERAND_BRAKET)) { - (*info->fprintf_func) (info->stream, "["); + (*info->fprintf_styled_func) (info->stream, dis_style_text, "["); open_braket = true; need_comma = false; continue; @@ -1268,7 +1307,8 @@ print_insn_arc (bfd_vma memaddr, rname = arcExtMap_coreRegName (value); if (!rname) rname = regnames[value]; - (*info->fprintf_func) (info->stream, "%s", rname); + (*info->fprintf_styled_func) (info->stream, dis_style_register, + "%s", rname); /* Check if we have a double register to print. */ if (operand->flags & ARC_OPERAND_TRUNCATE) @@ -1282,7 +1322,8 @@ print_insn_arc (bfd_vma memaddr, else rname = _("\nWarning: illegal use of double register " "pair.\n"); - (*info->fprintf_func) (info->stream, "%s", rname); + (*info->fprintf_styled_func) (info->stream, dis_style_register, + "%s", rname); } if (value == 63) rpcl = true; @@ -1294,10 +1335,12 @@ print_insn_arc (bfd_vma memaddr, const char *rname = get_auxreg (opcode, value, isa_mask); if (rname && open_braket) - (*info->fprintf_func) (info->stream, "%s", rname); + (*info->fprintf_styled_func) (info->stream, dis_style_register, + "%s", rname); else { - (*info->fprintf_func) (info->stream, "%#x", value); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "%#x", value); if (info->insn_type == dis_branch || info->insn_type == dis_jsr) info->target = (bfd_vma) value; @@ -1307,19 +1350,23 @@ print_insn_arc (bfd_vma memaddr, { const char *rname = get_auxreg (opcode, value, isa_mask); if (rname && open_braket) - (*info->fprintf_func) (info->stream, "%s", rname); + (*info->fprintf_styled_func) (info->stream, dis_style_register, + "%s", rname); else { if (print_hex) - (*info->fprintf_func) (info->stream, "%#x", value); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "%#x", value); else - (*info->fprintf_func) (info->stream, "%d", value); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "%d", value); } } else if (operand->flags & ARC_OPERAND_ADDRTYPE) { const char *addrtype = get_addrtype (value); - (*info->fprintf_func) (info->stream, "%s", addrtype); + (*info->fprintf_styled_func) (info->stream, dis_style_address, + "%s", addrtype); /* A colon follow an address type. */ need_comma = false; } @@ -1337,11 +1384,17 @@ print_insn_arc (bfd_vma memaddr, need_comma = false; break; case 1: - (*info->fprintf_func) (info->stream, "r13"); + (*info->fprintf_styled_func) (info->stream, + dis_style_register, "r13"); break; default: - (*info->fprintf_func) (info->stream, "r13-%s", - regnames[13 + value - 1]); + (*info->fprintf_styled_func) (info->stream, + dis_style_register, "r13"); + (*info->fprintf_styled_func) (info->stream, + dis_style_text, "-"); + (*info->fprintf_styled_func) (info->stream, + dis_style_register, "%s", + regnames[13 + value - 1]); break; } rpcl = false; @@ -1351,9 +1404,11 @@ print_insn_arc (bfd_vma memaddr, { const char *rname = get_auxreg (opcode, value, isa_mask); if (rname && open_braket) - (*info->fprintf_func) (info->stream, "%s", rname); + (*info->fprintf_styled_func) (info->stream, dis_style_register, + "%s", rname); else - (*info->fprintf_func) (info->stream, "%#x", value); + (*info->fprintf_styled_func) (info->stream, dis_style_immediate, + "%" PRIx32, value); } } @@ -1387,7 +1442,8 @@ print_insn_arc (bfd_vma memaddr, the addend is not currently pc-relative. */ memaddr = 0; - (*info->fprintf_func) (info->stream, "\t;"); + (*info->fprintf_styled_func) (info->stream, + dis_style_comment_start, "\t;"); (*info->print_address_func) ((memaddr & ~3) + vpcl, info); } diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index bd37f042b31..e2e5a2608d6 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -612,6 +612,11 @@ disassemble_init_for_target (struct disassemble_info * info) info->disassembler_needs_relocs = true; break; #endif +#ifdef ARCH_arc + case bfd_arch_arc: + info->created_styled_output = true; + break; +#endif #ifdef ARCH_arm case bfd_arch_arm: info->symbol_is_valid = arm_symbol_is_valid; -- 2.30.2