gdb:
authorYao Qi <yao@codesourcery.com>
Sat, 3 Mar 2012 09:51:29 +0000 (09:51 +0000)
committerYao Qi <yao@codesourcery.com>
Sat, 3 Mar 2012 09:51:29 +0000 (09:51 +0000)
* 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.

14 files changed:
gdb/ChangeLog
gdb/NEWS
gdb/agent.c
gdb/common/agent.c
gdb/common/agent.h
gdb/gdbserver/ChangeLog
gdb/gdbserver/tracepoint.c
gdb/inf-child.c
gdb/linux-nat.c
gdb/remote.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.trace/strace.exp
gdb/tracepoint.c
gdb/tracepoint.h

index 26dc2ab3b30169dea810fa078416bf4b6163e11b..87b7bda453bfd3e035d22f2782cbe0b9c2d64c34 100644 (file)
@@ -1,3 +1,25 @@
+2012-03-03  Yao Qi  <yao@codesourcery.com>
+
+       * 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'.
+
 2012-03-03  Yao Qi  <yao@codesourcery.com>
 
        * common/agent.c (agent_loaded_p): New.
index 4b2c819fd29c4055d10d1bb8dbf1e61ae2d21c08..c9218adda2194eb89199bda6a0b0d381108e1d70 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -57,6 +57,9 @@
   but it had to be done as a second step, after the catchpoint had been
   created, using the "condition" command.
 
+* The "info static-tracepoint-marker" command will now also work on
+  native Linux targets with in-process agent.
+
 * New commands
 
   ** "catch load" and "catch unload" can be used to stop when a shared
index b751cfe4c205568b9d8ccf95ce4cf20950bba928..a8958d78c47399f6b58c73b1f30221262d6aef33 100644 (file)
@@ -54,9 +54,23 @@ set_can_use_agent (char *args, int from_tty, struct cmd_list_element *c)
 /* -Wmissing-prototypes */
 extern initialize_file_ftype _initialize_agent;
 
+#include "observer.h"
+#include "objfiles.h"
+
+static void
+agent_new_objfile (struct objfile *objfile)
+{
+  if (objfile == NULL || agent_loaded_p ())
+    return;
+
+  agent_look_up_symbols (objfile);
+}
+
 void
 _initialize_agent (void)
 {
+  observer_attach_new_objfile (agent_new_objfile);
+
   add_setshow_enum_cmd ("agent", class_run,
                        can_use_agent_enum,
                        &can_use_agent, _("\
index 70a6de7615c6f6920cb3b4f5b24cd29a18f4475c..5c908229043d3c22fb49b2e645633a01b5ab07e8 100644 (file)
@@ -83,7 +83,7 @@ agent_loaded_p (void)
    found, return non-zero otherwise.  */
 
 int
-agent_look_up_symbols (void)
+agent_look_up_symbols (void *arg)
 {
   int i;
 
@@ -97,8 +97,9 @@ agent_look_up_symbols (void)
 
       if (look_up_one_symbol (symbol_list[i].name, addrp, 1) == 0)
 #else
-      struct minimal_symbol *sym = lookup_minimal_symbol (symbol_list[i].name,
-                                                         NULL, NULL);
+      struct minimal_symbol *sym =
+       lookup_minimal_symbol (symbol_list[i].name, NULL,
+                              (struct objfile *) arg);
 
       if (sym != NULL)
        *addrp = SYMBOL_VALUE_ADDRESS (sym);
index b89d111b7e3b28573bf069f29f4767bb7aa908bf..fa8bc36e5beded936f087521d3df0c7b193f40b9 100644 (file)
@@ -19,7 +19,7 @@
 
 int agent_run_command (int pid, const char *cmd);
 
-int agent_look_up_symbols (void);
+int agent_look_up_symbols (void *);
 
 #define STRINGIZE_1(STR) #STR
 #define STRINGIZE(STR) STRINGIZE_1(STR)
index 24430372c978a1bc5ed764d19dc0f3297c5f8642..db1fa925c4df77c1b2d3081cebe82cf9461efc39 100644 (file)
@@ -1,3 +1,8 @@
+2012-03-03  Yao Qi  <yao@codesourcery.com>
+
+       * tracepoint.c (tracepoint_look_up_symbols): Update call to
+       agent_look_up_symbols.
+
 2012-03-03  Yao Qi  <yao@codesourcery.com>
 
        * Makefile.in (linux-low.o): Keep dependence on agent.h.
index ac3312f957155e260ab70ae819fa1d459548e160..21e58ffc543ab05532e134d0b81247abef122bbb 100644 (file)
@@ -338,7 +338,7 @@ tracepoint_look_up_symbols (void)
        }
     }
 
-  agent_look_up_symbols ();
+  agent_look_up_symbols (NULL);
 }
 
 #endif
index 96c11579f8e870ef11f3da1d14cd45085f41e8e5..5531102314bcc15ff3caf22973eb63136828abbf 100644 (file)
@@ -29,6 +29,7 @@
 #include "gdb_stat.h"
 #include "inf-child.h"
 #include "gdb/fileio.h"
+#include "agent.h"
 
 #ifdef HAVE_SYS_PARAM_H
 #include <sys/param.h>         /* for MAXPATHLEN */
@@ -332,6 +333,23 @@ inf_child_fileio_readlink (const char *filename, int *target_errno)
 #endif
 }
 
