| Index: gdb/tracepoint.c
|
| diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
|
| index ede3742f0a117313c379c990c412579fa5e3a071..0fc4ea4bae25587149096916f6e0980a86139b77 100644
|
| --- a/gdb/tracepoint.c
|
| +++ b/gdb/tracepoint.c
|
| @@ -52,6 +52,7 @@
|
| #include "memrange.h"
|
| #include "exceptions.h"
|
| #include "cli/cli-utils.h"
|
| +#include "probe.h"
|
|
|
| /* readline include files */
|
| #include "readline/readline.h"
|
| @@ -347,7 +348,7 @@ find_trace_state_variable (const char *name)
|
| return NULL;
|
| }
|
|
|
| -void
|
| +static void
|
| delete_trace_state_variable (const char *name)
|
| {
|
| struct trace_state_variable *tsv;
|
| @@ -367,7 +368,7 @@ delete_trace_state_variable (const char *name)
|
| /* The 'tvariable' command collects a name and optional expression to
|
| evaluate into an initial value. */
|
|
|
| -void
|
| +static void
|
| trace_variable_command (char *args, int from_tty)
|
| {
|
| struct expression *expr;
|
| @@ -429,7 +430,7 @@ trace_variable_command (char *args, int from_tty)
|
| do_cleanups (old_chain);
|
| }
|
|
|
| -void
|
| +static void
|
| delete_trace_variable_command (char *args, int from_tty)
|
| {
|
| int ix;
|
| @@ -733,17 +734,18 @@ validate_actionline (char **line, struct breakpoint *b)
|
| for (loc = t->base.loc; loc; loc = loc->next)
|
| {
|
| p = tmp_p;
|
| - exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
|
| + exp = parse_exp_1 (&p, loc->address,
|
| + block_for_pc (loc->address), 1);
|
| old_chain = make_cleanup (free_current_contents, &exp);
|
|
|
| if (exp->elts[0].opcode == OP_VAR_VALUE)
|
| {
|
| if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
|
| {
|
| - error (_("constant `%s' (value %ld) "
|
| + error (_("constant `%s' (value %s) "
|
| "will not be collected."),
|
| SYMBOL_PRINT_NAME (exp->elts[2].symbol),
|
| - SYMBOL_VALUE (exp->elts[2].symbol));
|
| + plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
|
| }
|
| else if (SYMBOL_CLASS (exp->elts[2].symbol)
|
| == LOC_OPTIMIZED_OUT)
|
| @@ -786,7 +788,8 @@ validate_actionline (char **line, struct breakpoint *b)
|
| {
|
| p = tmp_p;
|
| /* Only expressions are allowed for this action. */
|
| - exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
|
| + exp = parse_exp_1 (&p, loc->address,
|
| + block_for_pc (loc->address), 1);
|
| old_chain = make_cleanup (free_current_contents, &exp);
|
|
|
| /* We have something to evaluate, make sure that the expr to
|
| @@ -980,8 +983,8 @@ collect_symbol (struct collection_list *collect,
|
| SYMBOL_CLASS (sym));
|
| break;
|
| case LOC_CONST:
|
| - printf_filtered ("constant %s (value %ld) will not be collected.\n",
|
| - SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
|
| + printf_filtered ("constant %s (value %s) will not be collected.\n",
|
| + SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
|
| break;
|
| case LOC_STATIC:
|
| offset = SYMBOL_VALUE_ADDRESS (sym);
|
| @@ -1451,7 +1454,7 @@ encode_actions_1 (struct command_line *action,
|
| struct cleanup *old_chain = NULL;
|
| struct cleanup *old_chain1 = NULL;
|
|
|
| - exp = parse_exp_1 (&action_exp,
|
| + exp = parse_exp_1 (&action_exp, tloc->address,
|
| block_for_pc (tloc->address), 1);
|
| old_chain = make_cleanup (free_current_contents, &exp);
|
|
|
| @@ -1541,7 +1544,7 @@ encode_actions_1 (struct command_line *action,
|
| struct cleanup *old_chain = NULL;
|
| struct cleanup *old_chain1 = NULL;
|
|
|
| - exp = parse_exp_1 (&action_exp,
|
| + exp = parse_exp_1 (&action_exp, tloc->address,
|
| block_for_pc (tloc->address), 1);
|
| old_chain = make_cleanup (free_current_contents, &exp);
|
|
|
| @@ -1577,7 +1580,8 @@ encode_actions_1 (struct command_line *action,
|
| }
|
|
|
| /* Render all actions into gdb protocol. */
|
| -/*static*/ void
|
| +
|
| +void
|
| encode_actions (struct breakpoint *t, struct bp_location *tloc,
|
| char ***tdp_actions, char ***stepping_actions)
|
| {
|
| @@ -1716,6 +1720,7 @@ start_tracing (char *notes)
|
| for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
|
| {
|
| struct tracepoint *t = (struct tracepoint *) b;
|
| + struct bp_location *loc;
|
|
|
| if (b->enable_state == bp_enabled)
|
| any_enabled = 1;
|
| @@ -1778,6 +1783,10 @@ start_tracing (char *notes)
|
| }
|
|
|
| t->number_on_target = b->number;
|
| +
|
| + for (loc = b->loc; loc; loc = loc->next)
|
| + if (loc->probe != NULL)
|
| + loc->probe->pops->set_semaphore (loc->probe, loc->gdbarch);
|
| }
|
| VEC_free (breakpoint_p, tp_vec);
|
|
|
| @@ -1798,7 +1807,7 @@ start_tracing (char *notes)
|
| ret = target_set_trace_notes (trace_user, notes, NULL);
|
|
|
| if (!ret && (trace_user || notes))
|
| - warning ("Target does not support trace user/notes, info ignored");
|
| + warning (_("Target does not support trace user/notes, info ignored"));
|
|
|
| /* Now insert traps and begin collecting data. */
|
| target_trace_start ();
|
| @@ -1850,15 +1859,41 @@ void
|
| stop_tracing (char *note)
|
| {
|
| int ret;
|
| + VEC(breakpoint_p) *tp_vec = NULL;
|
| + int ix;
|
| + struct breakpoint *t;
|
|
|
| target_trace_stop ();
|
|
|
| + tp_vec = all_tracepoints ();
|
| + for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
|
| + {
|
| + struct bp_location *loc;
|
| +
|
| + if ((t->type == bp_fast_tracepoint
|
| + ? !may_insert_fast_tracepoints
|
| + : !may_insert_tracepoints))
|
| + continue;
|
| +
|
| + for (loc = t->loc; loc; loc = loc->next)
|
| + {
|
| + /* GDB can be totally absent in some disconnected trace scenarios,
|
| + but we don't really care if this semaphore goes out of sync.
|
| + That's why we are decrementing it here, but not taking care
|
| + in other places. */
|
| + if (loc->probe != NULL)
|
| + loc->probe->pops->clear_semaphore (loc->probe, loc->gdbarch);
|
| + }
|
| + }
|
| +
|
| + VEC_free (breakpoint_p, tp_vec);
|
| +
|
| if (!note)
|
| note = trace_stop_notes;
|
| ret = target_set_trace_notes (NULL, NULL, note);
|
|
|
| if (!ret && note)
|
| - warning ("Target does not support trace notes, note ignored");
|
| + warning (_("Target does not support trace notes, note ignored"));
|
|
|
| /* Should change in response to reply? */
|
| current_trace_status ()->running = 0;
|
| @@ -2459,7 +2494,7 @@ trace_find_line_command (char *args, int from_tty)
|
| }
|
| else
|
| {
|
| - sals = decode_line_spec (args, DECODE_LINE_FUNFIRSTLINE);
|
| + sals = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
|
| sal = sals.sals[0];
|
| }
|
|
|
| @@ -2577,8 +2612,9 @@ scope_info (char *args, int from_tty)
|
| struct symbol *sym;
|
| struct minimal_symbol *msym;
|
| struct block *block;
|
| - char *symname, *save_args = args;
|
| - struct dict_iterator iter;
|
| + const char *symname;
|
| + char *save_args = args;
|
| + struct block_iterator iter;
|
| int j, count = 0;
|
| struct gdbarch *gdbarch;
|
| int regno;
|
| @@ -2621,8 +2657,9 @@ scope_info (char *args, int from_tty)
|
| count--; /* Don't count this one. */
|
| continue;
|
| case LOC_CONST:
|
| - printf_filtered ("a constant with value %ld (0x%lx)",
|
| - SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
|
| + printf_filtered ("a constant with value %s (%s)",
|
| + plongest (SYMBOL_VALUE (sym)),
|
| + hex_string (SYMBOL_VALUE (sym)));
|
| break;
|
| case LOC_CONST_BYTES:
|
| printf_filtered ("constant bytes: ");
|
| @@ -2655,16 +2692,16 @@ scope_info (char *args, int from_tty)
|
| gdbarch_register_name (gdbarch, regno));
|
| break;
|
| case LOC_ARG:
|
| - printf_filtered ("an argument at stack/frame offset %ld",
|
| - SYMBOL_VALUE (sym));
|
| + printf_filtered ("an argument at stack/frame offset %s",
|
| + plongest (SYMBOL_VALUE (sym)));
|
| break;
|
| case LOC_LOCAL:
|
| - printf_filtered ("a local variable at frame offset %ld",
|
| - SYMBOL_VALUE (sym));
|
| + printf_filtered ("a local variable at frame offset %s",
|
| + plongest (SYMBOL_VALUE (sym)));
|
| break;
|
| case LOC_REF_ARG:
|
| - printf_filtered ("a reference argument at offset %ld",
|
| - SYMBOL_VALUE (sym));
|
| + printf_filtered ("a reference argument at offset %s",
|
| + plongest (SYMBOL_VALUE (sym)));
|
| break;
|
| case LOC_REGPARM_ADDR:
|
| /* Note comment at LOC_REGISTER. */
|
| @@ -3166,7 +3203,7 @@ set_trace_user (char *args, int from_tty,
|
| ret = target_set_trace_notes (trace_user, NULL, NULL);
|
|
|
| if (!ret)
|
| - warning ("Target does not support trace notes, user ignored");
|
| + warning (_("Target does not support trace notes, user ignored"));
|
| }
|
|
|
| static void
|
| @@ -3178,7 +3215,7 @@ set_trace_notes (char *args, int from_tty,
|
| ret = target_set_trace_notes (NULL, trace_notes, NULL);
|
|
|
| if (!ret)
|
| - warning ("Target does not support trace notes, note ignored");
|
| + warning (_("Target does not support trace notes, note ignored"));
|
| }
|
|
|
| static void
|
| @@ -3190,7 +3227,7 @@ set_trace_stop_notes (char *args, int from_tty,
|
| ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
|
|
|
| if (!ret)
|
| - warning ("Target does not support trace notes, stop note ignored");
|
| + warning (_("Target does not support trace notes, stop note ignored"));
|
| }
|
|
|
| /* Convert the memory pointed to by mem into hex, placing result in buf.
|
| @@ -3342,7 +3379,7 @@ free_uploaded_tps (struct uploaded_tp **utpp)
|
| /* Given a number and address, return an uploaded tracepoint with that
|
| number, creating if necessary. */
|
|
|
| -struct uploaded_tsv *
|
| +static struct uploaded_tsv *
|
| get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
|
| {
|
| struct uploaded_tsv *utsv;
|
| @@ -3389,7 +3426,7 @@ cond_string_is_same (char *str1, char *str2)
|
| toggle that freely, and may have done so in anticipation of the
|
| next trace run. Return the location of matched tracepoint. */
|
|
|
| -struct bp_location *
|
| +static struct bp_location *
|
| find_matching_tracepoint_location (struct uploaded_tp *utp)
|
| {
|
| VEC(breakpoint_p) *tp_vec = all_tracepoints ();
|
| @@ -3472,7 +3509,7 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
|
| /* Trace state variables don't have much to identify them beyond their
|
| name, so just use that to detect matches. */
|
|
|
| -struct trace_state_variable *
|
| +static struct trace_state_variable *
|
| find_matching_tsv (struct uploaded_tsv *utsv)
|
| {
|
| if (!utsv->name)
|
| @@ -3481,7 +3518,7 @@ find_matching_tsv (struct uploaded_tsv *utsv)
|
| return find_trace_state_variable (utsv->name);
|
| }
|
|
|
| -struct trace_state_variable *
|
| +static struct trace_state_variable *
|
| create_tsv_from_upload (struct uploaded_tsv *utsv)
|
| {
|
| const char *namebase;
|
| @@ -4386,9 +4423,7 @@ tfile_fetch_registers (struct target_ops *ops,
|
| struct regcache *regcache, int regno)
|
| {
|
| struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
| - char block_type;
|
| - int pos, offset, regn, regsize, pc_regno;
|
| - unsigned short mlen;
|
| + int offset, regn, regsize, pc_regno;
|
| char *regs;
|
|
|
| /* An uninitialized reg size says we're not going to be
|
| @@ -4512,6 +4547,8 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
|
| if (amt > len)
|
| amt = len;
|
|
|
| + if (maddr != offset)
|
| + lseek (trace_fd, offset - maddr, SEEK_CUR);
|
| tfile_read (readbuf, amt);
|
| return amt;
|
| }
|
| @@ -4699,6 +4736,20 @@ init_tfile_ops (void)
|
| tfile_ops.to_magic = OPS_MAGIC;
|
| }
|
|
|
| +void
|
| +free_current_marker (void *arg)
|
| +{
|
| + struct static_tracepoint_marker **marker_p = arg;
|
| +
|
| + if (*marker_p != NULL)
|
| + {
|
| + release_static_tracepoint_marker (*marker_p);
|
| + xfree (*marker_p);
|
| + }
|
| + else
|
| + *marker_p = NULL;
|
| +}
|
| +
|
| /* Given a line of text defining a static tracepoint marker, parse it
|
| into a "static tracepoint marker" object. Throws an error is
|
| parsing fails. If PP is non-null, it points to one past the end of
|
| @@ -4761,8 +4812,6 @@ print_one_static_tracepoint_marker (int count,
|
| char wrap_indent[80];
|
| char extra_field_indent[80];
|
| struct ui_out *uiout = current_uiout;
|
| - struct ui_stream *stb = ui_out_stream_new (uiout);
|
| - struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
|
| struct cleanup *bkpt_chain;
|
| VEC(breakpoint_p) *tracepoints;
|
|
|
| @@ -4869,7 +4918,6 @@ print_one_static_tracepoint_marker (int count,
|
| VEC_free (breakpoint_p, tracepoints);
|
|
|
| do_cleanups (bkpt_chain);
|
| - do_cleanups (old_chain);
|
| }
|
|
|
| static void
|
| @@ -4881,6 +4929,12 @@ info_static_tracepoint_markers_command (char *arg, int from_tty)
|
| struct ui_out *uiout = current_uiout;
|
| int i;
|
|
|
| + /* We don't have to check target_can_use_agent and agent's capability on
|
| + static tracepoint here, in order to be compatible with older GDBserver.
|
| + We don't check USE_AGENT is true or not, because static tracepoints
|
| + don't work without in-process agent, so we don't bother users to type
|
| + `set agent on' when to use static tracepoint. */
|
| +
|
| old_chain
|
| = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
|
| "StaticTracepointMarkersTable");
|
| @@ -4924,7 +4978,8 @@ info_static_tracepoint_markers_command (char *arg, int from_tty)
|
| available. */
|
|
|
| static struct value *
|
| -sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
|
| +sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
|
| + void *ignore)
|
| {
|
| LONGEST size;
|
| gdb_byte *buf;
|
| @@ -5050,7 +5105,7 @@ parse_traceframe_info (const char *tframe_info)
|
| This is where we avoid re-fetching the object from the target if we
|
| already have it cached. */
|
|
|
| -struct traceframe_info *
|
| +static struct traceframe_info *
|
| get_traceframe_info (void)
|
| {
|
| if (traceframe_info == NULL)
|
| @@ -5103,6 +5158,15 @@ traceframe_available_memory (VEC(mem_range_s) **result,
|
| return 0;
|
| }
|
|
|
| +/* Implementation of `sdata' variable. */
|
| +
|
| +static const struct internalvar_funcs sdata_funcs =
|
| +{
|
| + sdata_make_value,
|
| + NULL,
|
| + NULL
|
| +};
|
| +
|
| /* module initialization */
|
| void
|
| _initialize_tracepoint (void)
|
| @@ -5113,7 +5177,7 @@ _initialize_tracepoint (void)
|
| value with a void typed value, and when we get here, gdbarch
|
| isn't initialized yet. At this point, we're quite sure there
|
| isn't another convenience variable of the same name. */
|
| - create_internalvar_type_lazy ("_sdata", sdata_make_value);
|
| + create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
|
|
|
| traceframe_number = -1;
|
| tracepoint_number = -1;
|
|
|