mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
84f79fea91
commit
77aff45955
|
@ -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)
|
Sat Jan 17 22:25:53 1998 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
* choose-temp.c: Sync with gcc version.
|
* choose-temp.c: Sync with gcc version.
|
||||||
|
|
|
@ -29,6 +29,13 @@ case "${host}" in
|
||||||
# autoconfiguration scheme does not work.
|
# autoconfiguration scheme does not work.
|
||||||
frag=mt-vxworks5
|
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
|
esac
|
||||||
|
|
||||||
# Try to handle funky case of solaris 2 -> sun 4.
|
# Try to handle funky case of solaris 2 -> sun 4.
|
||||||
|
|
|
@ -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
|
|
@ -223,14 +223,50 @@ pwait (pid, status, flags)
|
||||||
#if defined (_WIN32)
|
#if defined (_WIN32)
|
||||||
|
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
extern int _spawnv ();
|
|
||||||
extern int _spawnvp ();
|
|
||||||
|
|
||||||
#ifdef __CYGWIN32__
|
#ifdef __CYGWIN32__
|
||||||
|
|
||||||
#define fix_argv(argvec) (argvec)
|
#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
|
/* This is a kludge to get around the Microsoft C spawn functions' propensity
|
||||||
to remove the outermost set of double quotes from all arguments. */
|
to remove the outermost set of double quotes from all arguments. */
|
||||||
|
@ -269,8 +305,24 @@ fix_argv (argvec)
|
||||||
return (const char * const *) 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
|
int
|
||||||
pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
|
pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
|
||||||
const char *program;
|
const char *program;
|
||||||
|
@ -281,31 +333,114 @@ pexecute (program, argv, this_pname, temp_base, errmsg_fmt, errmsg_arg, flags)
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
int pid;
|
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)
|
pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv)
|
||||||
(_P_NOWAIT, program, fix_argv(argv));
|
(_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)
|
if (pid == -1)
|
||||||
{
|
{
|
||||||
*errmsg_fmt = install_error_msg;
|
*errmsg_fmt = install_error_msg;
|
||||||
*errmsg_arg = program;
|
*errmsg_arg = program;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pid;
|
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
|
int
|
||||||
pwait (pid, status, flags)
|
pwait (pid, status, flags)
|
||||||
int pid;
|
int pid;
|
||||||
int *status;
|
int *status;
|
||||||
int flags;
|
int flags;
|
||||||
{
|
{
|
||||||
|
int termstat;
|
||||||
|
|
||||||
|
pid = _cwait (&termstat, pid, WAIT_CHILD);
|
||||||
|
|
||||||
/* ??? Here's an opportunity to canonicalize the values in STATUS.
|
/* ??? Here's an opportunity to canonicalize the values in STATUS.
|
||||||
Needed? */
|
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 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
#ifdef OS2
|
#ifdef OS2
|
||||||
|
|
|
@ -42,16 +42,22 @@ PTR sbrk PARAMS ((ptrdiff_t));
|
||||||
/* The program name if set. */
|
/* The program name if set. */
|
||||||
static const char *name = "";
|
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;
|
static char *first_break = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
xmalloc_set_program_name (s)
|
xmalloc_set_program_name (s)
|
||||||
const char *s;
|
const char *s;
|
||||||
{
|
{
|
||||||
name = s;
|
name = s;
|
||||||
|
#if ! defined (_WIN32) || defined (__CYGWIN32__)
|
||||||
|
/* Win32 ports other than cygwin32 don't have brk() */
|
||||||
if (first_break == NULL)
|
if (first_break == NULL)
|
||||||
first_break = (char *) sbrk (0);
|
first_break = (char *) sbrk (0);
|
||||||
|
#endif /* ! _WIN32 || __CYGWIN32 __ */
|
||||||
}
|
}
|
||||||
|
|
||||||
PTR
|
PTR
|
||||||
|
@ -65,6 +71,7 @@ xmalloc (size)
|
||||||
newmem = malloc (size);
|
newmem = malloc (size);
|
||||||
if (!newmem)
|
if (!newmem)
|
||||||
{
|
{
|
||||||
|
#if ! defined (_WIN32) || defined (__CYGWIN32__)
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
size_t allocated;
|
size_t allocated;
|
||||||
|
|
||||||
|
@ -76,6 +83,12 @@ xmalloc (size)
|
||||||
"\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n",
|
"\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n",
|
||||||
name, *name ? ": " : "",
|
name, *name ? ": " : "",
|
||||||
(unsigned long) size, (unsigned long) allocated);
|
(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);
|
xexit (1);
|
||||||
}
|
}
|
||||||
return (newmem);
|
return (newmem);
|
||||||
|
@ -96,6 +109,7 @@ xrealloc (oldmem, size)
|
||||||
newmem = realloc (oldmem, size);
|
newmem = realloc (oldmem, size);
|
||||||
if (!newmem)
|
if (!newmem)
|
||||||
{
|
{
|
||||||
|
#ifndef __MINGW32__
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
size_t allocated;
|
size_t allocated;
|
||||||
|
|
||||||
|
@ -107,6 +121,12 @@ xrealloc (oldmem, size)
|
||||||
"\n%s%sCan not reallocate %lu bytes after allocating %lu bytes\n",
|
"\n%s%sCan not reallocate %lu bytes after allocating %lu bytes\n",
|
||||||
name, *name ? ": " : "",
|
name, *name ? ": " : "",
|
||||||
(unsigned long) size, (unsigned long) allocated);
|
(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);
|
xexit (1);
|
||||||
}
|
}
|
||||||
return (newmem);
|
return (newmem);
|
||||||
|
|
Loading…
Reference in New Issue