Remove sanitized-out Magic Cap support, will never be released
[deliverable/binutils-gdb.git] / gdb / win32-nat.c
index 641f0949f818f0ba321c64e63014981b0d5d6f60..664d554212a474bd1fa96a8830979684dd89e42e 100644 (file)
@@ -16,7 +16,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
 
 /* by Steve Chamberlain, sac@cygnus.com */
 
 #include <signal.h>
 #include <sys/types.h>
 #include <fcntl.h>
+#include <stdlib.h>
+
+#ifdef _MSC_VER
+#include "windefs.h"
+#else /* other WIN32 compiler */
 #include <windows.h>
+#endif
+
 #include "buildsym.h"
 #include "symfile.h"
 #include "objfiles.h"
@@ -51,6 +59,8 @@
 /* Forward declaration */
 extern struct target_ops child_ops;
 
+static void child_stop PARAMS ((void));
+
 /* The most recently read context. Inspect ContextFlags to see what 
    bits are valid. */
 
@@ -94,7 +104,6 @@ struct regmappings
     int mask;
   };
 
-
 static const struct regmappings  mappings[] =
 {
 #ifdef __PPC__
@@ -170,7 +179,6 @@ static const struct regmappings  mappings[] =
   {(char *) &context.Fpr30, CONTEXT_FLOATING_POINT},
   {(char *) &context.Fpr31, CONTEXT_FLOATING_POINT},
 
-
   {(char *) &context.Iar, CONTEXT_CONTROL},
   {(char *) &context.Msr, CONTEXT_CONTROL},
   {(char *) &context.Cr,  CONTEXT_INTEGER},
@@ -207,7 +215,6 @@ static const struct regmappings  mappings[] =
 #endif
 };
 
-
 /* This vector maps the target's idea of an exception (extracted
    from the DEBUG_EVENT structure) to GDB's idea. */
 
@@ -217,7 +224,6 @@ struct xlate_exception
     enum target_signal us;
   };
 
-
 static const struct xlate_exception
   xlate[] =
 {
@@ -228,7 +234,6 @@ static const struct xlate_exception
   {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
   {-1, -1}};
 
-
 static void 
 check (BOOL ok, const char *file, int line)
 {
@@ -268,7 +273,6 @@ child_store_inferior_registers (int r)
 /* Wait for child to do something.  Return pid of child, or -1 in case
    of error; store status through argument pointer OURSTATUS.  */
 
-
 static int
 handle_load_dll (char *eventp)
 {
@@ -327,8 +331,8 @@ handle_load_dll (char *eventp)
                             &done);
        }
 
-
-      dos_path_to_unix_path (dll_name, unix_dll_name);
+      /* FIXME: Can we delete this call?  */
+      cygwin32_conv_to_posix_path (dll_name, unix_dll_name);
 
       /* FIXME!! It would be nice to define one symbol which pointed to the 
          front of the dll if we can't find any symbols. */
@@ -350,7 +354,6 @@ handle_load_dll (char *eventp)
              return 1;
            }
        }
 
       context.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
       GetThreadContext (current_thread, &context);
@@ -372,7 +375,7 @@ handle_load_dll (char *eventp)
 }
 
 
-static void
+static int
 handle_exception (DEBUG_EVENT * event, struct target_waitstatus *ourstatus)
 {
   int i;
@@ -408,6 +411,12 @@ handle_exception (DEBUG_EVENT * event, struct target_waitstatus *ourstatus)
       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
       break;
     default:
+      /* This may be a structured exception handling exception.  In
+         that case, we want to let the program try to handle it, and
+         only break if we see the exception a second time.  */
+      if (event->u.Exception.dwFirstChance)
+       return 0;
+
       printf_unfiltered ("gdb: unknown target exception 0x%08x at 0x%08x\n",
                         event->u.Exception.ExceptionRecord.ExceptionCode,
                         event->u.Exception.ExceptionRecord.ExceptionAddress);
@@ -417,6 +426,7 @@ handle_exception (DEBUG_EVENT * event, struct target_waitstatus *ourstatus)
   context.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
   GetThreadContext (current_thread, &context);
   exception_count++;
+  return 1;
 }
 
 static int
@@ -433,12 +443,15 @@ child_wait (int pid, struct target_waitstatus *ourstatus)
       DEBUG_EVENT event;
       BOOL t = WaitForDebugEvent (&event, INFINITE);
       char *p;
+      DWORD continue_status;
 
       event_count++;
 
       current_thread_id = event.dwThreadId;
       current_process_id = event.dwProcessId;
 
+      continue_status = DBG_CONTINUE;
+
       switch (event.dwDebugEventCode)
        {
        case CREATE_THREAD_DEBUG_EVENT:
@@ -487,8 +500,10 @@ child_wait (int pid, struct target_waitstatus *ourstatus)
          DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
                        event.dwProcessId, event.dwThreadId,
                        "EXCEPTION_DEBUG_EVENT"));
-         handle_exception (&event, ourstatus);
-         return current_process_id;
+         if (handle_exception (&event, ourstatus))
+           return current_process_id;
+         continue_status = DBG_EXCEPTION_NOT_HANDLED;
+         break;
 
        case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
          DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
@@ -513,11 +528,10 @@ child_wait (int pid, struct target_waitstatus *ourstatus)
                     current_process_id, current_thread_id));
       CHECK (ContinueDebugEvent (current_process_id,
                                 current_thread_id,
-                                DBG_CONTINUE));
+                                continue_status));
     }
 }
 
