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