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:
Thomas Troeger 2020-02-06 13:17:19 +00:00 committed by Nick Clifton
parent 986ac31487
commit ece128295e
2 changed files with 53 additions and 37 deletions

View file

@ -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

View file

@ -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;