]> gcc.gnu.org Git - gcc.git/commitdiff
Add mingw32 support.
authorMumit Khan <khan@xraylith.wisc.edu>
Sat, 17 Jan 1998 21:30:39 +0000 (21:30 +0000)
committerJeff Law <law@gcc.gnu.org>
Sat, 17 Jan 1998 21:30:39 +0000 (14:30 -0700)
        * pexecute.c (pexecute): New function for mingw32. Supports pipes.
        (pwait): New function for mingw32.
        * config.table (i[3456]86-*-mingw32*): Support for i386-mingw32.
        * config/mt-mingw32: New file.
        * xmalloc.c (first_break): Not used for mingw32.
        (xmalloc_set_program_name): Don't use sbrk on mingw32.
        (xmalloc): Likewise.
        (xrealloc): Likewise.

Co-Authored-By: J.J. VanderHeijden <J.J.vanderHeijden@student.utwente.nl>
From-SVN: r17395

libiberty/ChangeLog
libiberty/config.table
libiberty/config/mt-mingw32 [new file with mode: 0644]
libiberty/pexecute.c
libiberty/xmalloc.c

index 2b11027af545b54bbd00f10426f1b395b39698eb..567f53461ac6203e2edc592cde921d01a907f44b 100644 (file)
@@ -1,3 +1,17 @@
+Sat Jan 17 22:32:38 1998  Mumit Khan  <khan@xraylith.wisc.edu>
+                          J.J. VanderHeijden <J.J.vanderHeijden@student.utwente.nl>
+
+        Add mingw32 support.
+        * pexecute.c (pexecute): New function for mingw32. Supports pipes.
+        (pwait): New function for mingw32.
+
+        * config.table (i[3456]86-*-mingw32*): Support for i386-mingw32.
+        * config/mt-mingw32: New file.
+        * xmalloc.c (first_break): Not used for mingw32.
+        (xmalloc_set_program_name): Don't use sbrk on mingw32.
+        (xmalloc): Likewise.
+        (xrealloc): Likewise.
+
 Sat Jan 17 22:25:53 1998  Jeffrey A Law  (law@cygnus.com)
 
        * choose-temp.c: Sync with gcc version.
index 484761c5190855a34871a481f0c5b0efd2308763..555dfac68a9ccb70f956db3d6bbc118512cb7d4d 100644 (file)
@@ -29,6 +29,13 @@ case "${host}" in
     # autoconfiguration scheme does not work.
     frag=mt-vxworks5
     ;;
+
+  i[3456]86-*-mingw32*)
+    # Mingw32 does not require strerror.o from REQUIRED_OFILES.
+    # Worse: it will not compile it because of an incompatible sys_errlist
+    # definition.
+    frag=mt-mingw32
+    ;;
 esac
 
 # Try to handle funky case of solaris 2 -> sun 4.
diff --git a/libiberty/config/mt-mingw32 b/libiberty/config/mt-mingw32
new file mode 100644 (file)
index 0000000..2fb17d7
--- /dev/null
@@ -0,0 +1,27 @@
+# Mingw32 target Makefile fragment.
+# The autoconfiguration fails for a Mingw32 target, because of an
+# incompatible definition of sys_errlist, which is imported from a DLL.
+# Therefore, we compute the dependencies by hand.
+
+HDEFINES = -DNO_SYS_PARAM_H -DNO_SYS_FILE_H
+CONFIG_H = mgconfig.h
+NEEDED_LIST = mgneeded-list
+
+mgconfig.h: Makefile
+       if [ -f ../newlib/Makefile ]; then \
+         $(MAKE) $(FLAGS_TO_PASS) xconfig.h; \
+         cp xconfig.h mgconfig.h; \
+       else \
+         echo "#define NEED_sys_siglist 1" >>mgconfig.h; \
+         echo "#define NEED_strsignal 1" >>mgconfig.h; \
+         echo "#define NEED_psignal 1" >>mgconfig.h; \
+         echo "#define NEED_basename 1" >>mgconfig.h; \
+       fi
+
+mgneeded-list: Makefile
+       if [ -f ../newlib/Makefile ]; then \
+         $(MAKE) $(FLAGS_TO_PASS) xneeded-list; \
+         cp xneeded-list mgneeded-list; \
+       else \
+         echo getopt.o vasprintf.o >mgneeded-list; \
+       fi
index b8594eb0954ea192e90f7fcc2b216aea41b65fc8..fbbea409147cb386d0cbabcbbd6370c5e4a5e101 100644 (file)
@@ -223,14 +223,50 @@ pwait (pid, status, flags)
 #if defined (_WIN32)
 
 #include <process.h>