-
 /* Attach to process PID, then initialize for debugging it.  */
 
 static void
@@ -537,7 +551,6 @@ child_attach (args, from_tty)
   if (!ok)
     error ("Can't attach to process.");
 
-
   exception_count = 0;
   event_count = 0;
 
@@ -559,7 +572,6 @@ child_attach (args, from_tty)
   push_target (&child_ops);
 }
 
-
 static void
 child_detach (args, from_tty)
      char *args;
@@ -578,7 +590,6 @@ child_detach (args, from_tty)
   unpush_target (&child_ops);
 }
 
-
 /* Print status information about what we're accessing.  */
 
 static void
@@ -630,7 +641,7 @@ child_create_inferior (exec_file, allargs, env)
   memset (&si, 0, sizeof (si));
   si.cb = sizeof (si);
 
-  unix_path_to_dos_path (exec_file, real_path);
+  cygwin32_conv_to_win32_path (exec_file, real_path);
 
   flags = DEBUG_ONLY_THIS_PROCESS; 
 
@@ -651,24 +662,17 @@ child_create_inferior (exec_file, allargs, env)
   {
     /* This code use to assume all env vars were file names and would
        translate them all to win32 style.  That obviously doesn't work in the
-       general case.  The current rule is that the user either works solely
-       with win32 style path names or with posix style path names and that
-       all env vars are already set up appropriately.  At any rate it is
-       wrong for us to willy-nilly change them.
-
-       However, we need to handle PATH because we're about to call
-       CreateProcess and it uses PATH to find DLL's.  Fortunately PATH
-       has a well-defined value in both posix and win32 environments.
-       cygwin.dll will change it back to posix style if necessary.  If we're
-       working with win32 style path names, we don't need to do anything at
-       all.  */
+       general case.  The current rule is that we only translate PATH.
+       We need to handle PATH because we're about to call CreateProcess and
+       it uses PATH to find DLL's.  Fortunately PATH has a well-defined value
+       in both posix and win32 environments.  cygwin.dll will change it back
+       to posix style if necessary.  */
 
     static const char *conv_path_names[] =
       {
        "PATH=",
        0
       };
-    int posix_rules_p = sysconf (_SC_PATH_RULES) == _PATH_RULES_POSIX;
 
     /* CreateProcess takes the environment list as a null terminated set of
        strings (i.e. two nulls terminate the list).  */
@@ -676,24 +680,22 @@ child_create_inferior (exec_file, allargs, env)
     /* Get total size for env strings.  */
     for (envlen = 0, i = 0; env[i] && *env[i]; i++)
       {
-       if (posix_rules_p)
-         {
-           int j, len;
+       int j, len;
 
-           for (j = 0; conv_path_names[j]; j++)
+       for (j = 0; conv_path_names[j]; j++)
+         {
+           len = strlen (conv_path_names[j]);
+           if (strncmp (conv_path_names[j], env[i], len) == 0)
              {
-               len = strlen (conv_path_names[j]);
-               if (strncmp (conv_path_names[j], env[i], len) == 0)
-                 {
-                   envlen += len
-                     + cygwin32_posix_to_win32_path_list_buf_size (env[i] + len);
-                   break;
-                 }
+               if (cygwin32_posix_path_list_p (env[i] + len))
+                 envlen += len
+                   + cygwin32_posix_to_win32_path_list_buf_size (env[i] + len);
+               else
+                 envlen += strlen (env[i]) + 1;
+               break;
              }
-           if (conv_path_names[j] == NULL)
-             envlen += strlen (env[i]) + 1;
          }
-       else
+       if (conv_path_names[j] == NULL)
          envlen += strlen (env[i]) + 1;
       }
 
@@ -702,25 +704,26 @@ child_create_inferior (exec_file, allargs, env)
     /* Copy env strings into new buffer.  */
     for (temp = winenv, i = 0; env[i] && *env[i]; i++) 
       {
-       if (posix_rules_p)
-         {
-           int j, len;
+       int j, len;
 
-           for (j = 0; conv_path_names[j]; j++)
+       for (j = 0; conv_path_names[j]; j++)
+         {
+           len = strlen (conv_path_names[j]);
+           if (strncmp (conv_path_names[j], env[i], len) == 0)
              {
-               len = strlen (conv_path_names[j]);
-               if (strncmp (conv_path_names[j], env[i], len) == 0)
+               if (cygwin32_posix_path_list_p (env[i] + len))
                  {
                    memcpy (temp, env[i], len);
                    cygwin32_posix_to_win32_path_list (env[i] + len, temp + len);
-                   break;
                  }
+               else
+                 strcpy (temp, env[i]);
+               break;
              }
-           if (conv_path_names[j] == NULL)
-             strcpy (temp, env[i]);
          }
-       else
+       if (conv_path_names[j] == NULL)
          strcpy (temp, env[i]);
+
        temp += strlen (temp) + 1;
       }
 
@@ -769,11 +772,10 @@ child_mourn_inferior ()
   generic_mourn_inferior ();
 }
 
-
 /* Send a SIGINT to the process group.  This acts just like the user typed a
    ^C on the controlling terminal. */
 
-void
+static void
 child_stop ()
 {
   DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
This page took 0.027002 seconds and 4 git commands to generate.