aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMumit Khan <khan@xraylith.wisc.edu>1998-01-17 21:30:39 +0000
committerJeff Law <law@gcc.gnu.org>1998-01-17 14:30:39 -0700
commit77aff459558ec67ceafc407420e014433828f7a5 (patch)
tree3fb1bcc713bf0b50a9443986aa474ff823b51ca8
parent84f79fea91fa299022c62cd3e7a9b42910d974b2 (diff)
downloadgcc-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/ChangeLog14
-rw-r--r--libiberty/config.table7
-rw-r--r--libiberty/config/mt-mingw3227
-rw-r--r--libiberty/pexecute.c149
-rw-r--r--libiberty/xmalloc.c22
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);