X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftracepoint.c;h=a2189d57198f78f1beee6d1b502effaddb6dd86e;hb=e34879080d8935792ef3942efa5f25b4c3169b5a;hp=23eba323b1c7bc103bed02b75526437f293176e5;hpb=11395323794268a9945dd31eb46905e975d87b3d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 23eba323b1..a2189d5719 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1,6 +1,6 @@ /* Tracing functionality for remote targets in custom GDB protocol - Copyright (C) 1997-2014 Free Software Foundation, Inc. + Copyright (C) 1997-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -28,7 +28,6 @@ #include "target.h" #include "target-dcache.h" #include "language.h" -#include #include "inferior.h" #include "breakpoint.h" #include "tracepoint.h" @@ -50,13 +49,13 @@ #include "ax.h" #include "ax-gdb.h" #include "memrange.h" -#include "exceptions.h" #include "cli/cli-utils.h" #include "probe.h" #include "ctf.h" #include "filestuff.h" #include "rsp-low.h" #include "tracefile.h" +#include "location.h" /* readline include files */ #include "readline/readline.h" @@ -653,7 +652,7 @@ trace_actions_command (char *args, int from_tty) struct tracepoint *t; struct command_line *l; - t = get_tracepoint_by_number (&args, NULL, 1); + t = get_tracepoint_by_number (&args, NULL); if (t) { char *tmpbuf = @@ -861,7 +860,8 @@ static int memrange_cmp (const void *, const void *); static int memrange_cmp (const void *va, const void *vb) { - const struct memrange *a = va, *b = vb; + const struct memrange *a = (const struct memrange *) va; + const struct memrange *b = (const struct memrange *) vb; if (a->type < b->type) return -1; @@ -949,8 +949,8 @@ add_memrange (struct collection_list *memranges, if (memranges->next_memrange >= memranges->listsize) { memranges->listsize *= 2; - memranges->list = xrealloc (memranges->list, - memranges->listsize); + memranges->list = (struct memrange *) xrealloc (memranges->list, + memranges->listsize); } if (type != memrange_absolute) /* Better collect the base register! */ @@ -1138,7 +1138,7 @@ do_collect_symbol (const char *print_name, struct symbol *sym, void *cb_data) { - struct add_local_symbols_data *p = cb_data; + struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data; collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno, p->frame_offset, p->pc, p->trace_string); @@ -1155,7 +1155,7 @@ add_local_symbols (struct collection_list *collect, long frame_regno, long frame_offset, int type, int trace_string) { - struct block *block; + const struct block *block; struct add_local_symbols_data cb_data; cb_data.collect = collect; @@ -1232,7 +1232,7 @@ clear_collection_list (struct collection_list *list) static void do_clear_collection_list (void *list) { - struct collection_list *l = list; + struct collection_list *l = (struct collection_list *) list; clear_collection_list (l); } @@ -1245,12 +1245,10 @@ init_collection_list (struct collection_list *clist) memset (clist, 0, sizeof *clist); clist->listsize = 128; - clist->list = xcalloc (clist->listsize, - sizeof (struct memrange)); + clist->list = XCNEWVEC (struct memrange, clist->listsize); clist->aexpr_listsize = 128; - clist->aexpr_list = xcalloc (clist->aexpr_listsize, - sizeof (struct agent_expr *)); + clist->aexpr_list = XCNEWVEC (struct agent_expr *, clist->aexpr_listsize); } /* Reduce a collection list to string form (for gdb protocol). */ @@ -1430,14 +1428,14 @@ encode_actions_1 (struct command_line *action, if (0 == strncasecmp ("$reg", action_exp, 4)) { - for (i = 0; i < gdbarch_num_regs (tloc->gdbarch); i++) + for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++) add_register (collect, i); action_exp = strchr (action_exp, ','); /* more? */ } else if (0 == strncasecmp ("$arg", action_exp, 4)) { add_local_symbols (collect, - tloc->gdbarch, + target_gdbarch (), tloc->address, frame_reg, frame_offset, @@ -1448,7 +1446,7 @@ encode_actions_1 (struct command_line *action, else if (0 == strncasecmp ("$loc", action_exp, 4)) { add_local_symbols (collect, - tloc->gdbarch, + target_gdbarch (), tloc->address, frame_reg, frame_offset, @@ -1461,7 +1459,7 @@ encode_actions_1 (struct command_line *action, struct cleanup *old_chain1 = NULL; aexpr = gen_trace_for_return_address (tloc->address, - tloc->gdbarch, + target_gdbarch (), trace_string); old_chain1 = make_cleanup_free_agent_expr (aexpr); @@ -1515,7 +1513,7 @@ encode_actions_1 (struct command_line *action, { const char *name = &exp->elts[2].string; - i = user_reg_map_name_to_regnum (tloc->gdbarch, + i = user_reg_map_name_to_regnum (target_gdbarch (), name, strlen (name)); if (i == -1) internal_error (__FILE__, __LINE__, @@ -1545,7 +1543,7 @@ encode_actions_1 (struct command_line *action, collect_symbol (collect, exp->elts[2].symbol, - tloc->gdbarch, + target_gdbarch (), frame_reg, frame_offset, tloc->address, @@ -1653,9 +1651,7 @@ encode_actions_and_make_cleanup (struct bp_location *tloc, struct collection_list *tracepoint_list, struct collection_list *stepping_list) { - char *default_collect_line = NULL; struct command_line *actions; - struct command_line *default_collect_action = NULL; int frame_reg; LONGEST frame_offset; struct cleanup *back_to, *return_chain; @@ -1709,9 +1705,9 @@ add_aexpr (struct collection_list *collect, struct agent_expr *aexpr) { if (collect->next_aexpr_elt >= collect->aexpr_listsize) { - collect->aexpr_list = - xrealloc (collect->aexpr_list, - 2 * collect->aexpr_listsize * sizeof (struct agent_expr *)); + collect->aexpr_list = XRESIZEVEC (struct agent_expr *, + collect->aexpr_list, + 2 * collect->aexpr_listsize); collect->aexpr_listsize *= 2; } collect->aexpr_list[collect->next_aexpr_elt] = aexpr; @@ -1792,9 +1788,6 @@ 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; @@ -1860,8 +1853,11 @@ 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); + if (loc->probe.probe != NULL + && loc->probe.probe->pops->set_semaphore != NULL) + loc->probe.probe->pops->set_semaphore (loc->probe.probe, + loc->probe.objfile, + loc->gdbarch); if (bp_location_downloaded) observer_notify_breakpoint_modified (b); @@ -1957,8 +1953,11 @@ stop_tracing (char *note) 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); + if (loc->probe.probe != NULL + && loc->probe.probe->pops->clear_semaphore != NULL) + loc->probe.probe->pops->clear_semaphore (loc->probe.probe, + loc->probe.objfile, + loc->gdbarch); } } @@ -2439,6 +2438,15 @@ tfind_1 (enum trace_find_type type, int num, } } +/* Error on looking at traceframes while trace is running. */ + +void +check_trace_running (struct trace_status *status) +{ + if (status->running && status->filename == NULL) + error (_("May not look at trace frames while trace is running.")); +} + /* trace_find_command takes a trace frame number n, sends "QTFrame:" to the target, and accepts a reply that may contain several optional pieces @@ -2459,9 +2467,7 @@ trace_find_command (char *args, int from_tty) { /* This should only be called with a numeric argument. */ int frameno = -1; - if (current_trace_status ()->running - && current_trace_status ()->filename == NULL) - error (_("May not look at trace frames while trace is running.")); + check_trace_running (current_trace_status ()); if (args == 0 || *args == 0) { /* TFIND with no args means find NEXT trace frame. */ @@ -2511,9 +2517,7 @@ trace_find_pc_command (char *args, int from_tty) { CORE_ADDR pc; - if (current_trace_status ()->running - && current_trace_status ()->filename == NULL) - error (_("May not look at trace frames while trace is running.")); + check_trace_running (current_trace_status ()); if (args == 0 || *args == 0) pc = regcache_read_pc (get_current_regcache ()); @@ -2530,9 +2534,7 @@ trace_find_tracepoint_command (char *args, int from_tty) int tdp; struct tracepoint *tp; - if (current_trace_status ()->running - && current_trace_status ()->filename == NULL) - error (_("May not look at trace frames while trace is running.")); + check_trace_running (current_trace_status ()); if (args == 0 || *args == 0) { @@ -2570,16 +2572,13 @@ trace_find_line_command (char *args, int from_tty) struct symtab_and_line sal; struct cleanup *old_chain; - if (current_trace_status ()->running - && current_trace_status ()->filename == NULL) - error (_("May not look at trace frames while trace is running.")); + check_trace_running (current_trace_status ()); if (args == 0 || *args == 0) { sal = find_pc_line (get_frame_pc (get_current_frame ()), 0); sals.nelts = 1; - sals.sals = (struct symtab_and_line *) - xmalloc (sizeof (struct symtab_and_line)); + sals.sals = XNEW (struct symtab_and_line); sals.sals[0] = sal; } else @@ -2636,9 +2635,7 @@ trace_find_range_command (char *args, int from_tty) static CORE_ADDR start, stop; char *tmp; - if (current_trace_status ()->running - && current_trace_status ()->filename == NULL) - error (_("May not look at trace frames while trace is running.")); + check_trace_running (current_trace_status ()); if (args == 0 || *args == 0) { /* XXX FIXME: what should default behavior be? */ @@ -2701,22 +2698,30 @@ scope_info (char *args, int from_tty) { struct symtabs_and_lines sals; struct symbol *sym; - struct minimal_symbol *msym; - struct block *block; + struct bound_minimal_symbol msym; + const struct block *block; const char *symname; char *save_args = args; struct block_iterator iter; int j, count = 0; struct gdbarch *gdbarch; int regno; + struct event_location *location; + struct cleanup *back_to; if (args == 0 || *args == 0) error (_("requires an argument (function, " "line or *addr) to define a scope")); - sals = decode_line_1 (&args, DECODE_LINE_FUNFIRSTLINE, NULL, 0); + location = string_to_event_location (&args, current_language); + back_to = make_cleanup_delete_event_location (location); + sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, NULL, NULL, 0); if (sals.nelts == 0) - return; /* Presumably decode_line_1 has already warned. */ + { + /* Presumably decode_line_1 has already warned. */ + do_cleanups (back_to); + return; + } /* Resolve line numbers to PC. */ resolve_sal_pc (&sals.sals[0]); @@ -2736,7 +2741,7 @@ scope_info (char *args, int from_tty) if (symname == NULL || *symname == '\0') continue; /* Probably botched, certainly useless. */ - gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile); + gdbarch = symbol_arch (sym); printf_filtered ("Symbol %s is ", symname); @@ -2824,14 +2829,14 @@ scope_info (char *args, int from_tty) case LOC_UNRESOLVED: msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym), NULL, NULL); - if (msym == NULL) + if (msym.minsym == NULL) printf_filtered ("Unresolved Static"); else { printf_filtered ("static storage at address "); printf_filtered ("%s", paddress (gdbarch, - SYMBOL_VALUE_ADDRESS (msym))); + BMSYMBOL_VALUE_ADDRESS (msym))); } break; case LOC_OPTIMIZED_OUT: @@ -2853,6 +2858,7 @@ scope_info (char *args, int from_tty) if (count <= 0) printf_filtered ("Scope for %s contains no locals or arguments.\n", save_args); + do_cleanups (back_to); } /* Helper for trace_dump_command. Dump the action list starting at @@ -2935,7 +2941,7 @@ trace_dump_actions (struct command_line *action, { size_t len = next_comma - action_exp; - cmd = xrealloc (cmd, len + 1); + cmd = (char *) xrealloc (cmd, len + 1); memcpy (cmd, action_exp, len); cmd[len] = 0; } @@ -2943,7 +2949,7 @@ trace_dump_actions (struct command_line *action, { size_t len = strlen (action_exp); - cmd = xrealloc (cmd, len + 1); + cmd = (char *) xrealloc (cmd, len + 1); memcpy (cmd, action_exp, len + 1); } @@ -3028,7 +3034,7 @@ all_tracepoint_actions_and_cleanup (struct breakpoint *t) make_cleanup (xfree, default_collect_line); validate_actionline (default_collect_line, t); - default_collect_action = xmalloc (sizeof (struct command_line)); + default_collect_action = XNEW (struct command_line); make_cleanup (xfree, default_collect_action); default_collect_action->next = actions; default_collect_action->line = default_collect_line; @@ -3075,7 +3081,7 @@ trace_dump_command (char *args, int from_tty) extern int encode_source_string (int tpnum, ULONGEST addr, - char *srctype, char *src, char *buf, int buf_size) + char *srctype, const char *src, char *buf, int buf_size) { if (80 + strlen (srctype) > buf_size) error (_("Buffer too small for source encoding")); @@ -3213,15 +3219,6 @@ set_current_traceframe (int num) clear_traceframe_info (); } -/* Make the traceframe NUM be the current trace frame, and do nothing - more. */ - -void -set_traceframe_number (int num) -{ - traceframe_number = num; -} - /* A cleanup used when switching away and back from tfind mode. */ struct current_traceframe_cleanup @@ -3233,7 +3230,8 @@ struct current_traceframe_cleanup static void do_restore_current_traceframe_cleanup (void *arg) { - struct current_traceframe_cleanup *old = arg; + struct current_traceframe_cleanup *old + = (struct current_traceframe_cleanup *) arg; set_current_traceframe (old->traceframe_number); } @@ -3241,7 +3239,8 @@ do_restore_current_traceframe_cleanup (void *arg) static void restore_current_traceframe_cleanup_dtor (void *arg) { - struct current_traceframe_cleanup *old = arg; + struct current_traceframe_cleanup *old + = (struct current_traceframe_cleanup *) arg; xfree (old); } @@ -3249,21 +3248,15 @@ restore_current_traceframe_cleanup_dtor (void *arg) struct cleanup * make_cleanup_restore_current_traceframe (void) { - struct current_traceframe_cleanup *old; + struct current_traceframe_cleanup *old = + XNEW (struct current_traceframe_cleanup); - old = xmalloc (sizeof (struct current_traceframe_cleanup)); old->traceframe_number = traceframe_number; return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old, restore_current_traceframe_cleanup_dtor); } -struct cleanup * -make_cleanup_restore_traceframe_number (void) -{ - return make_cleanup_restore_integer (&traceframe_number); -} - /* Given a number and address, return an uploaded tracepoint with that number, creating if necessary. */ @@ -3275,8 +3268,8 @@ get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp) for (utp = *utpp; utp; utp = utp->next) if (utp->number == num && utp->addr == addr) return utp; - utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp)); - memset (utp, 0, sizeof (struct uploaded_tp)); + + utp = XCNEW (struct uploaded_tp); utp->number = num; utp->addr = addr; utp->actions = NULL; @@ -3284,6 +3277,7 @@ get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp) utp->cmd_strings = NULL; utp->next = *utpp; *utpp = utp; + return utp; } @@ -3311,11 +3305,12 @@ get_uploaded_tsv (int num, struct uploaded_tsv **utsvp) for (utsv = *utsvp; utsv; utsv = utsv->next) if (utsv->number == num) return utsv; - utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv)); - memset (utsv, 0, sizeof (struct uploaded_tsv)); + + utsv = XCNEW (struct uploaded_tsv); utsv->number = num; utsv->next = *utsvp; *utsvp = utsv; + return utsv; } @@ -3628,7 +3623,7 @@ Status line: '%s'\n"), p, line); } else if (p2 != p1) { - ts->stop_desc = xmalloc (strlen (line)); + ts->stop_desc = (char *) xmalloc (strlen (line)); end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2); ts->stop_desc[end] = '\0'; } @@ -3648,7 +3643,7 @@ Status line: '%s'\n"), p, line); p2 = strchr (++p1, ':'); if (p2 != p1) { - ts->stop_desc = xmalloc ((p2 - p1) / 2 + 1); + ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1); end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2); ts->stop_desc[end] = '\0'; } @@ -3702,7 +3697,7 @@ Status line: '%s'\n"), p, line); else if (strncmp (p, "username", p1 - p) == 0) { ++p1; - ts->user_name = xmalloc (strlen (p) / 2); + ts->user_name = (char *) xmalloc (strlen (p) / 2); end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1) / 2); ts->user_name[end] = '\0'; p = p3; @@ -3710,7 +3705,7 @@ Status line: '%s'\n"), p, line); else if (strncmp (p, "notes", p1 - p) == 0) { ++p1; - ts->notes = xmalloc (strlen (p) / 2); + ts->notes = (char *) xmalloc (strlen (p) / 2); end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2); ts->notes[end] = '\0'; p = p3; @@ -3837,16 +3832,16 @@ parse_tracepoint_definition (char *line, struct uploaded_tp **utpp) p = unpack_varlen_hex (p, &xlen); p++; /* skip a colon */ - buf = alloca (strlen (line)); + buf = (char *) alloca (strlen (line)); end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2); buf[end] = '\0'; - if (strncmp (srctype, "at:", strlen ("at:")) == 0) + if (startswith (srctype, "at:")) utp->at_string = xstrdup (buf); - else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0) + else if (startswith (srctype, "cond:")) utp->cond_string = xstrdup (buf); - else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0) + else if (startswith (srctype, "cmd:")) VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf)); } else if (piece == 'V') @@ -3874,7 +3869,7 @@ parse_tsv_definition (char *line, struct uploaded_tsv **utsvp) int end; struct uploaded_tsv *utsv = NULL; - buf = alloca (strlen (line)); + buf = (char *) alloca (strlen (line)); p = line; p = unpack_varlen_hex (p, &num); @@ -3895,7 +3890,8 @@ parse_tsv_definition (char *line, struct uploaded_tsv **utsvp) void free_current_marker (void *arg) { - struct static_tracepoint_marker **marker_p = arg; + struct static_tracepoint_marker **marker_p + = (struct static_tracepoint_marker **) arg; if (*marker_p != NULL) { @@ -3930,14 +3926,14 @@ parse_static_tracepoint_marker_definition (char *line, char **pp, if (endp == NULL) error (_("bad marker definition: %s"), line); - marker->str_id = xmalloc (endp - p + 1); + marker->str_id = (char *) xmalloc (endp - p + 1); end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2); marker->str_id[end] = '\0'; p += 2 * end; p++; /* skip a colon */ - marker->extra = xmalloc (strlen (p) + 1); + marker->extra = (char *) xmalloc (strlen (p) + 1); end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2); marker->extra[end] = '\0'; @@ -3962,7 +3958,6 @@ static void print_one_static_tracepoint_marker (int count, struct static_tracepoint_marker *marker) { - struct command_line *l; struct symbol *sym; char wrap_indent[80]; @@ -4188,12 +4183,14 @@ traceframe_info_start_memory (struct gdb_xml_parser *parser, const struct gdb_xml_element *element, void *user_data, VEC(gdb_xml_value_s) *attributes) { - struct traceframe_info *info = user_data; + struct traceframe_info *info = (struct traceframe_info *) user_data; struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL); ULONGEST *start_p, *length_p; - start_p = xml_find_attribute (attributes, "start")->value; - length_p = xml_find_attribute (attributes, "length")->value; + start_p + = (ULONGEST *) xml_find_attribute (attributes, "start")->value; + length_p + = (ULONGEST *) xml_find_attribute (attributes, "length")->value; r->start = *start_p; r->length = *length_p; @@ -4207,8 +4204,9 @@ traceframe_info_start_tvar (struct gdb_xml_parser *parser, void *user_data, VEC(gdb_xml_value_s) *attributes) { - struct traceframe_info *info = user_data; - const char *id_attrib = xml_find_attribute (attributes, "id")->value; + struct traceframe_info *info = (struct traceframe_info *) user_data; + const char *id_attrib + = (const char *) xml_find_attribute (attributes, "id")->value; int id = gdb_xml_parse_ulongest (parser, id_attrib); VEC_safe_push (int, info->tvars, id); @@ -4219,7 +4217,7 @@ traceframe_info_start_tvar (struct gdb_xml_parser *parser, static void free_result (void *p) { - struct traceframe_info *result = p; + struct traceframe_info *result = (struct traceframe_info *) p; free_traceframe_info (result); }