From 5808517f9a2a8588228bd760c9e6a3a231f4f292 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Sat, 3 Mar 2012 09:51:29 +0000 Subject: gdb: * common/agent.c (agent_look_up_symbols): Add one parameter 'arg'. * common/agent.h: Update declaration. * inf-child.c (inf_child_use_agent): New. (inf_child_can_use_agent): New. (inf_child_target): Initialize fields `to_use_agent' and `to_can_use_agent'. * agent.c (agent_new_objfile): New. (_initialize_agent): Add agent_new_objfile to new_objfile observer. * linux-nat.c (linux_child_static_tracepoint_markers_by_strid): New. (linux_target_install_ops): Initialize field `to_static_tracepoint_markers_by_strid'. * remote.c (free_current_marker): Move it to ... * tracepoint.c (free_current_marker): ... here. New. (cleanup_target_stop): New. * tracepoint.h: Declare free_current_marker. * NEWS: Add one entry about `info static-tracepoint-marker'. gdb/gdbserver: * tracepoint.c (tracepoint_look_up_symbols): Update call to agent_look_up_symbols. gdb/testsuite: * gdb.trace/strace.exp: run strace_info_marker in linux native gdb. --- gdb/linux-nat.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'gdb/linux-nat.c') diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index dd6b689c966..553dfdbd614 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -60,6 +60,8 @@ #include "linux-osdata.h" #include "linux-tdep.h" #include "symfile.h" +#include "agent.h" +#include "tracepoint.h" #ifndef SPUFS_MAGIC #define SPUFS_MAGIC 0x23c9b64e @@ -4772,6 +4774,73 @@ linux_xfer_partial (struct target_ops *ops, enum target_object object, offset, len); } +static void +cleanup_target_stop (void *arg) +{ + ptid_t *ptid = (ptid_t *) arg; + + gdb_assert (arg != NULL); + + /* Unpause all */ + target_resume (*ptid, 0, TARGET_SIGNAL_0); +} + +static VEC(static_tracepoint_marker_p) * +linux_child_static_tracepoint_markers_by_strid (const char *strid) +{ + char s[IPA_CMD_BUF_SIZE]; + struct cleanup *old_chain; + int pid = ptid_get_pid (inferior_ptid); + VEC(static_tracepoint_marker_p) *markers = NULL; + struct static_tracepoint_marker *marker = NULL; + char *p = s; + ptid_t ptid = ptid_build (pid, 0, 0); + + /* Pause all */ + target_stop (ptid); + + memcpy (s, "qTfSTM", sizeof ("qTfSTM")); + s[sizeof ("qTfSTM")] = 0; + + agent_run_command (pid, s); + + old_chain = make_cleanup (free_current_marker, &marker); + make_cleanup (cleanup_target_stop, &ptid); + + while (*p++ == 'm') + { + if (marker == NULL) + marker = XCNEW (struct static_tracepoint_marker); + + do + { + parse_static_tracepoint_marker_definition (p, &p, marker); + + if (strid == NULL || strcmp (strid, marker->str_id) == 0) + { + VEC_safe_push (static_tracepoint_marker_p, + markers, marker); + marker = NULL; + } + else + { + release_static_tracepoint_marker (marker); + memset (marker, 0, sizeof (*marker)); + } + } + while (*p++ == ','); /* comma-separated list */ + + memcpy (s, "qTsSTM", sizeof ("qTsSTM")); + s[sizeof ("qTsSTM")] = 0; + agent_run_command (pid, s); + p = s; + } + + do_cleanups (old_chain); + + return markers; +} + /* Create a prototype generic GNU/Linux target. The client can override it with local methods. */ @@ -4793,6 +4862,9 @@ linux_target_install_ops (struct target_ops *t) super_xfer_partial = t->to_xfer_partial; t->to_xfer_partial = linux_xfer_partial; + + t->to_static_tracepoint_markers_by_strid + = linux_child_static_tracepoint_markers_by_strid; } struct target_ops * -- cgit v1.2.1