2012-01-23 Yao Qi * common/agent.c (struct ipa_sym_addresses) : New. (agent_check_capability): New. (symbol_list): New array element. * common/agent.h (enum agent_capa): New. --- gdb/common/agent.c | 31 +++++++++++++++++++++++++++++++ gdb/common/agent.h | 15 +++++++++++++++ 2 files changed, 46 insertions(+), 0 deletions(-) diff --git a/gdb/common/agent.c b/gdb/common/agent.c index 5c66071..f4ff08c 100644 --- a/gdb/common/agent.c +++ b/gdb/common/agent.c @@ -44,6 +44,7 @@ struct ipa_sym_addresses { CORE_ADDR addr_helper_thread_id; CORE_ADDR addr_cmd_buf; + CORE_ADDR addr_capability; }; /* Cache of the helper thread id. */ @@ -57,6 +58,7 @@ static struct } symbol_list[] = { IPA_SYM(helper_thread_id), IPA_SYM(cmd_buf), + IPA_SYM(capability), }; static struct ipa_sym_addresses ipa_sym_addrs; @@ -114,6 +116,9 @@ agent_get_helper_thread_id (void) return helper_thread_id; } +/* Each bit of it stands for a capability of agent. */ +static unsigned int agent_capability = 0; + /* Connects to synchronization socket. PID is the pid of inferior, which is used to set up connection socket. */ @@ -260,3 +265,29 @@ agent_run_command (int pid, const char *cmd, int len) } } } + +/* Return true if agent has capability AGENT_CAP, otherwise return false. */ + +int +agent_check_capability (enum agent_capa agent_capa) +{ + if (agent_capability == 0) + { +#ifdef GDBSERVER + if (read_inferior_memory (ipa_sym_addrs.addr_capability, + (unsigned char *) &agent_capability, + sizeof agent_capability)) +#else + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); + gdb_byte buf[4]; + + if (target_read_memory (ipa_sym_addrs.addr_capability, + buf, sizeof buf) == 0) + agent_capability = extract_unsigned_integer (buf, sizeof buf, + byte_order); + else +#endif + warning ("Error reading helper thread's id in lib"); + } + return agent_capability & agent_capa; +} diff --git a/gdb/common/agent.h b/gdb/common/agent.h index 079b65e..cf3fab1 100644 --- a/gdb/common/agent.h +++ b/gdb/common/agent.h @@ -36,3 +36,18 @@ void agent_look_up_symbols (void); extern int debug_agent ; extern int use_agent; + +/* Capability of agent. Different agents may have different capabilities, + such as installing fast tracepoint or evaluating breakpoint conditions. + Capabilities are represented by bit-maps, and each capability occupy one + bit. */ + +enum agent_capa +{ + /* Capability to install fast tracepoint. */ + AGENT_CAPA_FAST_TRACE = 0x1, + /* Capability to install static tracepoint. */ + AGENT_CAPA_STATIC_TRACE = (0x1 << 1), +}; + +int agent_check_capability (enum agent_capa); -- 1.7.0.4