From 8d0d92cd227bd4f3a3fa9a6ec688002c7526f7fe Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Thu, 15 Mar 2012 10:42:38 +0000 Subject: [PATCH] gdb/gdbserver/ * tracepoint.c (struct tracepoint_action_ops): New. (struct tracepoint_action) [!IN_PROCESS_AGENT] : 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/ChangeLog | 12 ++++ gdb/gdbserver/tracepoint.c | 150 ++++++++++++++++++++++++++++++--------------- 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 + + * tracepoint.c (struct tracepoint_action_ops): New. + (struct tracepoint_action) [!IN_PROCESS_AGENT] : 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 * 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 -- 2.7.4