-extern int _spawnv ();
-extern int _spawnvp ();
 
 #ifdef __CYGWIN32__
 
 #define fix_argv(argvec) (argvec)
 
-#else
+extern int _spawnv ();
+extern int _spawnvp ();
+
+int
+pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
+     const char *program;
+     char * const *argv;
+     const char *this_pname;
+     const char *temp_base;
+     char **errmsg_fmt, **errmsg_arg;
+     int flags;
+{
+  int pid;
+
+  if ((flags & PEXECUTE_ONE) != PEXECUTE_ONE)
+    abort ();
+  pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv)
+    (_P_NOWAIT, program, fix_argv(argv));
+  if (pid == -1)
+    {
+      *errmsg_fmt = install_error_msg;
+      *errmsg_arg = program;
+      return -1;
+    }
+  return pid;
+}
+
+int
+pwait (pid, status, flags)
+     int pid;
+     int *status;
+     int flags;
+{
+  /* ??? Here's an opportunity to canonicalize the values in STATUS.
+     Needed?  */
+  return cwait (status, pid, WAIT_CHILD);
+}
+
+#else /* ! __CYGWIN32__ */
 
 /* This is a kludge to get around the Microsoft C spawn functions' propensity
    to remove the outermost set of double quotes from all arguments.  */
@@ -269,8 +305,24 @@ fix_argv (argvec)
   return (const char * const *) argvec;
 }
 
-#endif /* ! defined (__CYGWIN32__) */
+#include <io.h>
+#include <fcntl.h>
+#include <signal.h>
+
+/* mingw32 headers may not define the following.  */
+
+#ifndef _P_WAIT
+#  define _P_WAIT      0
+#  define _P_NOWAIT    1
+#  define _P_OVERLAY   2
+#  define _P_NOWAITO   3
+#  define _P_DETACH    4
+
+#  define WAIT_CHILD   0
+#  define WAIT_GRANDCHILD      1
+#endif
 
+/* Win32 supports pipes */
 int
 pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
      const char *program;
@@ -281,31 +333,114 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
      int flags;
 {
   int pid;
+  int pdes[2], org_stdin, org_stdout;
+  int input_desc, output_desc;
+  int retries, sleep_interval;
+
+  /* Pipe waiting from last process, to be used as input for the next one.
+     Value is STDIN_FILE_NO if no pipe is waiting
+     (i.e. the next command is the first of a group).  */
+  static int last_pipe_input;
+
+  /* If this is the first process, initialize.  */
+  if (flags & PEXECUTE_FIRST)
+    last_pipe_input = STDIN_FILE_NO;
+
+  input_desc = last_pipe_input;
+
+  /* If this isn't the last process, make a pipe for its output,
+     and record it as waiting to be the input to the next process.  */
+  if (! (flags & PEXECUTE_LAST))
+    {
+      if (_pipe (pdes, 256, O_BINARY) < 0)
+       {
+         *errmsg_fmt = "pipe";
+         *errmsg_arg = NULL;
+         return -1;
+       }
+      output_desc = pdes[WRITE_PORT];
+      last_pipe_input = pdes[READ_PORT];
+    }
+  else
+    {
+      /* Last process.  */
+      output_desc = STDOUT_FILE_NO;
+      last_pipe_input = STDIN_FILE_NO;
+    }
+
+  if (input_desc != STDIN_FILE_NO)
+    {
+      org_stdin = dup (STDIN_FILE_NO);
+      dup2 (input_desc, STDIN_FILE_NO);
+      close (input_desc); 
+    }
+
+  if (output_desc != STDOUT_FILE_NO)
+    {
+      org_stdout = dup (STDOUT_FILE_NO);
+      dup2 (output_desc, STDOUT_FILE_NO);
+      close (output_desc);
+    }
 
-  if ((flags & PEXECUTE_ONE) != PEXECUTE_ONE)
-    abort ();
   pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv)
     (_P_NOWAIT, program, fix_argv(argv));
