@@ -186,7 +186,8 @@ struct extension_language_ops
(const struct extension_language_defn *,
const frame_info_ptr &frame, frame_filter_flags flags,
enum ext_lang_frame_args args_type,
- struct ui_out *out, int frame_low, int frame_high);
+ struct ui_out *out, int frame_low, int frame_high,
+ const frame_info_ptr &selected_frame);
/* Used for registering the ptwrite filter to the current thread. */
void (*apply_ptwrite_filter)
@@ -521,7 +521,8 @@ apply_ext_lang_frame_filter (const frame_info_ptr &frame,
frame_filter_flags flags,
enum ext_lang_frame_args args_type,
struct ui_out *out,
- int frame_low, int frame_high)
+ int frame_low, int frame_high,
+ const frame_info_ptr &selected_frame)
{
for (const struct extension_language_defn *extlang : extension_languages)
{
@@ -531,8 +532,9 @@ apply_ext_lang_frame_filter (const frame_info_ptr &frame,
|| extlang->ops->apply_frame_filter == NULL)
continue;
status = extlang->ops->apply_frame_filter (extlang, frame, flags,
- args_type, out,
- frame_low, frame_high);
+ args_type, out,
+ frame_low, frame_high,
+ selected_frame);
/* We use the filters from the first extension language that has
applicable filters. Also, an error is reported immediately
rather than continue trying. */
@@ -302,7 +302,8 @@ extern int apply_ext_lang_val_pretty_printer
extern enum ext_lang_bt_status apply_ext_lang_frame_filter
(const frame_info_ptr &frame, frame_filter_flags flags,
enum ext_lang_frame_args args_type,
- struct ui_out *out, int frame_low, int frame_high);
+ struct ui_out *out, int frame_low, int frame_high,
+ const frame_info_ptr &selected_frame);
extern void apply_ext_lang_ptwrite_filter
(struct btrace_thread_info *btinfo);
@@ -899,7 +899,8 @@ extern void print_stack_frame (const frame_info_ptr &, int print_level,
extern void print_frame_info (const frame_print_options &fp_opts,
const frame_info_ptr &, int print_level,
enum print_what print_what, int args,
- int set_current_sal);
+ int set_current_sal,
+ const frame_info_ptr &selected_frame);
extern frame_info_ptr block_innermost_frame (const struct block *);
@@ -67,7 +67,7 @@ mi_apply_ext_lang_frame_filter (const frame_info_ptr &frame,
return apply_ext_lang_frame_filter (frame, flags,
(enum ext_lang_frame_args) print_values,
out,
- frame_low, frame_high);
+ frame_low, frame_high, {});
}
/* Print a list of the stack frames. Args can be none, in which case
@@ -158,7 +158,7 @@ mi_cmd_stack_list_frames (const char *command, const char *const *argv,
result = apply_ext_lang_frame_filter (get_current_frame (), flags,
NO_VALUES, current_uiout,
- py_frame_low, frame_high);
+ py_frame_low, frame_high, {});
}
/* Run the inbuilt backtrace if there are no filters registered, or
@@ -175,7 +175,7 @@ mi_cmd_stack_list_frames (const char *command, const char *const *argv,
/* Print the location and the address always, even for level 0.
If args is 0, don't print the arguments. */
print_frame_info (user_frame_print_options,
- fi, 1, LOC_AND_ADDRESS, 0 /* args */, 0);
+ fi, 1, LOC_AND_ADDRESS, 0 /* args */, 0, {});
}
}
}
@@ -762,5 +762,5 @@ mi_cmd_stack_info_frame (const char *command, const char *const *argv,
error (_("-stack-info-frame: No arguments allowed"));
print_frame_info (user_frame_print_options,
- get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 0, 1);
+ get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 0, 1, {});
}
@@ -761,7 +761,8 @@ static enum ext_lang_bt_status
py_print_frame (PyObject *filter, frame_filter_flags flags,
enum ext_lang_frame_args args_type,
struct ui_out *out, int indent,
- levels_printed_hash &levels_printed)
+ levels_printed_hash &levels_printed,
+ const frame_info_ptr &selected_frame)
{
int has_addr = 0;
CORE_ADDR address = 0;
@@ -865,6 +866,14 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
|| print_what == LOC_AND_ADDRESS
|| print_what == SHORT_LOCATION));
+ if (!selected_frame.is_null ())
+ {
+ if (frame == selected_frame)
+ out->text ("* ");
+ else
+ out->text (" ");
+ }
+
/* Print frame level. MI does not require the level if
locals/variables only are being printed. */
if (print_level
@@ -1068,7 +1077,7 @@ py_print_frame (PyObject *filter, frame_filter_flags flags,
enum ext_lang_bt_status success
= py_print_frame (item, flags, args_type, out, indent,
- levels_printed);
+ levels_printed, selected_frame);
if (success == EXT_LANG_BT_ERROR)
return EXT_LANG_BT_ERROR;
@@ -1142,7 +1151,8 @@ enum ext_lang_bt_status
gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
const frame_info_ptr &frame, frame_filter_flags flags,
enum ext_lang_frame_args args_type,
- struct ui_out *out, int frame_low, int frame_high)
+ struct ui_out *out, int frame_low, int frame_high,
+ const frame_info_ptr &selected_frame)
{
struct gdbarch *gdbarch = NULL;
enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
@@ -1234,7 +1244,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
try
{
success = py_print_frame (item.get (), flags, args_type, out, 0,
- levels_printed);
+ levels_printed, selected_frame);
}
catch (const gdb_exception_error &except)
{
@@ -444,7 +444,8 @@ extern enum ext_lang_bt_status gdbpy_apply_frame_filter
(const struct extension_language_defn *,
const frame_info_ptr &frame, frame_filter_flags flags,
enum ext_lang_frame_args args_type,
- struct ui_out *out, int frame_low, int frame_high);
+ struct ui_out *out, int frame_low, int frame_high,
+ const frame_info_ptr &selected_frame);
extern void gdbpy_preserve_values (const struct extension_language_defn *,
struct objfile *objfile,
copied_types_hash_t &copied_types);
@@ -227,7 +227,8 @@ static void print_frame (struct ui_out *uiout,
const frame_print_options &opts,
const frame_info_ptr &frame, int print_level,
enum print_what print_what, int print_args,
- struct symtab_and_line sal);
+ struct symtab_and_line sal,
+ const frame_info_ptr &selected_frame);
static frame_info_ptr find_frame_for_function (const char *);
static frame_info_ptr find_frame_for_address (CORE_ADDR);
@@ -362,7 +363,7 @@ print_stack_frame (const frame_info_ptr &frame, int print_level,
{
print_frame_info (user_frame_print_options,
frame, print_level, print_what, 1 /* print_args */,
- set_current_sal);
+ set_current_sal, {});
if (set_current_sal)
set_current_sal_from_frame (frame);
}
@@ -961,7 +962,7 @@ static void
do_print_frame_info (struct ui_out *uiout, const frame_print_options &fp_opts,
const frame_info_ptr &frame, int print_level,
enum print_what print_what, int print_args,
- int set_current_sal)
+ int set_current_sal, const frame_info_ptr &selected_frame)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
int source_print;
@@ -983,6 +984,14 @@ do_print_frame_info (struct ui_out *uiout, const frame_print_options &fp_opts,
annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
gdbarch, get_frame_pc (frame));
+ if (!selected_frame.is_null ())
+ {
+ if (frame == selected_frame)
+ uiout->text ("* ");
+ else
+ uiout->text (" ");
+ }
+
/* Do this regardless of SOURCE because we don't have any source
to list for this frame. */
if (print_level)
@@ -1042,7 +1051,7 @@ do_print_frame_info (struct ui_out *uiout, const frame_print_options &fp_opts,
|| print_what == SHORT_LOCATION);
if (location_print || !sal.symtab)
print_frame (uiout, fp_opts, frame, print_level,
- print_what, print_args, sal);
+ print_what, print_args, sal, selected_frame);
source_print = (print_what == SRC_LINE || print_what == SRC_AND_LOC);
@@ -1129,11 +1138,11 @@ void
print_frame_info (const frame_print_options &fp_opts,
const frame_info_ptr &frame, int print_level,
enum print_what print_what, int print_args,
- int set_current_sal)
+ int set_current_sal, const frame_info_ptr &selected_frame)
{
do_with_buffered_output (do_print_frame_info, current_uiout,
fp_opts, frame, print_level, print_what,
- print_args, set_current_sal);
+ print_args, set_current_sal, selected_frame);
}
/* See stack.h. */
@@ -1263,7 +1272,8 @@ print_frame (struct ui_out *uiout,
const frame_print_options &fp_opts,
const frame_info_ptr &frame, int print_level,
enum print_what print_what, int print_args,
- struct symtab_and_line sal)
+ struct symtab_and_line sal,
+ const frame_info_ptr &selected_frame)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
enum language funlang = language_unknown;
@@ -1282,6 +1292,14 @@ print_frame (struct ui_out *uiout,
{
ui_out_emit_tuple tuple_emitter (uiout, "frame");
+ if (!selected_frame.is_null ())
+ {
+ if (frame == selected_frame)
+ uiout->text ("* ");
+ else
+ uiout->text (" ");
+ }
+
if (print_level)
{
uiout->text ("#");
@@ -1930,6 +1948,8 @@ backtrace_command_1 (const frame_print_options &fp_opts,
if (fp_opts.print_raw_frame_arguments)
flags |= PRINT_RAW_FRAME_ARGUMENTS;
+ frame_info_ptr selected_frame = get_selected_frame ();
+
if (!bt_opts.no_filters)
{
enum ext_lang_frame_args arg_type;
@@ -1951,7 +1971,8 @@ backtrace_command_1 (const frame_print_options &fp_opts,
result = apply_ext_lang_frame_filter (get_current_frame (), flags,
arg_type, current_uiout,
- py_start, py_end);
+ py_start, py_end,
+ selected_frame);
}
/* Run the inbuilt backtrace if there are no filters registered, or
@@ -1982,7 +2003,7 @@ backtrace_command_1 (const frame_print_options &fp_opts,
hand, perhaps the code does or could be fixed to make sure
the frame->prev field gets set to NULL in that case). */
- print_frame_info (fp_opts, fi, 1, LOCATION, 1, 0);
+ print_frame_info (fp_opts, fi, 1, LOCATION, 1, 0, selected_frame);
if ((flags & PRINT_LOCALS) != 0)
print_frame_local_vars (fi, false, NULL, NULL, 1, gdb_stdout);