diff options
author | Mumit Khan <khan@xraylith.wisc.edu> | 1998-01-17 21:30:39 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-01-17 14:30:39 -0700 |
commit | 77aff459558ec67ceafc407420e014433828f7a5 (patch) | |
tree | 3fb1bcc713bf0b50a9443986aa474ff823b51ca8 | |
parent | 84f79fea91fa299022c62cd3e7a9b42910d974b2 (diff) | |
download | gcc-77aff459558ec67ceafc407420e014433828f7a5.zip gcc-77aff459558ec67ceafc407420e014433828f7a5.tar.gz gcc-77aff459558ec67ceafc407420e014433828f7a5.tar.bz2 |
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.
Co-Authored-By: J.J. VanderHeijden <J.J.vanderHeijden@student.utwente.nl>
From-SVN: r17395
-rw-r--r-- | libiberty/ChangeLog | 14 | ||||
-rw-r--r-- | libiberty/config.table | 7 | ||||
-rw-r--r-- | libiberty/config/mt-mingw32 | 27 | ||||
-rw-r--r-- | libiberty/pexecute.c | 149 | ||||
-rw-r--r-- | libiberty/xmalloc.c | 22 |
5 files changed, 211 insertions, 8 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 2b11027..567f534 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -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. diff --git a/libiberty/config.table b/libiberty/config.table index 484761c..555dfac 100644 --- a/libiberty/config.table +++ b/libiberty/config.table @@ -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 index 0000000..2fb17d7 --- /dev/null +++ b/libiberty/config/mt-mingw32 @@ -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 diff --git a/libiberty/pexecute.c b/libiberty/pexecute.c index b8594eb..fbbea40 100644 --- a/libiberty/pexecute.c +++ b/libiberty/pexecute.c @@ -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 diff --git a/libiberty/xmalloc.c b/libiberty/xmalloc.c index c479b1f..b88105a 100644 --- a/libiberty/xmalloc.c +++ b/libiberty/xmalloc.c @@ -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); |