+
+  if (input_desc != STDIN_FILE_NO)
+    {
+      dup2 (org_stdin, STDIN_FILE_NO);
+      close (org_stdin);
+    }
+
+  if (output_desc != STDOUT_FILE_NO)
+    {
+      dup2 (org_stdout, STDOUT_FILE_NO);
+      close (org_stdout);
+    }
+
   if (pid == -1)
     {
       *errmsg_fmt = install_error_msg;
       *errmsg_arg = program;
       return -1;
     }
+
   return pid;
 }
 
+/* MS CRTDLL doesn't return enough information in status to decide if the
+   child exited due to a signal or not, rather it simply returns an
+   integer with the exit code of the child; eg., if the child exited with 
+   an abort() call and didn't have a handler for SIGABRT, it simply returns
+   with status = 3. We fix the status code to conform to the usual WIF*
+   macros. Note that WIFSIGNALED will never be true under CRTDLL. */
+
 int
 pwait (pid, status, flags)
      int pid;
      int *status;
      int flags;
 {
+  int termstat;
+
+  pid = _cwait (&termstat, pid, WAIT_CHILD);
+
   /* ??? Here's an opportunity to canonicalize the values in STATUS.
      Needed?  */
-  return _cwait (status, pid, WAIT_CHILD);
+
+  /* cwait returns the child process exit code in termstat.
+     A value of 3 indicates that the child caught a signal, but not
+     which one.  Since only SIGABRT, SIGFPE and SIGINT do anything, we
+     report SIGABRT.  */
+  if (termstat == 3)
+    *status = SIGABRT;
+  else
+    *status = (((termstat) & 0xff) << 8);
+
+  return pid;
 }
 
+#endif /* ! defined (__CYGWIN32__) */
+
 #endif /* _WIN32 */
 
 #ifdef OS2
index c479b1f9e957a0682a7eb083418186fd205a0176..b88105a9b74a069958a5e6b3c4187ac8bf244963 100644 (file)
@@ -42,16 +42,22 @@ PTR sbrk PARAMS ((ptrdiff_t));
 /* The program name if set.  */
 static const char *name = "";
 
-/* The initial sbrk, set when the program name is set.  */
+#if ! defined (_WIN32) || defined (__CYGWIN32__)
+/* The initial sbrk, set when the program name is set. Not used for win32
+   ports other than cygwin32.  */
 static char *first_break = NULL;
+#endif
 
 void
 xmalloc_set_program_name (s)
      const char *s;
 {
   name = s;
+#if ! defined (_WIN32) || defined (__CYGWIN32__)
+  /* Win32 ports other than cygwin32 don't have brk() */
   if (first_break == NULL)
     first_break = (char *) sbrk (0);
+#endif /* ! _WIN32 || __CYGWIN32 __ */
 }
 
 PTR
@@ -65,6 +71,7 @@ xmalloc (size)
   newmem = malloc (size);
   if (!newmem)
     {
+#if ! defined (_WIN32) || defined (__CYGWIN32__)
       extern char **environ;
       size_t allocated;
 
@@ -76,6 +83,12 @@ xmalloc (size)
               "\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n",
               name, *name ? ": " : "",
               (unsigned long) size, (unsigned long) allocated);
+#else
+      fprintf (stderr,
+              "\n%s%sCan not allocate %lu bytes\n",
+              name, *name ? ": " : "",
+              (unsigned long) size);
+#endif /* ! _WIN32 || __CYGWIN32 __ */
       xexit (1);
     }
   return (newmem);
@@ -96,6 +109,7 @@ xrealloc (oldmem, size)
     newmem = realloc (oldmem, size);
   if (!newmem)
     {
+#ifndef __MINGW32__
       extern char **environ;
       size_t allocated;
 
@@ -107,6 +121,12 @@ xrealloc (oldmem, size)
               "\n%s%sCan not reallocate %lu bytes after allocating %lu bytes\n",
               name, *name ? ": " : "",
               (unsigned long) size, (unsigned long) allocated);
+#else
+      fprintf (stderr,
+              "\n%s%sCan not reallocate %lu bytes\n",
+              name, *name ? ": " : "",
+              (unsigned long) size);
+#endif /* __MINGW32__ */
       xexit (1);
     }
   return (newmem);
This page took 0.079549 seconds and 5 git commands to generate.