« Return to Thread: [patch 0/5] Install fast tracepoint via IPA

[PATCH 1/5] OO tracepoint action.

by Yao Qi-4 :: Rate this Message:

| View in Thread

This is the V2.  V1 can be found in

  [PATCH 2/2] OO tracepoint_action
  http://sourceware.org/ml/gdb-patches/2012-03/msg00065.html

I include this patch in this series, because a new field in
`tracepoint_action_ops' will be added in this series.

2012-03-07  Yao Qi  <yao@...>

        * tracepoint.c (struct tracepoint_action_ops): New.
        (struct tracepoint_action) [!IN_PROCESS_AGENT] <ops>: New field.
        (m_tracepoint_action_download): New.
        (r_tracepoint_action_download): New.
        (x_tracepoint_action_download): New.
        (l_tracepoint_action_download): New.
        (add_tracepoint_action): Install `action->ops' according type.
        (download_tracepoint_1): Move code `download' function pointer
        of various tracepoint_action_ops.
---
 gdb/gdbserver/tracepoint.c |  149 ++++++++++++++++++++++++++++++--------------
 1 files changed, 101 insertions(+), 48 deletions(-)

diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index 21e58ff..fcb0877 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -459,12 +459,28 @@ write_inferior_uinteger (CORE_ADDR symaddr, unsigned int val)
   return write_inferior_memory (symaddr, (unsigned char *) &val, sizeof (val));
 }
 
+static CORE_ADDR target_malloc (ULONGEST size);
+static int write_inferior_data_ptr (CORE_ADDR where, CORE_ADDR ptr);
 #endif
 
+/* Operations on various types of tracepoint actions.  */
+
+struct tracepoint_action;
+
+struct tracepoint_action_ops
+{
+  /* Download tracepoint action ACTION to IPA.  Return the address of action
+     in IPA/inferior.  */
+  CORE_ADDR (*download) (struct tracepoint_action *action);
+};
+
 /* Base action.  Concrete actions inherit this.  */
 
 struct tracepoint_action
 {
+#ifndef IN_PROCESS_AGENT
+  struct tracepoint_action_ops *ops;
+#endif
   char type;
 };
 
@@ -500,6 +516,86 @@ struct collect_static_trace_data_action
   struct tracepoint_action base;
 };
 
+#ifndef IN_PROCESS_AGENT
+static CORE_ADDR
+m_tracepoint_action_download (struct tracepoint_action *action)
+{
+  int size_in_ipa = (sizeof (struct collect_memory_action)
+     - offsetof (struct tracepoint_action, type));
+  CORE_ADDR ipa_action = target_malloc (size_in_ipa);
+
+  write_inferior_memory (ipa_action, (unsigned char *) &action->type,
+ size_in_ipa);
+
+  return ipa_action;
+}
+
+static struct tracepoint_action_ops m_tracepoint_action_ops =
+{
+  m_tracepoint_action_download,
+};
+
+static CORE_ADDR
+r_tracepoint_action_download (struct tracepoint_action *action)
+{
+  int size_in_ipa = (sizeof (struct collect_registers_action)
+     - offsetof (struct tracepoint_action, type));
+  CORE_ADDR ipa_action  = target_malloc (size_in_ipa);
+
+  write_inferior_memory (ipa_action, (unsigned char *) &action->type,
+ size_in_ipa);
+
+  return ipa_action;
+}
+
+static struct tracepoint_action_ops r_tracepoint_action_ops =
+{
+  r_tracepoint_action_download,
+};
+
+static CORE_ADDR download_agent_expr (struct agent_expr *expr);
+
+static CORE_ADDR
+x_tracepoint_action_download (struct tracepoint_action *action)
+{
+  int size_in_ipa = (sizeof (struct eval_expr_action)
+     - offsetof (struct tracepoint_action, type));
+  CORE_ADDR ipa_action = target_malloc (size_in_ipa);
+  CORE_ADDR expr;
+
+  write_inferior_memory (ipa_action, (unsigned char *) &action->type,
+ size_in_ipa);
+  expr = download_agent_expr (((struct eval_expr_action *)action)->expr);
+  write_inferior_data_ptr (ipa_action + offsetof (struct eval_expr_action, expr)
+   - offsetof (struct tracepoint_action, type),
+   expr);
+
+  return ipa_action;
+}
+
+static struct tracepoint_action_ops x_tracepoint_action_ops =
+{
+  x_tracepoint_action_download,
+};
+
+static CORE_ADDR
+l_tracepoint_action_download (struct tracepoint_action *action)
+{
+  int size_in_ipa = (sizeof (struct collect_static_trace_data_action)
+     - offsetof (struct tracepoint_action, type));
+  CORE_ADDR ipa_action = target_malloc (size_in_ipa);
+
+  write_inferior_memory (ipa_action, (unsigned char *) &action->type,
+ size_in_ipa);
+
+  return ipa_action;
+}
+static struct tracepoint_action_ops l_tracepoint_action_ops =
+{
+  l_tracepoint_action_download,
+};
+#endif
+
 /* This structure describes a piece of the source-level definition of
    the tracepoint.  The contents are not interpreted by the target,
    but preserved verbatim for uploading upon reconnection.  */
@@ -1749,6 +1845,7 @@ add_tracepoint_action (struct tracepoint *tpoint, char *packet)
 
     maction = xmalloc (sizeof *maction);
     maction->base.type = *act;
+    maction->base.ops = &m_tracepoint_action_ops;
     action = &maction->base;
 
     ++act;
@@ -1774,6 +1871,7 @@ add_tracepoint_action (struct tracepoint *tpoint, char *packet)
 
     raction = xmalloc (sizeof *raction);
     raction->base.type = *act;
+    raction->base.ops = &r_tracepoint_action_ops;
     action = &raction->base;
 
     trace_debug ("Want to collect registers");
@@ -1789,6 +1887,7 @@ add_tracepoint_action (struct tracepoint *tpoint, char *packet)
 
     raction = xmalloc (sizeof *raction);
     raction->base.type = *act;
+    raction->base.ops = &l_tracepoint_action_ops;
     action = &raction->base;
 
     trace_debug ("Want to collect static trace data");
@@ -1805,6 +1904,7 @@ add_tracepoint_action (struct tracepoint *tpoint, char *packet)
 
     xaction = xmalloc (sizeof (*xaction));
     xaction->base.type = *act;
+    xaction->base.ops = &x_tracepoint_action_ops;
     action = &xaction->base;
 
     trace_debug ("Want to evaluate expression");
@@ -5654,55 +5754,8 @@ download_tracepoint_1 (struct tracepoint *tpoint)
       /* Now for each pointer, download the action.  */
       for (i = 0; i < tpoint->numactions; i++)
  {
-  CORE_ADDR ipa_action = 0;
   struct tracepoint_action *action = tpoint->actions[i];
-
-  switch (action->type)
-    {
-    case 'M':
-      ipa_action
- = target_malloc (sizeof (struct collect_memory_action));
-      write_inferior_memory (ipa_action,
-     (unsigned char *) action,
-     sizeof (struct collect_memory_action));
-      break;
-    case 'R':
-      ipa_action
- = target_malloc (sizeof (struct collect_registers_action));
-      write_inferior_memory (ipa_action,
-     (unsigned char *) action,
-     sizeof (struct collect_registers_action));
-      break;
-    case 'X':
-      {
- CORE_ADDR expr;
- struct eval_expr_action *eaction
-  = (struct eval_expr_action *) action;
-
- ipa_action = target_malloc (sizeof (*eaction));
- write_inferior_memory (ipa_action,
-       (unsigned char *) eaction,
-       sizeof (*eaction));
-
- expr = download_agent_expr (eaction->expr);
- write_inferior_data_ptr
-  (ipa_action + offsetof (struct eval_expr_action, expr),
-   expr);
- break;
-      }
-    case 'L':
-      ipa_action = target_malloc
- (sizeof (struct collect_static_trace_data_action));
-      write_inferior_memory
- (ipa_action,
- (unsigned char *) action,
- sizeof (struct collect_static_trace_data_action));
-      break;
-    default:
-      trace_debug ("unknown trace action '%c', ignoring",
-   action->type);
-      break;
-    }
+  CORE_ADDR ipa_action = action->ops->download (action);
 
   if (ipa_action != 0)
     write_inferior_data_ptr
--
1.7.0.4

 « Return to Thread: [patch 0/5] Install fast tracepoint via IPA