diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/common/agent.h | 3 | ||||
-rw-r--r-- | gdb/common/common-defs.h | 4 | ||||
-rw-r--r-- | gdb/gdbserver/ChangeLog | 51 | ||||
-rw-r--r-- | gdb/gdbserver/linux-amd64-ipa.c | 2 | ||||
-rw-r--r-- | gdb/gdbserver/linux-i386-ipa.c | 2 | ||||
-rw-r--r-- | gdb/gdbserver/tracepoint.c | 186 | ||||
-rw-r--r-- | gdb/gdbserver/tracepoint.h | 50 |
8 files changed, 201 insertions, 103 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aa4a614a3d8..3709441857a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2015-02-27 Pedro Alves <palves@redhat.com> + * common/agent.h (IPA_SYM_EXPORTED_NAME): New. + (IPA_SYM): Use it. + * common/common-defs.h (EXTERN_C_PUSH, EXTERN_C_POP): New macros. + +2015-02-27 Pedro Alves <palves@redhat.com> + * cli-out.c (_rl_erase_entire_line): Move declaration out of cli_mld_erase_entire_line, and make it extern "C". * common/common-defs.h (EXTERN_C): New. diff --git a/gdb/common/agent.h b/gdb/common/agent.h index e01b0ad2d55..a004c2e6b6f 100644 --- a/gdb/common/agent.h +++ b/gdb/common/agent.h @@ -23,9 +23,10 @@ int agent_look_up_symbols (void *); #define STRINGIZE_1(STR) #STR #define STRINGIZE(STR) STRINGIZE_1(STR) +#define IPA_SYM_EXPORTED_NAME(SYM) gdb_agent_ ## SYM #define IPA_SYM(SYM) \ { \ - STRINGIZE (gdb_agent_ ## SYM), \ + STRINGIZE (IPA_SYM_EXPORTED_NAME (SYM)), \ offsetof (struct ipa_sym_addresses, addr_ ## SYM) \ } diff --git a/gdb/common/common-defs.h b/gdb/common/common-defs.h index 3020bd882ca..62d9de51064 100644 --- a/gdb/common/common-defs.h +++ b/gdb/common/common-defs.h @@ -52,8 +52,12 @@ #ifdef __cplusplus # define EXTERN_C extern "C" +# define EXTERN_C_PUSH extern "C" { +# define EXTERN_C_POP } #else # define EXTERN_C extern +# define EXTERN_C_PUSH +# define EXTERN_C_POP #endif #endif /* COMMON_DEFS_H */ diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index ae35e193f57..384314a5295 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,54 @@ +2015-02-27 Pedro Alves <palves@redhat.com> + + * linux-amd64-ipa.c (gdb_agent_get_raw_reg): Use + IP_AGENT_EXPORT_FUNC. + * linux-i386-ipa.c (gdb_agent_get_raw_reg): Use + IP_AGENT_EXPORT_FUNC. + * tracepoint.c (ATTR_USED, ATTR_NOINLINE, ATTR_CONSTRUCTOR) + (IP_AGENT_EXPORT): Delete. + (gdb_tp_heap_buffer, gdb_jump_pad_buffer, gdb_jump_pad_buffer_end) + (gdb_trampoline_buffer, gdb_trampoline_buffer_end) + (gdb_trampoline_buffer_error, collecting, gdb_collect) + (stop_tracing, flush_trace_buffer, about_to_request_buffer_space) + (trace_buffer_is_full, stopping_tracepoint, expr_eval_result) + (error_tracepoint, tracepoints, tracing, trace_buffer_ctrl) + (trace_buffer_ctrl_curr, trace_buffer_lo, trace_buffer_hi) + (traceframe_read_count, traceframe_write_count) + (traceframes_created, trace_state_variables, get_raw_reg) + (get_trace_state_variable_value, set_trace_state_variable_value) + (ust_loaded, helper_thread_id, cmd_buf): Use + IPA_SYM_EXPORTED_NAME. + (stop_tracing, flush_trace_buffer): Use IP_AGENT_EXPORT_FUNC. + (tracepoints) Use IP_AGENT_EXPORT_VAR. + (stopping_tracepoint, trace_buffer_is_full, expr_eval_result): Use + IP_AGENT_EXPORT_VAR and wrap in EXTERN_C_PUSH/EXTERN_C_POP. + (last_tracepoint): Move into !IN_PROCESS_AGENT block. + (error_tracepoint): Use IP_AGENT_EXPORT_VAR and wrap in + EXTERN_C_PUSH/EXTERN_C_POP. + (trace_state_variables): Use IP_AGENT_EXPORT_VAR. + (trace_buffer_lo, trace_buffer_hi): Use IP_AGENT_EXPORT_VAR and + wrap in EXTERN_C_PUSH/EXTERN_C_POP. + (trace_buffer_ctrl, trace_buffer_ctrl_curr) + (traceframe_write_count, traceframe_read_count) + (traceframes_created, tracing): Use IP_AGENT_EXPORT_VAR. + (about_to_request_buffer_space, get_trace_state_variable_value) + (set_trace_state_variable_value): Use IP_AGENT_EXPORT_FUNC. + (collecting): Use IP_AGENT_EXPORT_VAR and wrap in + EXTERN_C_PUSH/EXTERN_C_POP. + (gdb_collect): Use IP_AGENT_EXPORT_FUNC. + (ust_loaded, cmd_buf): Use IP_AGENT_EXPORT_VAR. + (helper_thread_id, gdb_agent_capability): Use IP_AGENT_EXPORT_VAR + and wrap in EXTERN_C_PUSH/EXTERN_C_POP. + (gdb_tp_heap_buffer, gdb_jump_pad_buffer, gdb_jump_pad_buffer_end) + (gdb_trampoline_buffer, gdb_trampoline_buffer_end) + (gdb_trampoline_buffer_error): Use IP_AGENT_EXPORT_VAR. + * tracepoint.h (ATTR_USED, ATTR_NOINLINE, EXPORTED_SYMBOL): + Define. + (IP_AGENT_EXPORT_FUNC, IP_AGENT_EXPORT_VAR) + (IP_AGENT_EXPORT_VAR_DECL): Define. + (tracing): Declare. + (gdb_agent_get_raw_reg): Declare. + 2015-02-27 Tom Tromey <tromey@redhat.com> Pedro Alves <palves@redhat.com> diff --git a/gdb/gdbserver/linux-amd64-ipa.c b/gdb/gdbserver/linux-amd64-ipa.c index c27ef21e5c0..a6dfb0372e9 100644 --- a/gdb/gdbserver/linux-amd64-ipa.c +++ b/gdb/gdbserver/linux-amd64-ipa.c @@ -68,7 +68,7 @@ supply_fast_tracepoint_registers (struct regcache *regcache, ((char *) buf) + x86_64_ft_collect_regmap[i]); } -ULONGEST __attribute__ ((visibility("default"), used)) +IP_AGENT_EXPORT_FUNC ULONGEST gdb_agent_get_raw_reg (const unsigned char *raw_regs, int regnum) { if (regnum >= X86_64_NUM_FT_COLLECT_GREGS) diff --git a/gdb/gdbserver/linux-i386-ipa.c b/gdb/gdbserver/linux-i386-ipa.c index 6381a5515ec..c00d01b7784 100644 --- a/gdb/gdbserver/linux-i386-ipa.c +++ b/gdb/gdbserver/linux-i386-ipa.c @@ -99,7 +99,7 @@ supply_fast_tracepoint_registers (struct regcache *regcache, } } -ULONGEST __attribute__ ((visibility("default"), used)) +IP_AGENT_EXPORT_FUNC ULONGEST gdb_agent_get_raw_reg (unsigned char *raw_regs, int regnum) { /* This should maybe be allowed to return an error code, or perhaps diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index 2382a11a3ea..6fcd0b07b5d 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -99,70 +99,43 @@ trace_vdebug (const char *fmt, ...) #define trace_debug(FMT, args...) \ trace_debug_1 (1, FMT, ##args) -#if defined(__GNUC__) -# define ATTR_USED __attribute__((used)) -# define ATTR_NOINLINE __attribute__((noinline)) -# define ATTR_CONSTRUCTOR __attribute__ ((constructor)) -#else -# define ATTR_USED -# define ATTR_NOINLINE -# define ATTR_CONSTRUCTOR -#endif - -/* Make sure the functions the IPA needs to export (symbols GDBserver - needs to query GDB about) are exported. */ - -#ifdef IN_PROCESS_AGENT -# if defined _WIN32 || defined __CYGWIN__ -# define IP_AGENT_EXPORT __declspec(dllexport) ATTR_USED -# else -# if __GNUC__ >= 4 -# define IP_AGENT_EXPORT \ - __attribute__ ((visibility("default"))) ATTR_USED -# else -# define IP_AGENT_EXPORT ATTR_USED -# endif -# endif -#else -# define IP_AGENT_EXPORT -#endif - /* Prefix exported symbols, for good citizenship. All the symbols - that need exporting are defined in this module. */ + that need exporting are defined in this module. Note that all + these symbols must be tagged with IP_AGENT_EXPORT_*. */ #ifdef IN_PROCESS_AGENT -# define gdb_tp_heap_buffer gdb_agent_gdb_tp_heap_buffer -# define gdb_jump_pad_buffer gdb_agent_gdb_jump_pad_buffer -# define gdb_jump_pad_buffer_end gdb_agent_gdb_jump_pad_buffer_end -# define gdb_trampoline_buffer gdb_agent_gdb_trampoline_buffer -# define gdb_trampoline_buffer_end gdb_agent_gdb_trampoline_buffer_end -# define gdb_trampoline_buffer_error gdb_agent_gdb_trampoline_buffer_error -# define collecting gdb_agent_collecting -# define gdb_collect gdb_agent_gdb_collect -# define stop_tracing gdb_agent_stop_tracing -# define flush_trace_buffer gdb_agent_flush_trace_buffer -# define about_to_request_buffer_space gdb_agent_about_to_request_buffer_space -# define trace_buffer_is_full gdb_agent_trace_buffer_is_full -# define stopping_tracepoint gdb_agent_stopping_tracepoint -# define expr_eval_result gdb_agent_expr_eval_result -# define error_tracepoint gdb_agent_error_tracepoint -# define tracepoints gdb_agent_tracepoints -# define tracing gdb_agent_tracing -# define trace_buffer_ctrl gdb_agent_trace_buffer_ctrl -# define trace_buffer_ctrl_curr gdb_agent_trace_buffer_ctrl_curr -# define trace_buffer_lo gdb_agent_trace_buffer_lo -# define trace_buffer_hi gdb_agent_trace_buffer_hi -# define traceframe_read_count gdb_agent_traceframe_read_count -# define traceframe_write_count gdb_agent_traceframe_write_count -# define traceframes_created gdb_agent_traceframes_created -# define trace_state_variables gdb_agent_trace_state_variables -# define get_raw_reg gdb_agent_get_raw_reg +# define gdb_tp_heap_buffer IPA_SYM_EXPORTED_NAME (gdb_tp_heap_buffer) +# define gdb_jump_pad_buffer IPA_SYM_EXPORTED_NAME (gdb_jump_pad_buffer) +# define gdb_jump_pad_buffer_end IPA_SYM_EXPORTED_NAME (gdb_jump_pad_buffer_end) +# define gdb_trampoline_buffer IPA_SYM_EXPORTED_NAME (gdb_trampoline_buffer) +# define gdb_trampoline_buffer_end IPA_SYM_EXPORTED_NAME (gdb_trampoline_buffer_end) +# define gdb_trampoline_buffer_error IPA_SYM_EXPORTED_NAME (gdb_trampoline_buffer_error) +# define collecting IPA_SYM_EXPORTED_NAME (collecting) +# define gdb_collect IPA_SYM_EXPORTED_NAME (gdb_collect) +# define stop_tracing IPA_SYM_EXPORTED_NAME (stop_tracing) +# define flush_trace_buffer IPA_SYM_EXPORTED_NAME (flush_trace_buffer) +# define about_to_request_buffer_space IPA_SYM_EXPORTED_NAME (about_to_request_buffer_space) +# define trace_buffer_is_full IPA_SYM_EXPORTED_NAME (trace_buffer_is_full) +# define stopping_tracepoint IPA_SYM_EXPORTED_NAME (stopping_tracepoint) +# define expr_eval_result IPA_SYM_EXPORTED_NAME (expr_eval_result) +# define error_tracepoint IPA_SYM_EXPORTED_NAME (error_tracepoint) +# define tracepoints IPA_SYM_EXPORTED_NAME (tracepoints) +# define tracing IPA_SYM_EXPORTED_NAME (tracing) +# define trace_buffer_ctrl IPA_SYM_EXPORTED_NAME (trace_buffer_ctrl) +# define trace_buffer_ctrl_curr IPA_SYM_EXPORTED_NAME (trace_buffer_ctrl_curr) +# define trace_buffer_lo IPA_SYM_EXPORTED_NAME (trace_buffer_lo) +# define trace_buffer_hi IPA_SYM_EXPORTED_NAME (trace_buffer_hi) +# define traceframe_read_count IPA_SYM_EXPORTED_NAME (traceframe_read_count) +# define traceframe_write_count IPA_SYM_EXPORTED_NAME (traceframe_write_count) +# define traceframes_created IPA_SYM_EXPORTED_NAME (traceframes_created) +# define trace_state_variables IPA_SYM_EXPORTED_NAME (trace_state_variables) +# define get_raw_reg IPA_SYM_EXPORTED_NAME (get_raw_reg) # define get_trace_state_variable_value \ - gdb_agent_get_trace_state_variable_value + IPA_SYM_EXPORTED_NAME (get_trace_state_variable_value) # define set_trace_state_variable_value \ - gdb_agent_set_trace_state_variable_value -# define ust_loaded gdb_agent_ust_loaded -# define helper_thread_id gdb_agent_helper_thread_id -# define cmd_buf gdb_agent_cmd_buf + IPA_SYM_EXPORTED_NAME (set_trace_state_variable_value) +# define ust_loaded IPA_SYM_EXPORTED_NAME (ust_loaded) +# define helper_thread_id IPA_SYM_EXPORTED_NAME (helper_thread_id) +# define cmd_buf IPA_SYM_EXPORTED_NAME (cmd_buf) #endif #ifndef IN_PROCESS_AGENT @@ -395,14 +368,14 @@ read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len) # define UNKNOWN_SIDE_EFFECTS() do {} while (0) #endif -IP_AGENT_EXPORT void ATTR_USED ATTR_NOINLINE +IP_AGENT_EXPORT_FUNC void stop_tracing (void) { /* GDBserver places breakpoint here. */ UNKNOWN_SIDE_EFFECTS(); } -IP_AGENT_EXPORT void ATTR_USED ATTR_NOINLINE +IP_AGENT_EXPORT_FUNC void flush_trace_buffer (void) { /* GDBserver places breakpoint here. */ @@ -861,31 +834,34 @@ struct wstep_state #endif +EXTERN_C_PUSH + /* The linked list of all tracepoints. Marked explicitly as used as the in-process library doesn't use it for the fast tracepoints support. */ -IP_AGENT_EXPORT struct tracepoint *tracepoints ATTR_USED; - -#ifndef IN_PROCESS_AGENT - -/* Pointer to the last tracepoint in the list, new tracepoints are - linked in at the end. */ - -static struct tracepoint *last_tracepoint; -#endif +IP_AGENT_EXPORT_VAR struct tracepoint *tracepoints; /* The first tracepoint to exceed its pass count. */ -IP_AGENT_EXPORT struct tracepoint *stopping_tracepoint; +IP_AGENT_EXPORT_VAR struct tracepoint *stopping_tracepoint; /* True if the trace buffer is full or otherwise no longer usable. */ -IP_AGENT_EXPORT int trace_buffer_is_full; +IP_AGENT_EXPORT_VAR int trace_buffer_is_full; -static enum eval_result_type expr_eval_result = expr_eval_no_error; +/* The first error that occurred during expression evaluation. */ + +IP_AGENT_EXPORT_VAR enum eval_result_type expr_eval_result = expr_eval_no_error; + +EXTERN_C_POP #ifndef IN_PROCESS_AGENT +/* Pointer to the last tracepoint in the list, new tracepoints are + linked in at the end. */ + +static struct tracepoint *last_tracepoint; + static const char *eval_result_names[] = { "terror:in the attic", /* this should never be reported */ @@ -902,7 +878,9 @@ static const char *eval_result_names[] = /* The tracepoint in which the error occurred. */ -static struct tracepoint *error_tracepoint; +EXTERN_C_PUSH +IP_AGENT_EXPORT_VAR struct tracepoint *error_tracepoint; +EXTERN_C_POP struct trace_state_variable { @@ -936,7 +914,7 @@ struct trace_state_variable struct trace_state_variable *alloced_trace_state_variables; #endif -IP_AGENT_EXPORT struct trace_state_variable *trace_state_variables; +IP_AGENT_EXPORT_VAR struct trace_state_variable *trace_state_variables; /* The results of tracing go into a fixed-size space known as the "trace buffer". Because usage follows a limited number of @@ -1019,14 +997,18 @@ static int circular_trace_buffer; static LONGEST trace_buffer_size; +EXTERN_C_PUSH + /* Pointer to the block of memory that traceframes all go into. */ -static unsigned char *trace_buffer_lo; +IP_AGENT_EXPORT_VAR unsigned char *trace_buffer_lo; /* Pointer to the end of the trace buffer, more precisely to the byte after the end of the buffer. */ -static unsigned char *trace_buffer_hi; +IP_AGENT_EXPORT_VAR unsigned char *trace_buffer_hi; + +EXTERN_C_POP /* Control structure holding the read/write/etc. pointers into the trace buffer. We need more than one of these to implement a @@ -1180,8 +1162,8 @@ A GDBserver update of `trace_buffer_ctrl_curr' does: #define GDBSERVER_UPDATED_FLUSH_COUNT_BIT 0x80000000 #ifdef IN_PROCESS_AGENT -IP_AGENT_EXPORT struct trace_buffer_control trace_buffer_ctrl[3]; -IP_AGENT_EXPORT unsigned int trace_buffer_ctrl_curr; +IP_AGENT_EXPORT_VAR struct trace_buffer_control trace_buffer_ctrl[3]; +IP_AGENT_EXPORT_VAR unsigned int trace_buffer_ctrl_curr; # define TRACE_BUFFER_CTRL_CURR \ (trace_buffer_ctrl_curr & ~GDBSERVER_FLUSH_COUNT_MASK) @@ -1226,8 +1208,8 @@ struct trace_buffer_control trace_buffer_ctrl[1]; of complete traceframes present in the trace buffer. The IP agent writes to the write count, GDBserver writes to read count. */ -IP_AGENT_EXPORT unsigned int traceframe_write_count; -IP_AGENT_EXPORT unsigned int traceframe_read_count; +IP_AGENT_EXPORT_VAR unsigned int traceframe_write_count; +IP_AGENT_EXPORT_VAR unsigned int traceframe_read_count; /* Convenience macro. */ @@ -1237,7 +1219,7 @@ IP_AGENT_EXPORT unsigned int traceframe_read_count; /* The count of all traceframes created in the current run, including ones that were discarded to make room. */ -IP_AGENT_EXPORT int traceframes_created; +IP_AGENT_EXPORT_VAR int traceframes_created; #ifndef IN_PROCESS_AGENT @@ -1267,7 +1249,7 @@ static struct readonly_region *readonly_regions; /* The global that controls tracing overall. */ -IP_AGENT_EXPORT int tracing; +IP_AGENT_EXPORT_VAR int tracing; #ifndef IN_PROCESS_AGENT @@ -1524,7 +1506,7 @@ init_trace_buffer (LONGEST bufsize) #ifdef IN_PROCESS_AGENT -IP_AGENT_EXPORT void ATTR_USED ATTR_NOINLINE +IP_AGENT_EXPORT_FUNC void about_to_request_buffer_space (void) { /* GDBserver places breakpoint here while it goes about to flush @@ -2127,7 +2109,7 @@ create_trace_state_variable (int num, int gdb) return tsv; } -IP_AGENT_EXPORT LONGEST +IP_AGENT_EXPORT_FUNC LONGEST get_trace_state_variable_value (int num) { struct trace_state_variable *tsv; @@ -2153,7 +2135,7 @@ get_trace_state_variable_value (int num) return tsv->value; } -IP_AGENT_EXPORT void +IP_AGENT_EXPORT_FUNC void set_trace_state_variable_value (int num, LONGEST val) { struct trace_state_variable *tsv; @@ -5797,13 +5779,15 @@ fast_tracepoint_collecting, returning continue-until-break at %s", NULL if it isn't locked. Note that this lock *must* be set while executing any *function other than the jump pad. See fast_tracepoint_collecting. */ -static collecting_t * ATTR_USED collecting; +EXTERN_C_PUSH +IP_AGENT_EXPORT_VAR collecting_t *collecting; +EXTERN_C_POP /* This routine, called from the jump pad (in asm) is designed to be called from the jump pads of fast tracepoints, thus it is on the critical path. */ -IP_AGENT_EXPORT void ATTR_USED +IP_AGENT_EXPORT_FUNC void gdb_collect (struct tracepoint *tpoint, unsigned char *regs) { struct fast_tracepoint_ctx ctx; @@ -6554,8 +6538,8 @@ upload_fast_traceframes (void) #ifdef IN_PROCESS_AGENT -IP_AGENT_EXPORT int ust_loaded; -IP_AGENT_EXPORT char cmd_buf[IPA_CMD_BUF_SIZE]; +IP_AGENT_EXPORT_VAR int ust_loaded; +IP_AGENT_EXPORT_VAR char cmd_buf[IPA_CMD_BUF_SIZE]; #ifdef HAVE_UST @@ -6846,7 +6830,9 @@ run_inferior_command (char *cmd, int len) /* Thread ID of the helper thread. GDBserver reads this to know which is the help thread. This is an LWP id on Linux. */ -int helper_thread_id; +EXTERN_C_PUSH +IP_AGENT_EXPORT_VAR int helper_thread_id; +EXTERN_C_POP static int init_named_socket (const char *name) @@ -7276,7 +7262,9 @@ gdb_agent_helper_thread (void *arg) #include <signal.h> #include <pthread.h> -IP_AGENT_EXPORT int gdb_agent_capability = AGENT_CAPA_STATIC_TRACE; +EXTERN_C_PUSH +IP_AGENT_EXPORT_VAR int gdb_agent_capability = AGENT_CAPA_STATIC_TRACE; +EXTERN_C_POP static void gdb_agent_init (void) @@ -7314,12 +7302,12 @@ gdb_agent_init (void) #include <sys/mman.h> #include <fcntl.h> -IP_AGENT_EXPORT char *gdb_tp_heap_buffer; -IP_AGENT_EXPORT char *gdb_jump_pad_buffer; -IP_AGENT_EXPORT char *gdb_jump_pad_buffer_end; -IP_AGENT_EXPORT char *gdb_trampoline_buffer; -IP_AGENT_EXPORT char *gdb_trampoline_buffer_end; -IP_AGENT_EXPORT char *gdb_trampoline_buffer_error; +IP_AGENT_EXPORT_VAR char *gdb_tp_heap_buffer; +IP_AGENT_EXPORT_VAR char *gdb_jump_pad_buffer; +IP_AGENT_EXPORT_VAR char *gdb_jump_pad_buffer_end; +IP_AGENT_EXPORT_VAR char *gdb_trampoline_buffer; +IP_AGENT_EXPORT_VAR char *gdb_trampoline_buffer_end; +IP_AGENT_EXPORT_VAR char *gdb_trampoline_buffer_error; /* Record the result of getting buffer space for fast tracepoint trampolines. Any error message is copied, since caller may not be diff --git a/gdb/gdbserver/tracepoint.h b/gdb/gdbserver/tracepoint.h index 2adcd5610ea..30d0b589a6f 100644 --- a/gdb/gdbserver/tracepoint.h +++ b/gdb/gdbserver/tracepoint.h @@ -25,7 +25,50 @@ void initialize_tracepoint (void); -extern int tracing; +#if defined(__GNUC__) +# define ATTR_USED __attribute__((used)) +# define ATTR_NOINLINE __attribute__((noinline)) +#else +# define ATTR_USED +# define ATTR_NOINLINE +#endif + +/* How to make symbol public/exported. */ + +#if defined _WIN32 || defined __CYGWIN__ +# define EXPORTED_SYMBOL __declspec (dllexport) +#else +# if __GNUC__ >= 4 +# define EXPORTED_SYMBOL __attribute__ ((visibility ("default"))) +# else +# define EXPORTED_SYMBOL +# endif +#endif + +/* Use these to make sure the functions and variables the IPA needs to + export (symbols GDBserver needs to query GDB about) are visible and + have C linkage. + + Tag exported functions with IP_AGENT_EXPORT_FUNC, tag the + definitions of exported variables with IP_AGENT_EXPORT_VAR, and + variable declarations with IP_AGENT_EXPORT_VAR_DECL. Variables + must also be exported with C linkage. As we can't both use extern + "C" and initialize a variable in the same statement, variables that + don't have a separate declaration must use + EXTERN_C_PUSH/EXTERN_C_POP around their definition. */ + +#ifdef IN_PROCESS_AGENT +# define IP_AGENT_EXPORT_FUNC EXTERN_C EXPORTED_SYMBOL ATTR_NOINLINE ATTR_USED +# define IP_AGENT_EXPORT_VAR EXPORTED_SYMBOL ATTR_USED +# define IP_AGENT_EXPORT_VAR_DECL EXTERN_C EXPORTED_SYMBOL +#else +# define IP_AGENT_EXPORT_FUNC +# define IP_AGENT_EXPORT_VAR +# define IP_AGENT_EXPORT_VAR_DECL extern +#endif + +IP_AGENT_EXPORT_VAR_DECL int tracing; + extern int disconnected_tracing; void tracepoint_look_up_symbols (void); @@ -120,6 +163,11 @@ int agent_mem_read_string (struct eval_agent_expr_context *ctx, CORE_ADDR from, ULONGEST len); +/* The prototype the get_raw_reg function in the IPA. Each arch's + bytecode compiler emits calls to this function. */ +IP_AGENT_EXPORT_FUNC ULONGEST gdb_agent_get_raw_reg + (const unsigned char *raw_regs, int regnum); + /* Returns the address of the get_raw_reg function in the IPA. */ CORE_ADDR get_raw_reg_func_addr (void); /* Returns the address of the get_trace_state_variable_value |