X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Fserver.c;h=3fc026f78ebba4db17134befd3b7607e68ed04ff;hb=e8319fde715960466aca2461c74cec8907abd391;hp=e4de426476b19033d5338c7ab1b929921324281f;hpb=c12a5089640109567e2e06f0c5d2d1bf4fb3f5eb;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index e4de426476..3fc026f78e 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1,5 +1,5 @@ /* Main code for remote server for GDB. - Copyright (C) 1989-2018 Free Software Foundation, Inc. + Copyright (C) 1989-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -18,31 +18,35 @@ #include "server.h" #include "gdbthread.h" -#include "agent.h" +#include "gdbsupport/agent.h" #include "notif.h" #include "tdesc.h" -#include "rsp-low.h" -#include "signals-state-save-restore.h" +#include "gdbsupport/rsp-low.h" +#include "gdbsupport/signals-state-save-restore.h" #include #include #if HAVE_SIGNAL_H #include #endif -#include "gdb_vecs.h" -#include "gdb_wait.h" -#include "btrace-common.h" -#include "filestuff.h" +#include "gdbsupport/gdb_vecs.h" +#include "gdbsupport/gdb_wait.h" +#include "gdbsupport/btrace-common.h" +#include "gdbsupport/filestuff.h" #include "tracepoint.h" #include "dll.h" #include "hostio.h" #include -#include "common-inferior.h" -#include "job-control.h" -#include "environ.h" +#include "gdbsupport/common-inferior.h" +#include "gdbsupport/job-control.h" +#include "gdbsupport/environ.h" #include "filenames.h" -#include "pathstuff.h" +#include "gdbsupport/pathstuff.h" +#ifdef USE_XML +#include "xml-builtin.h" +#endif -#include "common/selftest.h" +#include "gdbsupport/selftest.h" +#include "gdbsupport/scope-exit.h" #define require_running_or_return(BUF) \ if (!target_running ()) \ @@ -66,25 +70,19 @@ char *current_directory; static gdb_environ our_environ; -/* Start the inferior using a shell. */ - -/* We always try to start the inferior using a shell. */ - -int startup_with_shell = 1; - -int server_waiting; +bool server_waiting; -static int extended_protocol; -static int response_needed; -static int exit_requested; +static bool extended_protocol; +static bool response_needed; +static bool exit_requested; /* --once: Exit after the first connection has closed. */ -int run_once; +bool run_once; -/* Whether to report TARGET_WAITKING_NO_RESUMED events. */ -static int report_no_resumed; +/* Whether to report TARGET_WAITKIND_NO_RESUMED events. */ +static bool report_no_resumed; -int non_stop; +bool non_stop; static struct { /* Set the PROGRAM_PATH. Here we adjust the path of the provided @@ -128,10 +126,10 @@ unsigned long signal_pid; /* Set if you want to disable optional thread related packets support in gdbserver, for the sake of testing GDB against stubs that don't support them. */ -int disable_packet_vCont; -int disable_packet_Tthread; -int disable_packet_qC; -int disable_packet_qfThreadInfo; +bool disable_packet_vCont; +bool disable_packet_Tthread; +bool disable_packet_qC; +bool disable_packet_qfThreadInfo; static unsigned char *mem_buf; @@ -139,10 +137,8 @@ static unsigned char *mem_buf; relative to a single stop reply. We keep a queue of these to push to GDB in non-stop mode. */ -struct vstop_notif +struct vstop_notif : public notif_event { - struct notif_event base; - /* Thread or process that got the event. */ ptid_t ptid; @@ -154,8 +150,6 @@ struct vstop_notif btrace configuration. */ static struct btrace_config current_btrace_conf; -DEFINE_QUEUE_P (notif_event_p); - /* The client remote protocol state. */ static client_state g_client_state; @@ -173,32 +167,20 @@ get_client_state () static void queue_stop_reply (ptid_t ptid, struct target_waitstatus *status) { - struct vstop_notif *new_notif = XNEW (struct vstop_notif); + struct vstop_notif *new_notif = new struct vstop_notif; new_notif->ptid = ptid; new_notif->status = *status; - notif_event_enque (¬if_stop, (struct notif_event *) new_notif); + notif_event_enque (¬if_stop, new_notif); } -static int -remove_all_on_match_ptid (QUEUE (notif_event_p) *q, - QUEUE_ITER (notif_event_p) *iter, - struct notif_event *event, - void *data) +static bool +remove_all_on_match_ptid (struct notif_event *event, ptid_t filter_ptid) { - ptid_t filter_ptid = *(ptid_t *) data; struct vstop_notif *vstop_event = (struct vstop_notif *) event; - if (ptid_match (vstop_event->ptid, filter_ptid)) - { - if (q->free_func != NULL) - q->free_func (event); - - QUEUE_remove_elem (notif_event_p, q, iter); - } - - return 1; + return vstop_event->ptid.matches (filter_ptid); } /* See server.h. */ @@ -206,8 +188,19 @@ remove_all_on_match_ptid (QUEUE (notif_event_p) *q, void discard_queued_stop_replies (ptid_t ptid) { - QUEUE_iterate (notif_event_p, notif_stop.queue, - remove_all_on_match_ptid, &ptid); + std::list::iterator iter, next, end; + end = notif_stop.queue.end (); + for (iter = notif_stop.queue.begin (); iter != end; iter = next) + { + next = iter; + ++next; + + if (remove_all_on_match_ptid (*iter, ptid)) + { + delete *iter; + notif_stop.queue.erase (iter); + } + } } static void @@ -218,27 +211,23 @@ vstop_notif_reply (struct notif_event *event, char *own_buf) prepare_resume_reply (own_buf, vstop->ptid, &vstop->status); } -/* QUEUE_iterate callback helper for in_queued_stop_replies. */ +/* Helper for in_queued_stop_replies. */ -static int -in_queued_stop_replies_ptid (QUEUE (notif_event_p) *q, - QUEUE_ITER (notif_event_p) *iter, - struct notif_event *event, - void *data) +static bool +in_queued_stop_replies_ptid (struct notif_event *event, ptid_t filter_ptid) { - ptid_t filter_ptid = *(ptid_t *) data; struct vstop_notif *vstop_event = (struct vstop_notif *) event; - if (ptid_match (vstop_event->ptid, filter_ptid)) - return 0; + if (vstop_event->ptid.matches (filter_ptid)) + return true; /* Don't resume fork children that GDB does not know about yet. */ if ((vstop_event->status.kind == TARGET_WAITKIND_FORKED || vstop_event->status.kind == TARGET_WAITKIND_VFORKED) - && ptid_match (vstop_event->status.value.related_pid, filter_ptid)) - return 0; + && vstop_event->status.value.related_pid.matches (filter_ptid)) + return true; - return 1; + return false; } /* See server.h. */ @@ -246,13 +235,18 @@ in_queued_stop_replies_ptid (QUEUE (notif_event_p) *q, int in_queued_stop_replies (ptid_t ptid) { - return !QUEUE_iterate (notif_event_p, notif_stop.queue, - in_queued_stop_replies_ptid, &ptid); + for (notif_event *event : notif_stop.queue) + { + if (in_queued_stop_replies_ptid (event, ptid)) + return true; + } + + return false; } struct notif_server notif_stop = { - "vStopped", "Stop", NULL, vstop_notif_reply, + "vStopped", "Stop", {}, vstop_notif_reply, }; static int @@ -261,7 +255,7 @@ target_running (void) return get_first_thread () != NULL; } -/* See common/common-inferior.h. */ +/* See gdbsupport/common-inferior.h. */ const char * get_exec_wrapper () @@ -269,9 +263,9 @@ get_exec_wrapper () return !wrapper_argv.empty () ? wrapper_argv.c_str () : NULL; } -/* See common/common-inferior.h. */ +/* See gdbsupport/common-inferior.h. */ -char * +const char * get_exec_file (int err) { if (err && program_path.get () == NULL) @@ -295,6 +289,9 @@ attach_inferior (int pid) /* myattach should return -1 if attaching is unsupported, 0 if it succeeded, and call error() otherwise. */ + if (find_process_pid (pid) != nullptr) + error ("Already attached to process %d\n", pid); + if (myattach (pid) != 0) return -1; @@ -308,7 +305,7 @@ attach_inferior (int pid) if (!non_stop) { - cs.last_ptid = mywait (pid_to_ptid (pid), &cs.last_status, 0, 0); + cs.last_ptid = mywait (ptid_t (pid), &cs.last_status, 0, 0); /* GDB knows to ignore the first SIGSTOP after attaching to a running process using the "attach" command, but this is different; it's @@ -324,8 +321,6 @@ attach_inferior (int pid) return 0; } -extern int remote_debug; - /* Decode a qXfer read request. Return 0 if everything looks OK, or -1 otherwise. */ @@ -441,8 +436,8 @@ handle_btrace_general_set (char *own_buf) op = own_buf + strlen ("Qbtrace:"); - if (ptid_equal (cs.general_thread, null_ptid) - || ptid_equal (cs.general_thread, minus_one_ptid)) + if (cs.general_thread == null_ptid + || cs.general_thread == minus_one_ptid) { strcpy (own_buf, "E.Must select a single thread."); return -1; @@ -455,7 +450,7 @@ handle_btrace_general_set (char *own_buf) return -1; } - TRY + try { if (strcmp (op, "bts") == 0) handle_btrace_enable_bts (thread); @@ -468,11 +463,10 @@ handle_btrace_general_set (char *own_buf) write_ok (own_buf); } - CATCH (exception, RETURN_MASK_ERROR) + catch (const gdb_exception_error &exception) { - sprintf (own_buf, "E.%s", exception.message); + sprintf (own_buf, "E.%s", exception.what ()); } - END_CATCH return 1; } @@ -491,8 +485,8 @@ handle_btrace_conf_general_set (char *own_buf) op = own_buf + strlen ("Qbtrace-conf:"); - if (ptid_equal (cs.general_thread, null_ptid) - || ptid_equal (cs.general_thread, minus_one_ptid)) + if (cs.general_thread == null_ptid + || cs.general_thread == minus_one_ptid) { strcpy (own_buf, "E.Must select a single thread."); return -1; @@ -753,7 +747,7 @@ handle_general_set (char *own_buf) return; } - non_stop = req; + non_stop = (req != 0); if (remote_debug) debug_printf ("[%s mode enabled]\n", req_str); @@ -929,7 +923,6 @@ get_features_xml (const char *annex) #ifdef USE_XML { - extern const char *const xml_builtin[][2]; int i; /* Look for the annex. */ @@ -1029,7 +1022,7 @@ gdb_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len) if (ret == 0) { if (set_desired_thread ()) - ret = write_inferior_memory (memaddr, myaddr, len); + ret = target_write_memory (memaddr, myaddr, len); else ret = EIO; done_accessing_memory (); @@ -1195,34 +1188,37 @@ static void handle_detach (char *own_buf) { client_state &cs = get_client_state (); - require_running_or_return (own_buf); - int pid; + process_info *process; if (cs.multi_process) { /* skip 'D;' */ - pid = strtol (&own_buf[2], NULL, 16); + int pid = strtol (&own_buf[2], NULL, 16); + + process = find_process_pid (pid); } else - pid = ptid_get_pid (current_ptid); - - if ((tracing && disconnected_tracing) || any_persistent_commands ()) { - struct process_info *process = find_process_pid (pid); + process = (current_thread != nullptr + ? get_thread_process (current_thread) + : nullptr); + } - if (process == NULL) - { - write_enn (own_buf); - return; - } + if (process == NULL) + { + write_enn (own_buf); + return; + } + if ((tracing && disconnected_tracing) || any_persistent_commands (process)) + { if (tracing && disconnected_tracing) fprintf (stderr, "Disconnected tracing in effect, " "leaving gdbserver attached to the process\n"); - if (any_persistent_commands ()) + if (any_persistent_commands (process)) fprintf (stderr, "Persistent commands are present, " "leaving gdbserver attached to the process\n"); @@ -1237,7 +1233,7 @@ handle_detach (char *own_buf) if (debug_threads) debug_printf ("Forcing non-stop mode\n"); - non_stop = 1; + non_stop = true; start_non_stop (1); } @@ -1250,13 +1246,17 @@ handle_detach (char *own_buf) return; } - fprintf (stderr, "Detaching from process %d\n", pid); + fprintf (stderr, "Detaching from process %d\n", process->pid); stop_tracing (); - if (detach_inferior (pid) != 0) + + /* We'll need this after PROCESS has been destroyed. */ + int pid = process->pid; + + if (detach_inferior (process) != 0) write_enn (own_buf); else { - discard_queued_stop_replies (pid_to_ptid (pid)); + discard_queued_stop_replies (ptid_t (pid)); write_ok (own_buf); if (extended_protocol || target_running ()) @@ -1266,7 +1266,7 @@ handle_detach (char *own_buf) and instead treat this like a normal program exit. */ cs.last_status.kind = TARGET_WAITKIND_EXITED; cs.last_status.value.integer = 0; - cs.last_ptid = pid_to_ptid (pid); + cs.last_ptid = ptid_t (pid); current_thread = NULL; } @@ -1395,10 +1395,14 @@ handle_monitor_command (char *mon, char *own_buf) write_enn (own_buf); } } + else if (strcmp (mon, "set debug-file") == 0) + debug_set_output (nullptr); + else if (startswith (mon, "set debug-file ")) + debug_set_output (mon + sizeof ("set debug-file ") - 1); else if (strcmp (mon, "help") == 0) monitor_show_help (); else if (strcmp (mon, "exit") == 0) - exit_requested = 1; + exit_requested = true; else { monitor_output ("Unknown monitor command.\n\n"); @@ -1544,8 +1548,8 @@ handle_qxfer_libraries (const char *annex, for (const dll_info &dll : all_dlls) document += string_printf - (" \n", - dll.name.c_str (), (long) dll.base_addr); + (" \n", + dll.name.c_str (), paddress (dll.base_addr)); document += "\n"; @@ -1605,22 +1609,6 @@ handle_qxfer_siginfo (const char *annex, return (*the_target->qxfer_siginfo) (annex, readbuf, writebuf, offset, len); } -/* Handle qXfer:spu:read and qXfer:spu:write. */ - -static int -handle_qxfer_spu (const char *annex, - gdb_byte *readbuf, const gdb_byte *writebuf, - ULONGEST offset, LONGEST len) -{ - if (the_target->qxfer_spu == NULL) - return -2; - - if (current_thread == NULL) - return -1; - - return (*the_target->qxfer_spu) (annex, readbuf, writebuf, offset, len); -} - /* Handle qXfer:statictrace:read. */ static int @@ -1829,8 +1817,8 @@ handle_qxfer_btrace (const char *annex, if (writebuf != NULL) return -2; - if (ptid_equal (cs.general_thread, null_ptid) - || ptid_equal (cs.general_thread, minus_one_ptid)) + if (cs.general_thread == null_ptid + || cs.general_thread == minus_one_ptid) { strcpy (cs.own_buf, "E.Must select a single thread."); return -3; @@ -1865,18 +1853,17 @@ handle_qxfer_btrace (const char *annex, { buffer_free (&cache); - TRY + try { result = target_read_btrace (thread->btrace, &cache, type); if (result != 0) memcpy (cs.own_buf, cache.buffer, cache.used_size); } - CATCH (exception, RETURN_MASK_ERROR) + catch (const gdb_exception_error &exception) { - sprintf (cs.own_buf, "E.%s", exception.message); + sprintf (cs.own_buf, "E.%s", exception.what ()); result = -1; } - END_CATCH if (result != 0) return -3; @@ -1913,8 +1900,8 @@ handle_qxfer_btrace_conf (const char *annex, if (annex[0] != '\0') return -1; - if (ptid_equal (cs.general_thread, null_ptid) - || ptid_equal (cs.general_thread, minus_one_ptid)) + if (cs.general_thread == null_ptid + || cs.general_thread == minus_one_ptid) { strcpy (cs.own_buf, "E.Must select a single thread."); return -3; @@ -1937,18 +1924,17 @@ handle_qxfer_btrace_conf (const char *annex, { buffer_free (&cache); - TRY + try { result = target_read_btrace_conf (thread->btrace, &cache); if (result != 0) memcpy (cs.own_buf, cache.buffer, cache.used_size); } - CATCH (exception, RETURN_MASK_ERROR) + catch (const gdb_exception_error &exception) { - sprintf (cs.own_buf, "E.%s", exception.message); + sprintf (cs.own_buf, "E.%s", exception.what ()); result = -1; } - END_CATCH if (result != 0) return -3; @@ -1979,7 +1965,6 @@ static const struct qxfer qxfer_packets[] = { "libraries-svr4", handle_qxfer_libraries_svr4 }, { "osdata", handle_qxfer_osdata }, { "siginfo", handle_qxfer_siginfo }, - { "spu", handle_qxfer_spu }, { "statictrace", handle_qxfer_statictrace }, { "threads", handle_qxfer_threads }, { "traceframe-info", handle_qxfer_traceframe_info }, @@ -2180,7 +2165,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) if (current_thread == NULL) { current_thread - = find_any_thread_of_pid (ptid_get_pid (cs.general_thread)); + = find_any_thread_of_pid (cs.general_thread.pid ()); /* Just in case, if we didn't find a thread, then bail out instead of crashing. */ @@ -2283,9 +2268,10 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) /* Two passes, to avoid nested strtok calls in target_process_qsupported. */ - for (p = strtok (p + 1, ";"); + char *saveptr; + for (p = strtok_r (p + 1, ";", &saveptr); p != NULL; - p = strtok (NULL, ";")) + p = strtok_r (NULL, ";", &saveptr)) { count++; qsupported = XRESIZEVEC (char *, qsupported, count); @@ -2348,7 +2334,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) { /* GDB supports and wants TARGET_WAITKIND_NO_RESUMED events. */ - report_no_resumed = 1; + report_no_resumed = true; } else { @@ -2391,9 +2377,6 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) if (the_target->read_auxv != NULL) strcat (own_buf, ";qXfer:auxv:read+"); - if (the_target->qxfer_spu != NULL) - strcat (own_buf, ";qXfer:spu:read+;qXfer:spu:write+"); - if (the_target->qxfer_siginfo != NULL) strcat (own_buf, ";qXfer:siginfo:read+;qXfer:siginfo:write+"); @@ -2696,11 +2679,11 @@ visit_actioned_threads (thread_info *thread, { const struct thread_resume *action = &actions[i]; - if (ptid_equal (action->thread, minus_one_ptid) - || ptid_equal (action->thread, thread->id) - || ((ptid_get_pid (action->thread) + if (action->thread == minus_one_ptid + || action->thread == thread->id + || ((action->thread.pid () == thread->id.pid ()) - && ptid_get_lwp (action->thread) == -1)) + && action->thread.lwp () == -1)) { if ((*callback) (action, thread)) return true; @@ -3077,11 +3060,14 @@ handle_v_kill (char *own_buf) pid = strtol (p, NULL, 16); else pid = signal_pid; - if (pid != 0 && kill_inferior (pid) == 0) + + process_info *proc = find_process_pid (pid); + + if (proc != nullptr && kill_inferior (proc) == 0) { cs.last_status.kind = TARGET_WAITKIND_SIGNALLED; cs.last_status.value.sig = GDB_SIGNAL_KILL; - cs.last_ptid = pid_to_ptid (pid); + cs.last_ptid = ptid_t (pid); discard_queued_stop_replies (cs.last_ptid); write_ok (own_buf); return 1; @@ -3199,8 +3185,8 @@ myresume (char *own_buf, int step, int sig) int n = 0; int valid_cont_thread; - valid_cont_thread = (!ptid_equal (cs.cont_thread, null_ptid) - && !ptid_equal (cs.cont_thread, minus_one_ptid)); + valid_cont_thread = (cs.cont_thread != null_ptid + && cs.cont_thread != minus_one_ptid); if (step || sig || valid_cont_thread) { @@ -3234,14 +3220,13 @@ queue_stop_reply_callback (thread_info *thread) manage the thread's last_status field. */ if (the_target->thread_stopped == NULL) { - struct vstop_notif *new_notif = XNEW (struct vstop_notif); + struct vstop_notif *new_notif = new struct vstop_notif; new_notif->ptid = thread->id; new_notif->status = thread->last_status; /* Pass the last stop reply back to GDB, but don't notify yet. */ - notif_event_enque (¬if_stop, - (struct notif_event *) new_notif); + notif_event_enque (¬if_stop, new_notif); } else { @@ -3361,9 +3346,9 @@ handle_status (char *own_buf) /* If the last event thread is not found for some reason, look for some other thread that might have an event to report. */ if (thread == NULL) - thread = find_thread ([] (thread_info *thread) + thread = find_thread ([] (thread_info *thr_arg) { - return thread->status_pending_p; + return thr_arg->status_pending_p; }); /* If we're still out of luck, simply pick the first thread in @@ -3396,7 +3381,7 @@ static void gdbserver_version (void) { printf ("GNU gdbserver %s%s\n" - "Copyright (C) 2018 Free Software Foundation, Inc.\n" + "Copyright (C) 2020 Free Software Foundation, Inc.\n" "gdbserver is free software, covered by the " "GNU General Public License.\n" "This gdbserver was configured as \"%s\"\n", @@ -3444,14 +3429,14 @@ gdbserver_usage (FILE *stream) "Debug options:\n" "\n" " --debug Enable general debugging output.\n" - " --debug-format=opt1[,opt2,...]\n" + " --debug-format=OPT1[,OPT2,...]\n" " Specify extra content in debugging output.\n" " Options:\n" " all\n" " none\n" " timestamp\n" " --remote-debug Enable remote protocol debugging output.\n" - " --disable-packet=opt1[,opt2,...]\n" + " --disable-packet=OPT1[,OPT2,...]\n" " Disable support for RSP packets or features.\n" " Options:\n" " vCont, Tthread, qC, qfThreadInfo and \n" @@ -3478,10 +3463,8 @@ gdbserver_show_disableable (FILE *stream) static void kill_inferior_callback (process_info *process) { - int pid = process->pid; - - kill_inferior (pid); - discard_queued_stop_replies (pid_to_ptid (pid)); + kill_inferior (process); + discard_queued_stop_replies (ptid_t (process->pid)); } /* Call this when exiting gdbserver with possible inferiors that need @@ -3523,35 +3506,34 @@ detach_or_kill_for_exit (void) int pid = process->pid; if (process->attached) - detach_inferior (pid); + detach_inferior (process); else - kill_inferior (pid); + kill_inferior (process); - discard_queued_stop_replies (pid_to_ptid (pid)); + discard_queued_stop_replies (ptid_t (pid)); }); } /* Value that will be passed to exit(3) when gdbserver exits. */ static int exit_code; -/* Cleanup version of detach_or_kill_for_exit. */ +/* Wrapper for detach_or_kill_for_exit that catches and prints + errors. */ static void -detach_or_kill_for_exit_cleanup (void *ignore) +detach_or_kill_for_exit_cleanup () { - - TRY + try { detach_or_kill_for_exit (); } - - CATCH (exception, RETURN_MASK_ALL) + catch (const gdb_exception &exception) { fflush (stdout); - fprintf (stderr, "Detach or kill failed: %s\n", exception.message); + fprintf (stderr, "Detach or kill failed: %s\n", + exception.what ()); exit_code = 1; } - END_CATCH } /* Main function. This is called by the real "main" function, @@ -3643,6 +3625,8 @@ captured_main (int argc, char *argv[]) } else if (strcmp (*next_arg, "--remote-debug") == 0) remote_debug = 1; + else if (startswith (*next_arg, "--debug-file=")) + debug_set_output ((*next_arg) + sizeof ("--debug-file=") -1); else if (strcmp (*next_arg, "--disable-packet") == 0) { gdbserver_show_disableable (stdout); @@ -3650,27 +3634,26 @@ captured_main (int argc, char *argv[]) } else if (startswith (*next_arg, "--disable-packet=")) { - char *packets, *tok; - - packets = *next_arg += sizeof ("--disable-packet=") - 1; - for (tok = strtok (packets, ","); + char *packets = *next_arg += sizeof ("--disable-packet=") - 1; + char *saveptr; + for (char *tok = strtok_r (packets, ",", &saveptr); tok != NULL; - tok = strtok (NULL, ",")) + tok = strtok_r (NULL, ",", &saveptr)) { if (strcmp ("vCont", tok) == 0) - disable_packet_vCont = 1; + disable_packet_vCont = true; else if (strcmp ("Tthread", tok) == 0) - disable_packet_Tthread = 1; + disable_packet_Tthread = true; else if (strcmp ("qC", tok) == 0) - disable_packet_qC = 1; + disable_packet_qC = true; else if (strcmp ("qfThreadInfo", tok) == 0) - disable_packet_qfThreadInfo = 1; + disable_packet_qfThreadInfo = true; else if (strcmp ("threads", tok) == 0) { - disable_packet_vCont = 1; - disable_packet_Tthread = 1; - disable_packet_qC = 1; - disable_packet_qfThreadInfo = 1; + disable_packet_vCont = true; + disable_packet_Tthread = true; + disable_packet_qC = true; + disable_packet_qfThreadInfo = true; } else { @@ -3698,7 +3681,7 @@ captured_main (int argc, char *argv[]) else if (strcmp (*next_arg, "--no-startup-with-shell") == 0) startup_with_shell = false; else if (strcmp (*next_arg, "--once") == 0) - run_once = 1; + run_once = true; else if (strcmp (*next_arg, "--selftest") == 0) selftest = true; else if (startswith (*next_arg, "--selftest=")) @@ -3777,7 +3760,6 @@ captured_main (int argc, char *argv[]) initialize_event_loop (); if (target_supports_tracepoints ()) initialize_tracepoint (); - initialize_notif (); mem_buf = (unsigned char *) xmalloc (PBUFSIZ); @@ -3786,7 +3768,7 @@ captured_main (int argc, char *argv[]) #if GDB_SELF_TEST selftests::run_tests (selftest_filter); #else - printf (_("Selftests are not available in a non-development build.\n")); + printf (_("Selftests have been disabled for this build.\n")); #endif throw_quit ("Quit"); } @@ -3796,7 +3778,7 @@ captured_main (int argc, char *argv[]) int i, n; n = argc - (next_arg - argv); - program_path.set (gdb::unique_xmalloc_ptr (xstrdup (next_arg[0]))); + program_path.set (make_unique_xstrdup (next_arg[0])); for (i = 1; i < n; i++) program_args.push_back (xstrdup (next_arg[i])); program_args.push_back (NULL); @@ -3821,7 +3803,8 @@ captured_main (int argc, char *argv[]) cs.last_status.value.integer = 0; cs.last_ptid = minus_one_ptid; } - make_cleanup (detach_or_kill_for_exit_cleanup, NULL); + + SCOPE_EXIT { detach_or_kill_for_exit_cleanup (); }; /* Don't report shared library events on the initial connection, even if some libraries are preloaded. Avoids the "stopped by @@ -3853,7 +3836,7 @@ captured_main (int argc, char *argv[]) remote_open (port); - TRY + try { /* Wait for events. This will return when all event sources are removed from the event loop. */ @@ -3918,10 +3901,10 @@ captured_main (int argc, char *argv[]) } } } - CATCH (exception, RETURN_MASK_ERROR) + catch (const gdb_exception_error &exception) { fflush (stdout); - fprintf (stderr, "gdbserver: %s\n", exception.message); + fprintf (stderr, "gdbserver: %s\n", exception.what ()); if (response_needed) { @@ -3932,7 +3915,6 @@ captured_main (int argc, char *argv[]) if (run_once) throw_quit ("Quit"); } - END_CATCH } } @@ -3942,23 +3924,22 @@ int main (int argc, char *argv[]) { - TRY + try { captured_main (argc, argv); } - CATCH (exception, RETURN_MASK_ALL) + catch (const gdb_exception &exception) { if (exception.reason == RETURN_ERROR) { fflush (stdout); - fprintf (stderr, "%s\n", exception.message); + fprintf (stderr, "%s\n", exception.what ()); fprintf (stderr, "Exiting\n"); exit_code = 1; } exit (exit_code); } - END_CATCH gdb_assert_not_reached ("captured_main should never return"); } @@ -4024,7 +4005,6 @@ process_serial_event (void) client_state &cs = get_client_state (); int signal; unsigned int len; - int res; CORE_ADDR mem_addr; unsigned char sig; int packet_len; @@ -4032,7 +4012,7 @@ process_serial_event (void) disable_async_io (); - response_needed = 0; + response_needed = false; packet_len = getpkt (cs.own_buf); if (packet_len <= 0) { @@ -4040,7 +4020,7 @@ process_serial_event (void) /* Force an event loop break. */ return -1; } - response_needed = 1; + response_needed = true; char ch = cs.own_buf[0]; switch (ch) @@ -4055,7 +4035,7 @@ process_serial_event (void) handle_detach (cs.own_buf); break; case '!': - extended_protocol = 1; + extended_protocol = true; write_ok (cs.own_buf); break; case '?': @@ -4095,7 +4075,7 @@ process_serial_event (void) if (cs.own_buf[1] == 'g') { - if (ptid_equal (thread_id, null_ptid)) + if (thread_id == null_ptid) { /* GDB is telling us to choose any thread. Check if the currently selected thread is still valid. If @@ -4168,13 +4148,15 @@ process_serial_event (void) } break; case 'm': - require_running_or_break (cs.own_buf); - decode_m_packet (&cs.own_buf[1], &mem_addr, &len); - res = gdb_read_memory (mem_addr, mem_buf, len); - if (res < 0) - write_enn (cs.own_buf); - else - bin2hex (mem_buf, cs.own_buf, res); + { + require_running_or_break (cs.own_buf); + decode_m_packet (&cs.own_buf[1], &mem_addr, &len); + int res = gdb_read_memory (mem_addr, mem_buf, len); + if (res < 0) + write_enn (cs.own_buf); + else + bin2hex (mem_buf, cs.own_buf, res); + } break; case 'M': require_running_or_break (cs.own_buf); @@ -4268,7 +4250,7 @@ process_serial_event (void) break; } case 'k': - response_needed = 0; + response_needed = false; if (!target_running ()) /* The packet we received doesn't make sense - but we can't reply to it, either. */ @@ -4307,7 +4289,7 @@ process_serial_event (void) } break; case 'R': - response_needed = 0; + response_needed = false; /* Restarting the inferior is only supported in the extended protocol. */ @@ -4368,7 +4350,7 @@ process_serial_event (void) else putpkt (cs.own_buf); - response_needed = 0; + response_needed = false; if (exit_requested) return -1; @@ -4400,12 +4382,12 @@ handle_serial_event (int err, gdb_client_data client_data) static void push_stop_notification (ptid_t ptid, struct target_waitstatus *status) { - struct vstop_notif *vstop_notif = XNEW (struct vstop_notif); + struct vstop_notif *vstop_notif = new struct vstop_notif; vstop_notif->status = *status; vstop_notif->ptid = ptid; /* Push Stop notification. */ - notif_push (¬if_stop, (struct notif_event *) vstop_notif); + notif_push (¬if_stop, vstop_notif); } /* Event-loop callback for target events. */ @@ -4427,7 +4409,7 @@ handle_target_event (int err, gdb_client_data client_data) } else if (cs.last_status.kind != TARGET_WAITKIND_IGNORE) { - int pid = ptid_get_pid (cs.last_ptid); + int pid = cs.last_ptid.pid (); struct process_info *process = find_process_pid (pid); int forward_event = !gdb_connected () || process->gdb_detached;