* New commands
+set style line-number foreground COLOR
+set style line-number background COLOR
+set style line-number intensity VALUE
+ Control the styling of line numbers printed by GDB.
+
maintenance info inline-frames [ADDRESS]
New command which displays GDB's inline-frame information for the
current address, or for ADDRESS if specified. The output identifies
if (uiout->is_mi_like_p ())
uiout->field_string ("fullname", symtab_to_fullname (loc->symtab));
- uiout->field_signed ("line", loc->line_number);
+ uiout->field_signed ("line", loc->line_number,
+ line_number_style.style ());
}
else if (loc)
{
{
const char *filename
= symtab_to_filename_for_display (bl.symtab);
- gdb_printf (": file %ps, line %d.",
+ gdb_printf (": file %ps, line %ps.",
styled_string (file_name_style.style (),
filename),
- bl.line_number);
+ styled_string (line_number_style.style (),
+ pulongest (bl.line_number)));
}
else
/* This is not ideal, but each location may have a
uiout->field_string ("fullname", fullname);
}
- uiout->field_signed ("line", sal2.line);
+ uiout->field_signed ("line", sal2.line, line_number_style.style ());
uiout->text ("\n");
tp->first_loc ().line_number = sal2.line;
void
cli_ui_out::do_field_signed (int fldno, int width, ui_align alignment,
- const char *fldname, LONGEST value)
+ const char *fldname, LONGEST value,
+ const ui_file_style &style)
{
if (m_suppress_output)
return;
do_field_string (fldno, width, alignment, fldname, plongest (value),
- ui_file_style ());
+ style);
}
/* output an unsigned field */
virtual void do_begin (ui_out_type type, const char *id) override;
virtual void do_end (ui_out_type type) override;
virtual void do_field_signed (int fldno, int width, ui_align align,
- const char *fldname, LONGEST value) override;
+ const char *fldname, LONGEST value,
+ const ui_file_style &style) override;
virtual void do_field_unsigned (int fldno, int width, ui_align align,
const char *fldname, ULONGEST value)
override;
const char *sym_name = NULL;
if (sal.symbol != NULL)
sym_name = sal.symbol->print_name ();
- gdb_printf (_("file: \"%s\", line number: %d, symbol: \"%s\"\n"),
+ gdb_printf (_("file: \"%s\", line number: %ps, symbol: \"%s\"\n"),
symtab_to_filename_for_display (sal.symtab),
- sal.line, sym_name != NULL ? sym_name : "???");
+ styled_string (line_number_style.style (),
+ pulongest (sal.line)),
+ sym_name != NULL ? sym_name : "???");
}
/* Print a list of files and line numbers which a user may choose from
/* See cli-style.h. */
+cli_style_option line_number_style ("line-number", ui_file_style::DIM);
+
+/* See cli-style.h. */
+
cli_style_option::cli_style_option (const char *name,
ui_file_style::basic_color fg,
ui_file_style::intensity intensity)
&style_disasm_show_list,
false);
+ line_number_style.add_setshow_commands (no_class, _("\
+Line number display styling.\n\
+Configure colors and display intensity for line numbers\n\
+The \"line-number\" style is used when GDB displays line numbers\n\
+coming from your source code."),
+ &style_set_list, &style_show_list,
+ false);
+
/* Setup 'disassembler address' style and 'disassembler symbol' style,
these are aliases for 'address' and 'function' styles respectively. */
add_alias_cmd ("address", address_prefix_cmds.set, no_class, 0,
/* The style to use for the GDB version string. */
extern cli_style_option version_style;
+/* The style for a line number. */
+extern cli_style_option line_number_style;
+
/* True if source styling is enabled. */
extern bool source_styling;
(@pxref{style_disassembler_enabled,,@kbd{set style disassembler
enabled}}).
+@item line-number
+Control the styling of line numbers. By default, this style's
+intensity is dim.
+
@item variable
Control the styling of variable names. These are managed with the
@code{set style variable} family of commands. By default, this style's
find_pc_mapped_section (sal.pc));
if (fn != nullptr && sfn != fn)
{
- if (!query (_("Line %d is not in `%s'. Jump anyway? "), sal.line,
+ if (!query (_("Line %ps is not in `%s'. Jump anyway? "),
+ styled_string (line_number_style.style (),
+ pulongest (sal.line)),
fn->print_name ()))
{
error (_("Not confirmed."));
const char *tblid)
{
open (tblid, ui_out_type_tuple);
- do_field_signed (-1, -1, ui_left, "nr_rows", nr_rows);
- do_field_signed (-1, -1, ui_left, "nr_cols", nr_cols);
+ do_field_signed (-1, -1, ui_left, "nr_rows", nr_rows, ui_file_style ());
+ do_field_signed (-1, -1, ui_left, "nr_cols", nr_cols, ui_file_style ());
open ("hdr", ui_out_type_list);
}
const std::string &col_hdr)
{
open (NULL, ui_out_type_tuple);
- do_field_signed (0, 0, ui_center, "width", width);
- do_field_signed (0, 0, ui_center, "alignment", alignment);
+ do_field_signed (0, 0, ui_center, "width", width, ui_file_style ());
+ do_field_signed (0, 0, ui_center, "alignment", alignment, ui_file_style ());
do_field_string (0, 0, ui_center, "col_name", col_name.c_str (),
ui_file_style ());
do_field_string (0, width, alignment, "colhdr", col_hdr.c_str (),
void
mi_ui_out::do_field_signed (int fldno, int width, ui_align alignment,
- const char *fldname, LONGEST value)
+ const char *fldname, LONGEST value,
+ const ui_file_style &style)
{
do_field_string (fldno, width, alignment, fldname, plongest (value),
- ui_file_style ());
+ style);
}
/* Output an unsigned field. */
virtual void do_begin (ui_out_type type, const char *id) override;
virtual void do_end (ui_out_type type) override;
virtual void do_field_signed (int fldno, int width, ui_align align,
- const char *fldname, LONGEST value) override;
+ const char *fldname, LONGEST value,
+ const ui_file_style &style) override;
virtual void do_field_unsigned (int fldno, int width, ui_align align,
const char *fldname, ULONGEST value)
override;
out->text (":");
annotate_frame_source_line ();
- out->field_signed ("line", line);
+ out->field_signed ("line", line, line_number_style.style ());
}
}
if (out->is_mi_like_p ())
void
py_ui_out::do_field_signed (int fldno, int width, ui_align align,
- const char *fldname, LONGEST value)
+ const char *fldname, LONGEST value,
+ const ui_file_style &style)
{
if (m_error.has_value ())
return;
void do_end (ui_out_type type) override;
void do_field_signed (int fldno, int width, ui_align align,
- const char *fldname, LONGEST value) override;
+ const char *fldname, LONGEST value,
+ const ui_file_style &style) override;
void do_field_unsigned (int fldno, int width, ui_align align,
const char *fldname, ULONGEST value) override;
fields. ui_source_list is set only for CLI, not for
TUI. */
- uiout->field_signed ("line", line);
+ uiout->field_signed ("line", line, line_number_style.style ());
uiout->text ("\tin ");
uiout->field_string ("file", symtab_to_filename_for_display (s),
uiout->text (symtab_to_filename_for_display (s));
uiout->text (":");
}
- xsnprintf (buf, sizeof (buf), "%d\t", new_lineno++);
- uiout->text (buf);
+
+ uiout->message ("%ps\t", styled_string (line_number_style.style (),
+ pulongest (new_lineno)));
+ ++new_lineno;
while (*iter != '\0')
{
if (start_pc == end_pc)
{
- gdb_printf ("Line %d of \"%s\"",
- sal.line,
+ gdb_printf ("Line %ps of \"%s\"",
+ styled_string (line_number_style.style (),
+ pulongest (sal.line)),
symtab_to_filename_for_display (sal.symtab));
gdb_stdout->wrap_here (2);
gdb_printf (" is at address ");
}
else
{
- gdb_printf ("Line %d of \"%s\"",
- sal.line,
+ gdb_printf ("Line %ps of \"%s\"",
+ styled_string (line_number_style.style (),
+ pulongest (sal.line)),
symtab_to_filename_for_display (sal.symtab));
gdb_stdout->wrap_here (2);
gdb_printf (" starts at address ");
/* Is there any case in which we get here, and have an address
which the user would want to see? If we have debugging symbols
and no line numbers? */
- gdb_printf (_("Line number %d is out of range for \"%s\".\n"),
- sal.line, symtab_to_filename_for_display (sal.symtab));
+ gdb_printf (_("Line number %ps is out of range for \"%s\".\n"),
+ styled_string (line_number_style.style (),
+ pulongest (sal.line)),
+ symtab_to_filename_for_display (sal.symtab));
}
}
\f
annotate_frame_source_file_end ();
uiout->text (":");
annotate_frame_source_line ();
- uiout->field_signed ("line", sal.line);
+ uiout->field_signed ("line", sal.line, line_number_style.style ());
annotate_frame_source_end ();
}
ui_out_emit_tuple tuple_emitter (uiout, nullptr);
uiout->field_signed ("index", i);
if (item->line > 0)
- uiout->field_signed ("line", item->line);
+ uiout->field_signed ("line", item->line,
+ line_number_style.style ());
else
uiout->field_string ("line", _("END"));
uiout->field_core_addr ("rel-address", objfile->arch (),
set main_expr [style main function]
set base_file_expr [style ".*style\\.c" file]
- set file_expr "$base_file_expr:\[0-9\]"
+ set line_expr [style $decimal line-number]
+ set file_expr "$base_file_expr:$line_expr"
set arg_expr [style "arg." variable]
gdb_test "frame" \
"$main_expr.*$arg_expr.*$arg_expr.*$file_expr.*"
set main_expr [limited_style main function]
set base_file_expr [limited_style ".*style\\.c" file]
- set file_expr "$base_file_expr:\[0-9\]+"
+ set line_expr [limited_style $decimal line-number]
+ set file_expr "$base_file_expr:$line_expr"
set arg_expr [limited_style "arg." variable]
# On some embedded targets that don't fully support argc/argv,
gdb_test "frame" \
[multi_line \
"#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+$arg_expr=$hex.*\\)\\s+at\\s+$file_expr" \
- "\[0-9\]+\\s+.*return.* break here .*"]
+ "$line_expr\\s+.*return.* break here .*"]
gdb_test "info breakpoints" "$main_expr at $file_expr.*"
gdb_test_no_output "set style sources off"
gdb_test "frame" \
- "\r\n\[^\033\]*break here.*" \
+ "\r\n$line_expr\[^\033\]*break here.*" \
"frame without sources styling"
gdb_test_no_output "set style sources on"
[multi_line \
"#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+$arg_expr=$hex\\)" \
"\\s+at\\s+$file_expr" \
- "\[0-9\]+\\s+.*return.* break here .*"]
+ "$line_expr\\s+.*return.* break here .*"]
set re1_styled \
[multi_line \
"#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+" \
"\\s+$arg_expr=$hex.*\\)" \
"\\s+at\\s+$file_expr" \
- "\[0-9\]+\\s+.*return.* break here .*"]
+ "$line_expr\\s+.*return.* break here .*"]
set re2_styled \
[multi_line \
"#0\\s+$main_expr\\s+\\($arg_expr=.*" \
"\\s+$arg_expr=$hex.*\\)\\s+at\\s+$file_expr" \
- "\[0-9\]+\\s+.*return.* break here .*"]
+ "$line_expr\\s+.*return.* break here .*"]
# The length of the line containing argv containing:
# - 4 leading spaces
# STYLE can either be the payload part of an ANSI terminal sequence,
# or a shorthand for one of the gdb standard styles: "file",
-# "function", "variable", or "address".
+# "function", "variable", "address", etc.
proc style {str style} {
switch -exact -- $style {
address { set style 34 }
metadata { set style 2 }
version { set style "35;1" }
+ line-number { set style 2 }
none { return $str }
}
return "\033\\\[${style}m${str}\033\\\[m"
# the "at foo.c:36" output we get with -g.
# the "in func" output we get without -g.
gdb_expect {
- -re "(?:Break|Temporary break).* at .*:$decimal.*$gdb_prompt $" {
+ -re "(?:Break|Temporary break).* at .*:.*$decimal.*$gdb_prompt $" {
if { $print_pass } {
pass $test_name
}
{
if (start_pc == end_pc)
{
- gdb_printf ("Line %d of \"%s\"",
- sal.line,
+ gdb_printf ("Line %ps of \"%s\"",
+ styled_string (line_number_style.style (),
+ pulongest (sal.line)),
symtab_to_filename_for_display (sal.symtab));
gdb_stdout->wrap_here (2);
gdb_printf (" is at address ");
if (sal.line > 0
&& find_line_pc_range (sal, &start_pc, &end_pc)
&& start_pc != end_pc)
- gdb_printf ("Attempting to find line %d instead.\n",
- sal.line);
+ gdb_printf ("Attempting to find line %ps instead.\n",
+ styled_string (line_number_style.style (),
+ pulongest (sal.line)));
else
error (_("Cannot find a good line."));
}
else
uiout->field_skip ("fullname");
- uiout->field_signed ("line", sal.line);
+ uiout->field_signed ("line", sal.line, line_number_style.style ());
}
else
{
#include "tui/tui-winsource.h"
#include "tui/tui-source.h"
#include "tui/tui-location.h"
+#include "tui/tui-io.h"
+#include "cli/cli-style.h"
+
+tui_source_window::tui_source_window ()
+{
+ line_number_style.changed.attach
+ (std::bind (&tui_source_window::style_changed, this),
+ m_src_observable, "tui-source");
+}
+
+tui_source_window::~tui_source_window ()
+{
+ line_number_style.changed.detach (m_src_observable);
+}
/* Function to display source in the source window. */
bool
tui_left_margin_verbose ? "%0*d%c" : "%*d%c", m_digits - 1,
lineno, space);
}
+ tui_apply_style (handle.get (), line_number_style.style ());
display_string (text);
+ tui_apply_style (handle.get (), ui_file_style ());
}
struct tui_source_window : public tui_source_window_base
{
- tui_source_window () = default;
+ tui_source_window ();
+ ~tui_source_window ();
DISABLE_COPY_AND_ASSIGN (tui_source_window);
/* It is the resolved form as returned by symtab_to_fullname. */
gdb::unique_xmalloc_ptr<char> m_fullname;
+
+ /* A token used to register and unregister an observer. */
+ gdb::observers::token m_src_observable;
};
/* Return the instance of the source window. */
update_source_windows_with_addr. */
void update_source_window_with_addr (struct gdbarch *, CORE_ADDR);
+protected:
+
+ /* Called when a user style setting is changed. */
+ void style_changed ();
+
private:
/* Used for horizontal scroll. */
the initial escape that sets the color will still be applied. */
void puts_to_pad_with_skip (const char *string, int skip);
- /* Called when the user "set style enabled" setting is changed. */
- void style_changed ();
-
/* A token used to register and unregister an observer. */
gdb::observers::token m_observable;
}
void
-ui_out::field_signed (const char *fldname, LONGEST value)
+ui_out::field_signed (const char *fldname, LONGEST value,
+ const ui_file_style &style)
{
int fldno;
int width;
verify_field (&fldno, &width, &align);
- do_field_signed (fldno, width, align, fldname, value);
+ do_field_signed (fldno, width, align, fldname, value, style);
}
void
verify_field (&fldno, &width, &align);
- do_field_signed (fldno, input_width, input_align, fldname, value);
+ do_field_signed (fldno, input_width, input_align, fldname, value,
+ ui_file_style ());
}
/* See ui-out.h. */
void begin (ui_out_type type, const char *id);
void end (ui_out_type type);
- void field_signed (const char *fldname, LONGEST value);
+ void field_signed (const char *fldname, LONGEST value,
+ const ui_file_style &style = ui_file_style ());
void field_fmt_signed (int width, ui_align align, const char *fldname,
LONGEST value);
/* Like field_signed, but print an unsigned value. */
virtual void do_begin (ui_out_type type, const char *id) = 0;
virtual void do_end (ui_out_type type) = 0;
virtual void do_field_signed (int fldno, int width, ui_align align,
- const char *fldname, LONGEST value) = 0;
+ const char *fldname, LONGEST value,
+ const ui_file_style &style) = 0;
virtual void do_field_unsigned (int fldno, int width, ui_align align,
const char *fldname, ULONGEST value) = 0;
virtual void do_field_skip (int fldno, int width, ui_align align,
}
/* Format the question outside of the loop, to avoid reusing args. */
- std::string question = string_vprintf (ctlstr, args);
+ string_file tem (gdb_stdout->can_emit_style_escape ());
+ gdb_vprintf (&tem, ctlstr, args);
+ std::string question = tem.release ();
std::string prompt
= string_printf (_("%s%s(%s or %s) %s"),
annotation_level > 1 ? "\n\032\032pre-query\n" : "",