merge from gcc
authorDJ Delorie <dj@redhat.com>
Mon, 27 Jul 2009 19:01:17 +0000 (19:01 +0000)
committerDJ Delorie <dj@redhat.com>
Mon, 27 Jul 2009 19:01:17 +0000 (19:01 +0000)
libiberty/ChangeLog
libiberty/pex-unix.c

index 6033935edc3065d41e031fab3a7036344e173b0e..25c6cd1b77bd9c9d7db4a59f568e823de1f4b5f4 100644 (file)
@@ -1,3 +1,10 @@
+2009-07-27  Douglas B Rupp  <rupp@gnat.com>
+
+       * pex-unix.c (vfork): Remove VMS specific definition (get from header
+       file instead).
+       (to_ptr32): New function.
+       (pex_unix_exec_child): Use it.
+
 2009-07-24  Ian Lance Taylor  <iant@google.com>
 
        PR bootstrap/40854
 2009-07-24  Ian Lance Taylor  <iant@google.com>
 
        PR bootstrap/40854
index 366e96ef8d23243234f0b47793642b45d2850c11..baf2bb4995be60b835eaf2fc057c794c86f2293b 100644 (file)
@@ -1,7 +1,7 @@
 /* Utilities to execute a program in a subprocess (possibly linked by pipes
    with other subprocesses), and wait for it.  Generic Unix version
    (also used for UWIN and VMS).
 /* Utilities to execute a program in a subprocess (possibly linked by pipes
    with other subprocesses), and wait for it.  Generic Unix version
    (also used for UWIN and VMS).
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2009
    Free Software Foundation, Inc.
 
 This file is part of the libiberty library.
    Free Software Foundation, Inc.
 
 This file is part of the libiberty library.
@@ -65,11 +65,40 @@ extern int errno;
 #ifdef HAVE_VFORK_H
 #include <vfork.h>
 #endif
 #ifdef HAVE_VFORK_H
 #include <vfork.h>
 #endif
-#ifdef VMS
-#define vfork() (decc$$alloc_vfork_blocks() >= 0 ? \
-               lib$get_current_invo_context(decc$$get_vfork_jmpbuf()) : -1)
-#endif /* VMS */
+#if defined(VMS) && defined (__LONG_POINTERS)
+#ifndef __CHAR_PTR32
+typedef char * __char_ptr32
+__attribute__ ((mode (SI)));
+#endif
+
+typedef __char_ptr32 *__char_ptr_char_ptr32
+__attribute__ ((mode (SI)));
+
+/* Return a 32 bit pointer to an array of 32 bit pointers 
+   given a 64 bit pointer to an array of 64 bit pointers.  */
+
+static __char_ptr_char_ptr32
+to_ptr32 (char **ptr64)
+{
+  int argc;
+  __char_ptr_char_ptr32 short_argv;
+
+  for (argc=0; ptr64[argc]; argc++);
 
 
+  /* Reallocate argv with 32 bit pointers.  */
+  short_argv = (__char_ptr_char_ptr32) decc$malloc
+    (sizeof (__char_ptr32) * (argc + 1));
+
+  for (argc=0; ptr64[argc]; argc++)
+    short_argv[argc] = (__char_ptr32) decc$strdup (ptr64[argc]);
+
+  short_argv[argc] = (__char_ptr32) 0;
+  return short_argv;
+
+}
+#else
+#define to_ptr32(argv) argv
+#endif
 
 /* File mode to use for private and world-readable files.  */
 
 
 /* File mode to use for private and world-readable files.  */
 
@@ -425,12 +454,12 @@ pex_unix_exec_child (struct pex_obj *obj, int flags, const char *executable,
 
       if ((flags & PEX_SEARCH) != 0)
        {
 
       if ((flags & PEX_SEARCH) != 0)
        {
-         execvp (executable, argv);
+         execvp (executable, to_ptr32 (argv));
          pex_child_error (obj, executable, "execvp", errno);
        }
       else
        {
          pex_child_error (obj, executable, "execvp", errno);
        }
       else
        {
-         execv (executable, argv);
+         execv (executable, to_ptr32 (argv));
          pex_child_error (obj, executable, "execv", errno);
        }
 
          pex_child_error (obj, executable, "execv", errno);
        }
 
This page took 0.029815 seconds and 4 git commands to generate.