X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Ftracepoint.c;h=3ce958066f7447b5843bf259740409fdfc9fdd33;hb=14b0bc68e8a9f8e8fc3d27c64c7cf5f7c676cea1;hp=2e83d71aed29a2184e314d7239bb76ae7ed9ec72;hpb=14ce3192392edde90aa444c153eacede6c1ba5c5;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index 2e83d71aed..3ce958066f 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -1,5 +1,5 @@ /* Tracepoint code for remote server for GDB. - Copyright (C) 2009-2014 Free Software Foundation, Inc. + Copyright (C) 2009-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -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; + +/* The first error that occurred during expression evaluation. */ + +IP_AGENT_EXPORT_VAR enum eval_result_type expr_eval_result = expr_eval_no_error; -static 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; @@ -2377,6 +2359,13 @@ cmd_qtinit (char *packet) { struct trace_state_variable *tsv, *prev, *next; + /* Can't do this command without a pid attached. */ + if (current_thread == NULL) + { + write_enn (packet); + return; + } + /* Make sure we don't try to read from a trace frame. */ current_traceframe = -1; @@ -2443,7 +2432,6 @@ clear_installed_tracepoints (void) struct tracepoint *prev_stpoint; pause_all (1); - cancel_breakpoints (); prev_stpoint = NULL; @@ -3433,9 +3421,6 @@ stop_tracing (void) We can't now, since we may be getting here due to the inferior agent calling us. */ pause_all (1); - /* Since we're removing breakpoints, cancel breakpoint hits, - possibly related to the breakpoints we're about to delete. */ - cancel_breakpoints (); /* Stop logging. Tracepoints can still be hit, but they will not be recorded. */ @@ -3566,14 +3551,14 @@ cmd_qtframe (char *own_buf) packet += strlen ("QTFrame:"); - if (strncmp (packet, "pc:", strlen ("pc:")) == 0) + if (startswith (packet, "pc:")) { packet += strlen ("pc:"); unpack_varlen_hex (packet, &pc); trace_debug ("Want to find next traceframe at pc=0x%s", paddress (pc)); tframe = find_next_traceframe_in_range (pc, pc, 1, &tfnum); } - else if (strncmp (packet, "range:", strlen ("range:")) == 0) + else if (startswith (packet, "range:")) { packet += strlen ("range:"); packet = unpack_varlen_hex (packet, &lo); @@ -3583,7 +3568,7 @@ cmd_qtframe (char *own_buf) paddress (lo), paddress (hi)); tframe = find_next_traceframe_in_range (lo, hi, 1, &tfnum); } - else if (strncmp (packet, "outside:", strlen ("outside:")) == 0) + else if (startswith (packet, "outside:")) { packet += strlen ("outside:"); packet = unpack_varlen_hex (packet, &lo); @@ -3594,7 +3579,7 @@ cmd_qtframe (char *own_buf) paddress (lo), paddress (hi)); tframe = find_next_traceframe_in_range (lo, hi, 0, &tfnum); } - else if (strncmp (packet, "tdp:", strlen ("tdp:")) == 0) + else if (startswith (packet, "tdp:")) { packet += strlen ("tdp:"); unpack_varlen_hex (packet, &num); @@ -3630,7 +3615,8 @@ static void cmd_qtstatus (char *packet) { char *stop_reason_rsp = NULL; - char *buf1, *buf2, *buf3, *str; + char *buf1, *buf2, *buf3; + const char *str; int slen; /* Translate the plain text of the notes back into hex for @@ -3668,7 +3654,7 @@ cmd_qtstatus (char *packet) /* The user visible error string in terror needs to be hex encoded. We leave it as plain string in `tracing_stop_reason' to ease debugging. */ - if (strncmp (stop_reason_rsp, "terror:", strlen ("terror:")) == 0) + if (startswith (stop_reason_rsp, "terror:")) { const char *result_name; int hexstr_len; @@ -3979,19 +3965,19 @@ gdb_agent_about_to_close (int pid) if (!maybe_write_ipa_not_loaded (buf)) { - struct thread_info *save_inferior; + struct thread_info *saved_thread; - save_inferior = current_inferior; + saved_thread = current_thread; /* Find any thread which belongs to process PID. */ - current_inferior = (struct thread_info *) + current_thread = (struct thread_info *) find_inferior (&all_threads, same_process_p, &pid); strcpy (buf, "close"); run_inferior_command (buf, strlen (buf) + 1); - current_inferior = save_inferior; + current_thread = saved_thread; } } @@ -4001,7 +3987,7 @@ gdb_agent_about_to_close (int pid) static void cmd_qtminftpilen (char *packet) { - if (current_inferior == NULL) + if (current_thread == NULL) { /* Indicate that the minimum length is currently unknown. */ strcpy (packet, "0"); @@ -4121,7 +4107,7 @@ cmd_qtnotes (char *own_buf) while (*packet) { - if (strncmp ("user:", packet, strlen ("user:")) == 0) + if (startswith (packet, "user:")) { packet += strlen ("user:"); saved = packet; @@ -4135,7 +4121,7 @@ cmd_qtnotes (char *own_buf) xfree (tracing_user_name); tracing_user_name = user; } - else if (strncmp ("notes:", packet, strlen ("notes:")) == 0) + else if (startswith (packet, "notes:")) { packet += strlen ("notes:"); saved = packet; @@ -4149,7 +4135,7 @@ cmd_qtnotes (char *own_buf) xfree (tracing_notes); tracing_notes = notes; } - else if (strncmp ("tstop:", packet, strlen ("tstop:")) == 0) + else if (startswith (packet, "tstop:")) { packet += strlen ("tstop:"); saved = packet; @@ -4178,32 +4164,32 @@ handle_tracepoint_general_set (char *packet) cmd_qtinit (packet); return 1; } - else if (strncmp ("QTDP:", packet, strlen ("QTDP:")) == 0) + else if (startswith (packet, "QTDP:")) { cmd_qtdp (packet); return 1; } - else if (strncmp ("QTDPsrc:", packet, strlen ("QTDPsrc:")) == 0) + else if (startswith (packet, "QTDPsrc:")) { cmd_qtdpsrc (packet); return 1; } - else if (strncmp ("QTEnable:", packet, strlen ("QTEnable:")) == 0) + else if (startswith (packet, "QTEnable:")) { cmd_qtenable_disable (packet, 1); return 1; } - else if (strncmp ("QTDisable:", packet, strlen ("QTDisable:")) == 0) + else if (startswith (packet, "QTDisable:")) { cmd_qtenable_disable (packet, 0); return 1; } - else if (strncmp ("QTDV:", packet, strlen ("QTDV:")) == 0) + else if (startswith (packet, "QTDV:")) { cmd_qtdv (packet); return 1; } - else if (strncmp ("QTro:", packet, strlen ("QTro:")) == 0) + else if (startswith (packet, "QTro:")) { cmd_qtro (packet); return 1; @@ -4218,28 +4204,27 @@ handle_tracepoint_general_set (char *packet) cmd_qtstop (packet); return 1; } - else if (strncmp ("QTDisconnected:", packet, - strlen ("QTDisconnected:")) == 0) + else if (startswith (packet, "QTDisconnected:")) { cmd_qtdisconnected (packet); return 1; } - else if (strncmp ("QTFrame:", packet, strlen ("QTFrame:")) == 0) + else if (startswith (packet, "QTFrame:")) { cmd_qtframe (packet); return 1; } - else if (strncmp ("QTBuffer:circular:", packet, strlen ("QTBuffer:circular:")) == 0) + else if (startswith (packet, "QTBuffer:circular:")) { cmd_bigqtbuffer_circular (packet); return 1; } - else if (strncmp ("QTBuffer:size:", packet, strlen ("QTBuffer:size:")) == 0) + else if (startswith (packet, "QTBuffer:size:")) { cmd_bigqtbuffer_size (packet); return 1; } - else if (strncmp ("QTNotes:", packet, strlen ("QTNotes:")) == 0) + else if (startswith (packet, "QTNotes:")) { cmd_qtnotes (packet); return 1; @@ -4256,7 +4241,7 @@ handle_tracepoint_query (char *packet) cmd_qtstatus (packet); return 1; } - else if (strncmp ("qTP:", packet, strlen ("qTP:")) == 0) + else if (startswith (packet, "qTP:")) { cmd_qtp (packet); return 1; @@ -4281,12 +4266,12 @@ handle_tracepoint_query (char *packet) cmd_qtsv (packet); return 1; } - else if (strncmp ("qTV:", packet, strlen ("qTV:")) == 0) + else if (startswith (packet, "qTV:")) { cmd_qtv (packet); return 1; } - else if (strncmp ("qTBuffer:", packet, strlen ("qTBuffer:")) == 0) + else if (startswith (packet, "qTBuffer:")) { cmd_qtbuffer (packet); return 1; @@ -4301,7 +4286,7 @@ handle_tracepoint_query (char *packet) cmd_qtsstm (packet); return 1; } - else if (strncmp ("qTSTMat:", packet, strlen ("qTSTMat:")) == 0) + else if (startswith (packet, "qTSTMat:")) { cmd_qtstmat (packet); return 1; @@ -5794,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; @@ -6136,7 +6123,7 @@ tracepoint_send_agent (struct tracepoint *tpoint) if (ret) return ret; - if (strncmp (buf, "OK", 2) != 0) + if (!startswith (buf, "OK")) return 1; /* The value of tracepoint's target address is stored in BUF. */ @@ -6538,7 +6525,6 @@ upload_fast_traceframes (void) trace_debug ("Done uploading traceframes [%d]\n", curr_tbctrl_idx); pause_all (1); - cancel_breakpoints (); delete_breakpoint (about_to_request_buffer_space_bkpt); about_to_request_buffer_space_bkpt = NULL; @@ -6552,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 @@ -6844,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) @@ -7187,7 +7175,7 @@ gdb_agent_helper_thread (void *arg) do { - fd = accept (listen_fd, &sockaddr, &tmp); + fd = accept (listen_fd, (struct sockaddr *) &sockaddr, &tmp); } /* It seems an ERESTARTSYS can escape out of accept. */ while (fd == -512 || (fd == -1 && errno == EINTR)); @@ -7214,7 +7202,7 @@ gdb_agent_helper_thread (void *arg) if (cmd_buf[0]) { - if (strncmp ("close", cmd_buf, 5) == 0) + if (startswith (cmd_buf, "close")) { stop_loop = 1; } @@ -7227,21 +7215,15 @@ gdb_agent_helper_thread (void *arg) { cmd_qtsstm (cmd_buf); } - else if (strncmp ("unprobe_marker_at:", - cmd_buf, - sizeof ("unprobe_marker_at:") - 1) == 0) + else if (startswith (cmd_buf, "unprobe_marker_at:")) { unprobe_marker_at (cmd_buf); } - else if (strncmp ("probe_marker_at:", - cmd_buf, - sizeof ("probe_marker_at:") - 1) == 0) + else if (startswith (cmd_buf, "probe_marker_at:")) { probe_marker_at (cmd_buf); } - else if (strncmp ("qTSTMat:", - cmd_buf, - sizeof ("qTSTMat:") - 1) == 0) + else if (startswith (cmd_buf, "qTSTMat:")) { cmd_qtstmat (cmd_buf); } @@ -7259,9 +7241,9 @@ gdb_agent_helper_thread (void *arg) /* Sleep endlessly to wait the whole inferior stops. This thread can not exit because GDB or GDBserver may still need - 'current_inferior' (representing this thread) to access + 'current_thread' (representing this thread) to access inferior memory. Otherwise, this thread exits earlier than - other threads, and 'current_inferior' is set to NULL. */ + other threads, and 'current_thread' is set to NULL. */ while (1) sleep (10); } @@ -7274,7 +7256,9 @@ gdb_agent_helper_thread (void *arg) #include #include -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) @@ -7312,12 +7296,12 @@ gdb_agent_init (void) #include #include -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