aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorYao Qi <yao@codesourcery.com>2012-03-15 10:42:38 +0000
committerYao Qi <yao@codesourcery.com>2012-03-15 10:42:38 +0000
commit8d0d92cd227bd4f3a3fa9a6ec688002c7526f7fe (patch)
treed90617c012b59f25bc84b363d21f72ebf33b99f6 /gdb
parent856d06f9726a285eb8f7a3221f26ed2afe77fbe5 (diff)
downloadgdb-8d0d92cd227bd4f3a3fa9a6ec688002c7526f7fe.zip
gdb-8d0d92cd227bd4f3a3fa9a6ec688002c7526f7fe.tar.gz
gdb-8d0d92cd227bd4f3a3fa9a6ec688002c7526f7fe.tar.bz2
gdb/gdbserver/
* 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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/gdbserver/ChangeLog12
-rw-r--r--gdb/gdbserver/tracepoint.c150
2 files changed, 114 insertions, 48 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 54e4c72..44eb39f 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,15 @@
+2012-03-15 Yao Qi <yao@codesourcery.com>
+
+ * 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.
+
2012-03-13 Jan Kratochvil <jan.kratochvil@redhat.com>
* linux-low.c (linux_attach_lwp_1): New variable buffer. Call
diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index 7bf576b..2cce811 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) (const struct tracepoint_action *action);
+};
+
/* Base action. Concrete actions inherit this. */
struct tracepoint_action
{
+#ifndef IN_PROCESS_AGENT
+ const struct tracepoint_action_ops *ops;
+#endif
char type;
};
@@ -500,6 +516,87 @@ struct collect_static_trace_data_action
struct tracepoint_action base;
};
+#ifndef IN_PROCESS_AGENT
+static CORE_ADDR
+m_tracepoint_action_download (const 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 const struct tracepoint_action_ops m_tracepoint_action_ops =
+{
+ m_tracepoint_action_download,
+};
+
+static CORE_ADDR
+r_tracepoint_action_download (const 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 const 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 (const 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 const struct tracepoint_action_ops x_tracepoint_action_ops =
+{
+ x_tracepoint_action_download,
+};
+
+static CORE_ADDR
+l_tracepoint_action_download (const 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 const 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. */
@@ -1771,6 +1868,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;
@@ -1796,6 +1894,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");
@@ -1811,6 +1910,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");
@@ -1827,6 +1927,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");
@@ -5678,55 +5779,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