X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fwindows-nat.c;h=fd3108308692ba3a8c626dd9ae17eccf62274034;hb=f74839702efcea048ac61374b1539ae81e7c86cc;hp=fe43c2469c709407f5dcd2f7ba98a9d4079876fe;hpb=6a3cb8e88a739c967bb9b2d8774bf96b87a7fda4;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index fe43c2469c..fd31083086 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -1,6 +1,6 @@ /* Target-vector operations for controlling windows child processes, for GDB. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 Free Software Foundation, Inc. Contributed by Cygnus Solutions, A Red Hat Company. @@ -24,8 +24,8 @@ #include "defs.h" #include "frame.h" /* required by inferior.h */ #include "inferior.h" +#include "infrun.h" #include "target.h" -#include "exceptions.h" #include "gdbcore.h" #include "command.h" #include "completer.h" @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -50,7 +49,6 @@ #include "objfiles.h" #include "gdb_bfd.h" #include "gdb_obstack.h" -#include #include "gdbthread.h" #include "gdbcmd.h" #include @@ -64,7 +62,7 @@ #include "windows-tdep.h" #include "windows-nat.h" -#include "i386-nat.h" +#include "x86-nat.h" #include "complaints.h" #include "inf-child.h" @@ -132,7 +130,6 @@ static CONTEXT saved_context; /* Containes the saved context from a enum { FLAG_TRACE_BIT = 0x100, - CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT) }; #endif @@ -142,8 +139,9 @@ enum #define CONTEXT_EXTENDED_REGISTERS 0 #endif -#define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \ - | CONTEXT_EXTENDED_REGISTERS +#define CONTEXT_DEBUGGER_DR CONTEXT_FULL | CONTEXT_FLOATING_POINT \ + | CONTEXT_SEGMENTS | CONTEXT_DEBUG_REGISTERS \ + | CONTEXT_EXTENDED_REGISTERS static uintptr_t dr[8]; static int debug_registers_changed; @@ -179,9 +177,9 @@ static enum gdb_signal last_sig = GDB_SIGNAL_0; /* Thread information structure used to track information that is not available in gdb's thread structure. */ -typedef struct thread_info_struct +typedef struct windows_thread_info_struct { - struct thread_info_struct *next; + struct windows_thread_info_struct *next; DWORD id; HANDLE h; CORE_ADDR thread_local_base; @@ -191,16 +189,16 @@ typedef struct thread_info_struct CONTEXT context; STACKFRAME sf; } -thread_info; +windows_thread_info; -static thread_info thread_head; +static windows_thread_info thread_head; /* The process and thread handles for the above context. */ static DEBUG_EVENT current_event; /* The current debug event from WaitForDebugEvent */ static HANDLE current_process_handle; /* Currently executing process */ -static thread_info *current_thread; /* Info on currently selected thread */ +static windows_thread_info *current_thread; /* Info on currently selected thread */ static DWORD main_thread_id; /* Thread ID of the main thread */ /* Counts of things. */ @@ -293,10 +291,10 @@ check (BOOL ok, const char *file, int line) /* Find a thread record given a thread id. If GET_CONTEXT is not 0, then also retrieve the context for this thread. If GET_CONTEXT is negative, then don't suspend the thread. */ -static thread_info * +static windows_thread_info * thread_rec (DWORD id, int get_context) { - thread_info *th; + windows_thread_info *th; for (th = &thread_head; (th = th->next) != NULL;) if (th->id == id) @@ -333,10 +331,10 @@ thread_rec (DWORD id, int get_context) } /* Add a thread to the thread list. */ -static thread_info * +static windows_thread_info * windows_add_thread (ptid_t ptid, HANDLE h, void *tlb) { - thread_info *th; + windows_thread_info *th; DWORD id; gdb_assert (ptid_get_tid (ptid) != 0); @@ -346,7 +344,7 @@ windows_add_thread (ptid_t ptid, HANDLE h, void *tlb) if ((th = thread_rec (id, FALSE))) return th; - th = XCNEW (thread_info); + th = XCNEW (windows_thread_info); th->id = id; th->h = h; th->thread_local_base = (CORE_ADDR) (uintptr_t) tlb; @@ -376,13 +374,13 @@ windows_add_thread (ptid_t ptid, HANDLE h, void *tlb) static void windows_init_thread_list (void) { - thread_info *th = &thread_head; + windows_thread_info *th = &thread_head; DEBUG_EVENTS (("gdb: windows_init_thread_list\n")); init_thread_list (); while (th->next != NULL) { - thread_info *here = th->next; + windows_thread_info *here = th->next; th->next = here->next; xfree (here); } @@ -393,7 +391,7 @@ windows_init_thread_list (void) static void windows_delete_thread (ptid_t ptid, DWORD exit_code) { - thread_info *th; + windows_thread_info *th; DWORD id; gdb_assert (ptid_get_tid (ptid) != 0); @@ -414,7 +412,7 @@ windows_delete_thread (ptid_t ptid, DWORD exit_code) if (th->next != NULL) { - thread_info *here = th->next; + windows_thread_info *here = th->next; th->next = here->next; xfree (here); } @@ -448,7 +446,7 @@ do_windows_fetch_inferior_registers (struct regcache *regcache, int r) else #endif { - thread_info *th = current_thread; + windows_thread_info *th = current_thread; th->context.ContextFlags = CONTEXT_DEBUGGER_DR; CHECK (GetThreadContext (th->h, &th->context)); /* Copy dr values from that thread. @@ -553,61 +551,6 @@ struct lm_info static struct so_list solib_start, *solib_end; -/* Call symbol_file_add with stderr redirected. We don't care if there - are errors. */ -static int -safe_symbol_file_add_stub (void *argv) -{ -#define p ((struct safe_symbol_file_add_args *) argv) - const int add_flags = ((p->from_tty ? SYMFILE_VERBOSE : 0) - | (p->mainline ? SYMFILE_MAINLINE : 0)); - p->ret = symbol_file_add (p->name, add_flags, p->addrs, p->flags); - return !!p->ret; -#undef p -} - -/* Restore gdb's stderr after calling symbol_file_add. */ -static void -safe_symbol_file_add_cleanup (void *p) -{ -#define sp ((struct safe_symbol_file_add_args *)p) - gdb_flush (gdb_stderr); - gdb_flush (gdb_stdout); - ui_file_delete (gdb_stderr); - ui_file_delete (gdb_stdout); - gdb_stderr = sp->err; - gdb_stdout = sp->out; -#undef sp -} - -/* symbol_file_add wrapper that prevents errors from being displayed. */ -static struct objfile * -safe_symbol_file_add (char *name, int from_tty, - struct section_addr_info *addrs, - int mainline, int flags) -{ - struct safe_symbol_file_add_args p; - struct cleanup *cleanup; - - cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p); - - p.err = gdb_stderr; - p.out = gdb_stdout; - gdb_flush (gdb_stderr); - gdb_flush (gdb_stdout); - gdb_stderr = ui_file_new (); - gdb_stdout = ui_file_new (); - p.name = name; - p.from_tty = from_tty; - p.addrs = addrs; - p.mainline = mainline; - p.flags = flags; - catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR); - - do_cleanups (cleanup); - return p.ret; -} - static struct so_list * windows_make_so (const char *name, LPVOID load_addr) { @@ -856,28 +799,6 @@ windows_clear_solib (void) solib_end = &solib_start; } -/* Load DLL symbol info. */ -static void -dll_symbol_command (char *args, int from_tty) -{ - int n; - dont_repeat (); - - if (args == NULL) - error (_("dll-symbols requires a file name")); - - n = strlen (args); - if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0) - { - char *newargs = (char *) alloca (n + 4 + 1); - strcpy (newargs, args); - strcat (newargs, ".dll"); - args = newargs; - } - - safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED); -} - /* Handle DEBUG_STRING output from child process. Cygwin prepends its messages with a "cygwin:". Interpret this as a Cygwin signal. Otherwise just print the string as a warning. */ @@ -892,11 +813,10 @@ handle_output_debug_string (struct target_waitstatus *ourstatus) &s, 1024, 0) || !s || !*s) /* nothing to do */; - else if (strncmp (s, _CYGWIN_SIGNAL_STRING, - sizeof (_CYGWIN_SIGNAL_STRING) - 1) != 0) + else if (!startswith (s, _CYGWIN_SIGNAL_STRING)) { #ifdef __CYGWIN__ - if (strncmp (s, "cYg", 3) != 0) + if (!startswith (s, "cYg")) #endif warning (("%s"), s); } @@ -1063,7 +983,7 @@ display_selectors (char * args, int from_tty) static int handle_exception (struct target_waitstatus *ourstatus) { - thread_info *th; + windows_thread_info *th; DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode; ourstatus->kind = TARGET_WAITKIND_STOPPED; @@ -1093,8 +1013,7 @@ handle_exception (struct target_waitstatus *ourstatus) if ((!cygwin_exceptions && (addr >= cygwin_load_start && addr < cygwin_load_end)) || (find_pc_partial_function (addr, &fn, NULL, NULL) - && strncmp (fn, "KERNEL32!IsBad", - strlen ("KERNEL32!IsBad")) == 0)) + && startswith (fn, "KERNEL32!IsBad"))) return 0; } #endif @@ -1195,7 +1114,7 @@ static BOOL windows_continue (DWORD continue_status, int id, int killed) { int i; - thread_info *th; + windows_thread_info *th; BOOL res; DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n", @@ -1273,7 +1192,7 @@ static void windows_resume (struct target_ops *ops, ptid_t ptid, int step, enum gdb_signal sig) { - thread_info *th; + windows_thread_info *th; DWORD continue_status = DBG_CONTINUE; /* A specific PTID means `step only this thread id'. */ @@ -1396,8 +1315,8 @@ get_windows_debug_event (struct target_ops *ops, { BOOL debug_event; DWORD continue_status, event_code; - thread_info *th; - static thread_info dummy_thread_info; + windows_thread_info *th; + static windows_thread_info dummy_thread_info; int retval = 0; last_sig = GDB_SIGNAL_0; @@ -1730,7 +1649,7 @@ do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching) push_target (ops); disable_breakpoints_in_shlibs (); windows_clear_solib (); - clear_proceed_status (); + clear_proceed_status (0); init_wait_for_inferior (); inf = current_inferior (); @@ -1743,7 +1662,7 @@ do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching) current thread until we report an event out of windows_wait. */ inferior_ptid = pid_to_ptid (pid); - child_terminal_init_with_pgrp (pid); + target_terminal_init (); target_terminal_inferior (); windows_initialization_done = 0; @@ -1754,7 +1673,7 @@ do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching) wait_for_inferior (); tp = inferior_thread (); if (tp->suspend.stop_signal != GDB_SIGNAL_TRAP) - resume (0, tp->suspend.stop_signal); + resume (tp->suspend.stop_signal); else break; } @@ -1833,7 +1752,7 @@ out: /* Attach to process PID, then initialize for debugging it. */ static void -windows_attach (struct target_ops *ops, char *args, int from_tty) +windows_attach (struct target_ops *ops, const char *args, int from_tty) { BOOL ok; DWORD pid; @@ -1911,7 +1830,7 @@ windows_detach (struct target_ops *ops, const char *args, int from_tty) gdb_flush (gdb_stdout); } - i386_cleanup_dregs (); + x86_cleanup_dregs (); inferior_ptid = null_ptid; detach_inferior (current_event.dwProcessId); @@ -2362,14 +2281,13 @@ static void windows_mourn_inferior (struct target_ops *ops) { (void) windows_continue (DBG_CONTINUE, -1, 0); - i386_cleanup_dregs(); + x86_cleanup_dregs(); if (open_process_used) { CHECK (CloseHandle (current_process_handle)); open_process_used = 0; } - generic_mourn_inferior (); - inf_child_maybe_unpush_target (ops); + inf_child_mourn_inferior (ops); } /* Send a SIGINT to the process group. This acts just like the user typed a @@ -2519,11 +2437,9 @@ windows_xfer_partial (struct target_ops *ops, enum target_object object, writebuf, offset, len, xfered_len); default: - if (ops->beneath != NULL) - return ops->beneath->to_xfer_partial (ops->beneath, object, annex, - readbuf, writebuf, offset, len, - xfered_len); - return TARGET_XFER_E_IO; + return ops->beneath->to_xfer_partial (ops->beneath, object, annex, + readbuf, writebuf, offset, len, + xfered_len); } } @@ -2534,7 +2450,7 @@ static int windows_get_tib_address (struct target_ops *self, ptid_t ptid, CORE_ADDR *addr) { - thread_info *th; + windows_thread_info *th; th = thread_rec (ptid_get_tid (ptid), 0); if (th == NULL) @@ -2592,21 +2508,20 @@ extern initialize_file_ftype _initialize_windows_nat; void _initialize_windows_nat (void) { - struct cmd_list_element *c; struct target_ops *t; t = windows_target (); - i386_use_watchpoints (t); + x86_use_watchpoints (t); - i386_dr_low.set_control = cygwin_set_dr7; - i386_dr_low.set_addr = cygwin_set_dr; - i386_dr_low.get_addr = cygwin_get_dr; - i386_dr_low.get_status = cygwin_get_dr6; - i386_dr_low.get_control = cygwin_get_dr7; + x86_dr_low.set_control = cygwin_set_dr7; + x86_dr_low.set_addr = cygwin_set_dr; + x86_dr_low.get_addr = cygwin_get_dr; + x86_dr_low.get_status = cygwin_get_dr6; + x86_dr_low.get_control = cygwin_get_dr7; - /* i386_dr_low.debug_register_length field is set by - calling i386_set_debug_register_length function + /* x86_dr_low.debug_register_length field is set by + calling x86_set_debug_register_length function in processor windows specific native file. */ add_target (t); @@ -2615,21 +2530,6 @@ _initialize_windows_nat (void) cygwin_internal (CW_SET_DOS_FILE_WARNING, 0); #endif - c = add_com ("dll-symbols", class_files, dll_symbol_command, - _("Load dll library symbols from FILE.")); - set_cmd_completer (c, filename_completer); - deprecate_cmd (c, "sharedlibrary"); - - c = add_com ("add-shared-symbol-files", class_files, dll_symbol_command, - _("Load dll library symbols from FILE.")); - set_cmd_completer (c, filename_completer); - deprecate_cmd (c, "sharedlibrary"); - - c = add_com ("assf", class_files, dll_symbol_command, - _("Load dll library symbols from FILE.")); - set_cmd_completer (c, filename_completer); - deprecate_cmd (c, "sharedlibrary"); - #ifdef __CYGWIN__ add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\ Set use of shell to start subprocess."), _("\