+static int
+inf_child_use_agent (int use)
+{
+  if (agent_loaded_p ())
+    {
+      use_agent = use;
+      return 1;
+    }
+  else
+    return 0;
+}
+
+static int
+inf_child_can_use_agent (void)
+{
+  return agent_loaded_p ();
+}
 
 struct target_ops *
 inf_child_target (void)
@@ -371,5 +389,7 @@ inf_child_target (void)
   t->to_fileio_unlink = inf_child_fileio_unlink;
   t->to_fileio_readlink = inf_child_fileio_readlink;
   t->to_magic = OPS_MAGIC;
+  t->to_use_agent = inf_child_use_agent;
+  t->to_can_use_agent = inf_child_can_use_agent;
   return t;
 }
index dd6b689c966955d6527ffd2e6c30fd0958f700e8..553dfdbd614dbeec5728a529dd67c15948152929 100644 (file)
@@ -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 *
index 8eb975fe57aea43f01f04228afd2993d6a2f8e8b..61bb2bb3cf1577aec70a5a280a88344582e9e7de 100644 (file)
@@ -2850,20 +2850,6 @@ remote_static_tracepoint_marker_at (CORE_ADDR addr,
   return 0;
 }
 
-static 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;
-}
-
 static VEC(static_tracepoint_marker_p) *
 remote_static_tracepoint_markers_by_strid (const char *strid)
 {
index 26705ed2ee0429387e203fa3d953d79962ee3799..f2436d346254795033955512b7c36afac0f8378e 100644 (file)
@@ -1,3 +1,7 @@
+2012-03-03  Yao Qi  <yao@codesourcery.com>
+
+       * gdb.trace/strace.exp: run strace_info_marker in linux native gdb.
+
 2012-03-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Setup KFAIL for PR server/13796.
index 7f4551ebeb408afa98219163ee56b3ecacdea3c9..88039ffc065ea1113b3674f2cef24a39e15acbfb 100644 (file)
@@ -38,20 +38,6 @@ if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags
     return -1
 }
 
-clean_restart $executable
-
-if ![runto_main] {
-    fail "Can't run to main to check for trace support"
-    return -1
-}
-
-if { ![gdb_target_supports_trace] } then {
-    unsupported "Current target does not support trace"
-    return -1;
-}
-
-gdb_load_shlibs $libipa
-
 proc strace_info_marker { } { with_test_prefix "info_marker" {
     global executable
     global gdb_prompt
@@ -248,6 +234,27 @@ proc strace_trace_on_diff_addr { } { with_test_prefix "trace_diff_addr" {
     gdb_test "tfind" "Target failed to find requested trace frame\\..*"
 }}
 
+clean_restart $executable
+
+if ![runto_main] {
+    fail "Can't run to main to check for trace support"
+    return -1
+}
+
+# Run it on native x86/x86_64 linux.
+if { ![is_remote target]
+     && ([istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"]) } {
+    strace_info_marker
+    return
+}
+
+if { ![gdb_target_supports_trace] } then {
+    unsupported "Current target does not support trace"
+    return -1;
+}
+
+gdb_load_shlibs $libipa
+
 strace_info_marker
 strace_probe_marker
 
index a519ed39a71e811cd518d6614e1825a69038851e..89f75b6b7ef74eddc02cbfb6aa449b9515c2aa1e 100644 (file)
@@ -4701,6 +4701,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
index 4003c668c126ef87122ac0136418b24116bb6d3f..ced29fab718f856d10be6fc103fd9b4cfba350a3 100644 (file)
@@ -209,6 +209,7 @@ extern void parse_static_tracepoint_marker_definition
   (char *line, char **pp,
    struct static_tracepoint_marker *marker);
 extern void release_static_tracepoint_marker (struct static_tracepoint_marker *);
+extern void free_current_marker (void *arg);
 
 /* A hook used to notify the UI of tracepoint operations.  */