gdb/disasm: read opcodes bytes with a single read_code call
authorAndrew Burgess <aburgess@redhat.com>
Thu, 23 Jun 2022 10:49:08 +0000 (11:49 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Sun, 2 Oct 2022 10:57:30 +0000 (11:57 +0100)
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.

gdb/disasm.c
gdb/disasm.h

index 989120e05b18998cf7e923af340c34958a12f8af..ba6ac2d4827e190d03f6d120b3d2ffd353838399 100644 (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);
index 09cb392176717f173336f565f81ab843723eeae1..dab6116cd007f58c8f8f95be5448a53ac9951e6d 100644 (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