gdb/disasm: read opcodes bytes with a single read_code call

This commit reduces the number of times we call read_code when
printing the instruction opcode bytes during disassembly.

I've added a new gdb::byte_vector within the
gdb_pretty_print_disassembler class, in line with all the other
buffers that gdb_pretty_print_disassembler needs.  This byte_vector is
then resized as needed, and filled with a single read_code call for
each instruction.

There should be no user visible changes after this commit.
This commit is contained in:
Andrew Burgess 2022-06-23 11:49:08 +01:00
parent 21a52f7d82
commit d309a8f9b3
2 changed files with 10 additions and 9 deletions

View file

@ -459,21 +459,19 @@ gdb_pretty_print_disassembler::pretty_print_insn (const struct disasm_insn *insn
if (flags & DISASSEMBLY_RAW_INSN)
{
CORE_ADDR end_pc;
bfd_byte data;
const char *spacer = "";
/* Build the opcodes using a temporary stream so we can
write them out in a single go for the MI. */
m_opcode_stb.clear ();
end_pc = pc + size;
/* Read the instruction opcode data. */
m_opcode_data.resize (size);
read_code (pc, m_opcode_data.data (), size);
for (;pc < end_pc; ++pc)
for (int i = 0; i < size; ++i)
{
read_code (pc, &data, 1);
m_opcode_stb.printf ("%s%02x", spacer, (unsigned) data);
spacer = " ";
if (i > 0)
m_opcode_stb.puts (" ");
m_opcode_stb.printf ("%02x", (unsigned) m_opcode_data[i]);
}
m_uiout->field_stream ("opcodes", m_opcode_stb);

View file

@ -344,6 +344,9 @@ private:
/* The buffer used to build the raw opcodes string. */
string_file m_opcode_stb;
/* The buffer used to hold the opcode bytes (if required). */
gdb::byte_vector m_opcode_data;
};
/* Return the length in bytes of the instruction at address MEMADDR in