Jump visualization: Handle the case where the disassembled bytes occupy two lines.
* objdump.c (print_jump_visualisation): New function. (disassemble_bytes): Call new function.
This commit is contained in:
parent
986ac31487
commit
ece128295e
2 changed files with 53 additions and 37 deletions
|
@ -1,3 +1,8 @@
|
|||
2020-02-06 Thomas Troeger <tstroege@gmx.de>
|
||||
|
||||
* objdump.c (print_jump_visualisation): New function.
|
||||
(disassemble_bytes): Call new function.
|
||||
|
||||
2020-02-06 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* testsuite/lib/binutils-common.exp (match_target): Accept '!' before
|
||||
|
|
|
@ -2474,6 +2474,47 @@ null_print (const void * stream ATTRIBUTE_UNUSED, const char * format ATTRIBUTE_
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Print out jump visualization. */
|
||||
|
||||
static void
|
||||
print_jump_visualisation (bfd_vma addr, int max_level, char *line_buffer,
|
||||
uint8_t *color_buffer)
|
||||
{
|
||||
if (!line_buffer)
|
||||
return;
|
||||
|
||||
jump_info_visualize_address (addr, max_level, line_buffer, color_buffer);
|
||||
|
||||
size_t line_buffer_size = strlen (line_buffer);
|
||||
char last_color = 0;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i <= line_buffer_size; ++i)
|
||||
{
|
||||
if (color_output)
|
||||
{
|
||||
uint8_t color = (i < line_buffer_size) ? color_buffer[i]: 0;
|
||||
|
||||
if (color != last_color)
|
||||
{
|
||||
if (color)
|
||||
if (extended_color_output)
|
||||
/* Use extended 8bit color, but
|
||||
do not choose dark colors. */
|
||||
printf ("\033[38;5;%dm", 124 + (color % 108));
|
||||
else
|
||||
/* Use simple terminal colors. */
|
||||
printf ("\033[%dm", 31 + (color % 7));
|
||||
else
|
||||
/* Clear color. */
|
||||
printf ("\033[0m");
|
||||
last_color = color;
|
||||
}
|
||||
}
|
||||
putchar ((i < line_buffer_size) ? line_buffer[i]: ' ');
|
||||
}
|
||||
}
|
||||
|
||||
/* Disassemble some data in memory between given values. */
|
||||
|
||||
static void
|
||||
|
@ -2632,44 +2673,10 @@ disassemble_bytes (struct disassemble_info * inf,
|
|||
putchar (' ');
|
||||
}
|
||||
|
||||
/* Visualize jumps. */
|
||||
if (line_buffer)
|
||||
{
|
||||
jump_info_visualize_address (section->vma + addr_offset,
|
||||
max_level,
|
||||
line_buffer,
|
||||
print_jump_visualisation (section->vma + addr_offset,
|
||||
max_level, line_buffer,
|
||||
color_buffer);
|
||||
|
||||
size_t line_buffer_size = strlen (line_buffer);
|
||||
char last_color = 0;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i <= line_buffer_size; ++i)
|
||||
{
|
||||
if (color_output)
|
||||
{
|
||||
uint8_t color = (i < line_buffer_size) ? color_buffer[i]: 0;
|
||||
|
||||
if (color != last_color)
|
||||
{
|
||||
if (color)
|
||||
if (extended_color_output)
|
||||
/* Use extended 8bit color, but
|
||||
do not choose dark colors. */
|
||||
printf ("\033[38;5;%dm", 124 + (color % 108));
|
||||
else
|
||||
/* Use simple terminal colors. */
|
||||
printf ("\033[%dm", 31 + (color % 7));
|
||||
else
|
||||
/* Clear color. */
|
||||
printf ("\033[0m");
|
||||
last_color = color;
|
||||
}
|
||||
}
|
||||
putchar ((i < line_buffer_size) ? line_buffer[i]: ' ');
|
||||
}
|
||||
}
|
||||
|
||||
if (insns)
|
||||
{
|
||||
sfile.pos = 0;
|
||||
|
@ -2860,6 +2867,10 @@ disassemble_bytes (struct disassemble_info * inf,
|
|||
*--s = '0';
|
||||
printf ("%s:\t", buf + skip_addr_chars);
|
||||
|
||||
print_jump_visualisation (section->vma + j / opb,
|
||||
max_level, line_buffer,
|
||||
color_buffer);
|
||||
|
||||
pb += octets_per_line;
|
||||
if (pb > octets)
|
||||
pb = octets;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue