Patchwork [v2] convert config/vms/*crt0* files to gcc style (PR 44242)

login
register
mail settings
Submitter Tristan Gingold
Date Sept. 10, 2010, 1:01 p.m.
Message ID <B28BE775-D66E-4D51-92E8-96B1AA577A03@adacore.com>
Download mbox | patch
Permalink /patch/64388/
State New
Headers show

Comments

Tristan Gingold - Sept. 10, 2010, 1:01 p.m.
Hi,

improved version of the patch, after a suggestions by Jay.

Was:

This patch allows to cross-build gcc for VMS without using the DEC-C compiler.  It consolidates all crt0 files into 
vms-ucrt0.c file, now written using GCC dialect.

Tested by build ia64-hp-openvms and alpha64-dec-openvms.

Ok for mainline ?

Tristan.

2010-09-09  Tristan Gingold  <gingold@adacore.com>

	PR target/44242
	* config/vms/vms-crt0-64.c: Removed.
	* config/vms/vms-crt0.c: Removed.
	* config/vms/vms-psxcrt0-64.c: Removed.
	* config/vms/vms-psxcrt0.c: Removed.
	* config/vms/vms-ucrt0.c: New file.
	* config/vms/t-vms64: Removed.
	* config/vms/t-vms (VMS_EXTRA_PARTS): Uncomment it.  Remove DECC.
	Use $(GCC_FOR_TARGET) to build pcrt0.o and vcrt0.o
	* config.gcc (alpha-dec-vms): Use t-vms.
Tristan Gingold - Sept. 22, 2010, 11:02 a.m.
Ping for this VMS patch.

Richard, you have traditionally approved the VMS patches so I have CC'ed you.  However, if the SC think the VMS files deserve
a maintainer, I (and/or Doug Rupp) will be happy to become maintainers for the VMS specific parts.

Tristan.

On Sep 10, 2010, at 3:01 PM, Tristan Gingold wrote:

> Hi,
> 
> improved version of the patch, after a suggestions by Jay.
> 
> Was:
> 
> This patch allows to cross-build gcc for VMS without using the DEC-C compiler.  It consolidates all crt0 files into 
> vms-ucrt0.c file, now written using GCC dialect.
> 
> Tested by build ia64-hp-openvms and alpha64-dec-openvms.
> 
> Ok for mainline ?
> 
> Tristan.
> 
> 2010-09-09  Tristan Gingold  <gingold@adacore.com>
> 
> 	PR target/44242
> 	* config/vms/vms-crt0-64.c: Removed.
> 	* config/vms/vms-crt0.c: Removed.
> 	* config/vms/vms-psxcrt0-64.c: Removed.
> 	* config/vms/vms-psxcrt0.c: Removed.
> 	* config/vms/vms-ucrt0.c: New file.
> 	* config/vms/t-vms64: Removed.
> 	* config/vms/t-vms (VMS_EXTRA_PARTS): Uncomment it.  Remove DECC.
> 	Use $(GCC_FOR_TARGET) to build pcrt0.o and vcrt0.o
> 	* config.gcc (alpha-dec-vms): Use t-vms.
> 
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index d33d1c6..5ba28a6 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -721,7 +721,7 @@ alpha*-dec-osf5.1*)
> alpha64-dec-*vms*)
> 	tm_file="${tm_file} alpha/vms.h alpha/vms64.h"
> 	xm_file="alpha/xm-vms.h vms/xm-vms64.h"
> -	tmake_file="alpha/t-alpha vms/t-vms vms/t-vms64 alpha/t-vms alpha/t-ieee"
> +	tmake_file="alpha/t-alpha vms/t-vms alpha/t-vms alpha/t-ieee"
> 	xmake_file=vms/x-vms
> 	exeext=.exe
> 	install_headers_dir=install-headers-cp
> @@ -1549,7 +1549,7 @@ ia64*-*-hpux*)
> ia64-hp-*vms*)
> 	tm_file="${tm_file} elfos.h ia64/sysv4.h ia64/elf.h ia64/vms.h ia64/vms64.h"
> 	xm_file="vms/xm-vms.h vms/xm-vms64.h"
> -	tmake_file="vms/t-vms vms/t-vms64 ia64/t-ia64 ia64/t-vms"
> +	tmake_file="vms/t-vms ia64/t-ia64 ia64/t-vms"
> 	xmake_file=vms/x-vms
> 	target_cpu_default="0"
> 	if test x$gas = xyes
> diff --git a/gcc/config/vms/t-vms b/gcc/config/vms/t-vms
> index 132a53b..75756a2 100644
> --- a/gcc/config/vms/t-vms
> +++ b/gcc/config/vms/t-vms
> @@ -24,15 +24,14 @@ LIMITS_H_TEST = false
> # Under VMS, directory names cannot contain dots.
> version:=$(shell echo $(BASEVER_c) | sed -e 's/\./_/g')
> 
> -# Temporary restriction: VMS_EXTRA_PARTS must be compiled by DEC C.
> -#VMS_EXTRA_PARTS=vcrt0.o pcrt0.o
> -VMS_EXTRA_PARTS=
> -
> -DECC=`echo $(CC) | sed -e 's/xgcc -B.*/decc$(exeext)/' -e 's/^gcc/decc/' -e 's/^decc/.\/decc/' -e 's/\(.*\)-gcc/\1-decc/'`
> +VMS_EXTRA_PARTS=vcrt0.o pcrt0.o
> 
> # Assemble startup files.
> -$(T)vcrt0.o: $(CRT0_S) $(GCC_PASSES)
> -	$(DECC) -c /names=as_is $(srcdir)/config/vms/vms-crt0.c -o $(T)vcrt0.o
> +$(T)vcrt0.o: $(srcdir)/config/vms/vms-ucrt0.c $(GCC_PASSES)
> +	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
> +	-c -o $(T)vcrt0.o $(srcdir)/config/vms/vms-ucrt0.c
> +
> +$(T)pcrt0.o: $(srcdir)/config/vms/vms-ucrt0.c $(GCC_PASSES)
> +	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
> +	-c -o $(T)pcrt0.o -DCRT0_POSIX_EXIT $(srcdir)/config/vms/vms-ucrt0.c
> 
> -$(T)pcrt0.o: $(CRT0_S) $(GCC_PASSES)
> -	$(DECC) -c /names=as_is $(srcdir)/config/vms/vms-psxcrt0.c -o $(T)pcrt0.o
> diff --git a/gcc/config/vms/t-vms64 b/gcc/config/vms/t-vms64
> deleted file mode 100644
> index 2fe0069..0000000
> --- a/gcc/config/vms/t-vms64
> +++ /dev/null
> @@ -1,27 +0,0 @@
> -# Copyright (C) 2009
> -# Free Software Foundation, Inc.
> -#
> -# This file is part of GCC.
> -#
> -# GCC is free software; you can redistribute it and/or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 3, or (at your option)
> -# any later version.
> -#
> -# GCC is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -# GNU General Public License for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with GCC; see the file COPYING3.  If not see
> -# <http://www.gnu.org/licenses/>.
> -
> -# Assemble startup files.
> -$(T)vcrt0.o: $(CRT0_S) $(GCC_PASSES)
> -	$(DECC) -c /names=as_is /pointer_size=64  \
> -	     $(srcdir)/config/vms/vms-crt0-64.c -o $(T)vcrt0.o
> -
> -$(T)pcrt0.o: $(CRT0_S) $(GCC_PASSES)
> -	$(DECC) -c /names=as_is /pointer_size=64 \
> -	     $(srcdir)/config/vms/vms-psxcrt0-64.c -o $(T)pcrt0.o
> diff --git a/gcc/config/vms/vms-crt0-64.c b/gcc/config/vms/vms-crt0-64.c
> deleted file mode 100644
> index ec59d81..0000000
> --- a/gcc/config/vms/vms-crt0-64.c
> +++ /dev/null
> @@ -1,95 +0,0 @@
> -/* VMS 64bit crt0 returning VMS style condition codes .
> -   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
> -   Contributed by Douglas B. Rupp (rupp@gnat.com).
> -
> -   This file is part of GCC.
> -
> -   GCC is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 3, or (at your option)
> -   any later version.
> -
> -   GCC is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   Under Section 7 of GPL version 3, you are granted additional
> -   permissions described in the GCC Runtime Library Exception, version
> -   3.1, as published by the Free Software Foundation.
> -
> -   You should have received a copy of the GNU General Public License and
> -   a copy of the GCC Runtime Library Exception along with this program;
> -   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined(__DECC)
> -You Lose! This file can only be compiled with DEC C.
> -#else
> -
> -/* This file can only be compiled with DEC C, due to the call to
> -   lib$establish and the pragmas pointer_size.  */
> -
> -#pragma __pointer_size short
> -
> -#include <stdlib.h>
> -#include <string.h>
> -#include <ssdef.h>
> -
> -extern void decc$main ();
> -
> -extern int main ();
> -
> -static int
> -handler (sigargs, mechargs)
> -     void *sigargs;
> -     void *mechargs;
> -{
> -  return SS$_RESIGNAL;
> -}
> -
> -int
> -__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
> -     void *arg1, *arg2, *arg3;
> -     void *image_file_desc;
> -     void *arg5, *arg6;
> -{
> -  int argc;
> -  char **argv;
> -  char **envp;
> -
> -#pragma __pointer_size long
> -
> -  int i;
> -  char **long_argv;
> -  char **long_envp;
> -
> -#pragma __pointer_size short
> -
> -  lib$establish (handler);
> -  decc$main (arg1, arg2, arg3, image_file_desc,
> -	     arg5, arg6, &argc, &argv, &envp);
> -
> -#pragma __pointer_size long
> -
> -  /* Reallocate argv with 64 bit pointers.  */
> -  long_argv = (char **) _malloc32 (sizeof (char *) * (argc + 1));
> -
> -  for (i = 0; i < argc; i++)
> -    long_argv[i] = (char *) _strdup32 (argv[i]);
> -
> -  long_argv[argc] = (char *) 0;
> -
> -  for (i = 0; envp[i]; i++);
> -  long_envp = (char **) _malloc32 (sizeof (char *) * (i + 1));
> -
> -  for (i = 0; envp[i]; i++)
> -    long_envp[i] = (char *) _strdup32 (envp[i]);
> -
> -  long_envp[i] = (char *) 0;
> -
> -#pragma __pointer_size short
> -
> -  return main (argc, long_argv, long_envp);
> -}
> -#endif
> diff --git a/gcc/config/vms/vms-crt0.c b/gcc/config/vms/vms-crt0.c
> deleted file mode 100644
> index c0fdaaf..0000000
> --- a/gcc/config/vms/vms-crt0.c
> +++ /dev/null
> @@ -1,66 +0,0 @@
> -/* VMS crt0 returning VMS style condition codes .
> -   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
> -   Contributed by Douglas B. Rupp (rupp@gnat.com).
> -
> -   This file is part of GCC.
> -
> -   GCC is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 3, or (at your option)
> -   any later version.
> -
> -   GCC is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   Under Section 7 of GPL version 3, you are granted additional
> -   permissions described in the GCC Runtime Library Exception, version
> -   3.1, as published by the Free Software Foundation.
> -
> -   You should have received a copy of the GNU General Public License and
> -   a copy of the GCC Runtime Library Exception along with this program;
> -   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined(__DECC)
> -You Lose! This file can only be compiled with DEC C.
> -#else
> -
> -/* This file can only be compiled with DEC C, due to the call to
> -   lib$establish.  */
> -
> -#include <stdlib.h>
> -#include <string.h>
> -#include <ssdef.h>
> -
> -extern void decc$main ();
> -
> -extern int main ();
> -
> -static int
> -handler (sigargs, mechargs)
> -     void *sigargs;
> -     void *mechargs;
> -{
> -  return SS$_RESIGNAL;
> -}
> -
> -int
> -__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
> -     void *arg1, *arg2, *arg3;
> -     void *image_file_desc;
> -     void *arg5, *arg6;
> -{
> -  int argc;
> -  char **argv;
> -  char **envp;
> -
> -  lib$establish (handler);
> -
> -  decc$main(arg1, arg2, arg3, image_file_desc, arg5, arg6,
> -	    &argc, &argv, &envp);
> -
> -  return main (argc, argv, envp);
> -}
> -#endif
> diff --git a/gcc/config/vms/vms-psxcrt0-64.c b/gcc/config/vms/vms-psxcrt0-64.c
> deleted file mode 100644
> index 45afbc9..0000000
> --- a/gcc/config/vms/vms-psxcrt0-64.c
> +++ /dev/null
> @@ -1,124 +0,0 @@
> -/* VMS 64bit crt0 returning Unix style condition codes .
> -   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
> -   Contributed by Douglas B. Rupp (rupp@gnat.com).
> -
> -   This file is part of GCC.
> -
> -   GCC is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 3, or (at your option)
> -   any later version.
> -
> -   GCC is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   Under Section 7 of GPL version 3, you are granted additional
> -   permissions described in the GCC Runtime Library Exception, version
> -   3.1, as published by the Free Software Foundation.
> -
> -   You should have received a copy of the GNU General Public License and
> -   a copy of the GCC Runtime Library Exception along with this program;
> -   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined(__DECC)
> -You Lose! This file can only be compiled with DEC C.
> -#else
> -
> -/* This file can only be compiled with DEC C, due to the call to
> -   lib$establish and the pragmas pointer_size.  */
> -
> -#pragma __pointer_size short
> -
> -#include <stdlib.h>
> -#include <string.h>
> -#include <ssdef.h>
> -#include <stsdef.h>
> -#include <errnodef.h>
> -
> -extern void decc$main ();
> -extern int main ();
> -
> -static int
> -handler (sigargs, mechargs)
> -     void *sigargs;
> -     void *mechargs;
> -{
> -  return SS$_RESIGNAL;
> -}
> -
> -int
> -__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
> -     void *arg1, *arg2, *arg3;
> -     void *image_file_desc;
> -     void *arg5, *arg6;
> -{
> -  int argc;
> -  char **argv;
> -  char **envp;
> -
> -#pragma __pointer_size long
> -
> -  int i;
> -  char **long_argv;
> -  char **long_envp;
> -  int status;
> -
> -#pragma __pointer_size short
> -
> -  lib$establish (handler);
> -  decc$main (arg1, arg2, arg3, image_file_desc,
> -	     arg5, arg6, &argc, &argv, &envp);
> -
> -#pragma __pointer_size long
> -
> -  /* Reallocate argv with 64 bit pointers.  */
> -  long_argv = (char **) _malloc32 (sizeof (char *) * (argc + 1));
> -
> -  for (i = 0; i < argc; i++)
> -    long_argv[i] = (char *) _strdup32 (argv[i]);
> -
> -  long_argv[argc] = (char *) 0;
> -
> -  for (i = 0; envp[i]; i++);
> -  long_envp = (char **) _malloc32 (sizeof (char *) * (i + 1));
> -
> -  for (i = 0; envp[i]; i++)
> -    long_envp[i] = (char *) _strdup32 (envp[i]);
> -
> -  long_envp[i] = (char *) 0;
> -
> -#pragma __pointer_size short
> -
> -  status = main (argc, long_argv, long_envp);
> -
> -  /* Map into a range of 0 - 255.  */
> -  status = status & 255;
> -
> -  if (status > 0)
> -    {
> -      int save_status = status;
> -
> -      status = C$_EXIT1 + ((status - 1) << STS$V_MSG_NO);
> -
> -      /* An exit failure status requires a "severe" error.  All status values
> -	 are defined in errno with a successful (1) severity but can be
> -	 changed to an error (2) severity by adding 1.  In addition for
> -	 compatibility with UNIX exit() routines we inhibit a run-time error
> -	 message from being generated on exit(1).  */
> -
> -      if (save_status == 1)
> -	{
> -	  status++;
> -	  status |= STS$M_INHIB_MSG;
> -	}
> -    }
> -
> -  if (status == 0)
> -    status = SS$_NORMAL;
> -
> -  return status;
> -}
> -#endif
> diff --git a/gcc/config/vms/vms-psxcrt0.c b/gcc/config/vms/vms-psxcrt0.c
> deleted file mode 100644
> index 5ad5ddb..0000000
> --- a/gcc/config/vms/vms-psxcrt0.c
> +++ /dev/null
> @@ -1,94 +0,0 @@
> -/* VMS crt0 returning Unix style condition codes .
> -   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
> -   Contributed by Douglas B. Rupp (rupp@gnat.com).
> -
> -   This file is part of GCC.
> -
> -   GCC is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 3, or (at your option)
> -   any later version.
> -
> -   GCC is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   Under Section 7 of GPL version 3, you are granted additional
> -   permissions described in the GCC Runtime Library Exception, version
> -   3.1, as published by the Free Software Foundation.
> -
> -   You should have received a copy of the GNU General Public License and
> -   a copy of the GCC Runtime Library Exception along with this program;
> -   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> -   <http://www.gnu.org/licenses/>.  */
> -
> -#if !defined(__DECC)
> -You Lose! This file can only be compiled with DEC C.
> -#else
> -
> -/* This file can only be compiled with DEC C, due to the call to
> -   lib$establish.  */
> -
> -#include <stdlib.h>
> -#include <string.h>
> -#include <ssdef.h>
> -#include <stsdef.h>
> -#include <errnodef.h>
> -
> -extern void decc$main ();
> -extern int main ();
> -
> -static int
> -handler (sigargs, mechargs)
> -     void *sigargs;
> -     void *mechargs;
> -{
> -  return SS$_RESIGNAL;
> -}
> -
> -int
> -__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
> -     void *arg1, *arg2, *arg3;
> -     void *image_file_desc;
> -     void *arg5, *arg6;
> -{
> -  int argc;
> -  char **argv;
> -  char **envp;
> -  int status;
> -
> -  lib$establish (handler);
> -  decc$main (arg1, arg2, arg3, image_file_desc, arg5, arg6,
> -	     &argc, &argv, &envp);
> -
> -  status = main (argc, argv, envp);
> -
> -  /* Map into a range of 0 - 255.  */
> -  status = status & 255;
> -
> -  if (status > 0)
> -    {
> -      int save_status = status;
> -
> -      status = C$_EXIT1 + ((status - 1) << STS$V_MSG_NO);
> -
> -      /* An exit failure status requires a "severe" error
> -	 All status values are defined in errno with a successful
> -	 (1) severity but can be changed to an error (2) severity by adding 1.
> -	 In addition for compatibility with UNIX exit() routines we inhibit
> -	 a run-time error message from being generated on exit(1).  */
> -
> -      if (save_status == 1)
> -	{
> -	  status++;
> -	  status |= STS$M_INHIB_MSG;
> -	}
> -    }
> -
> -  if (status == 0)
> -    status = SS$_NORMAL;
> -
> -  return status;
> -}
> -#endif
> diff --git a/gcc/config/vms/vms-ucrt0.c b/gcc/config/vms/vms-ucrt0.c
> new file mode 100644
> index 0000000..344b595
> --- /dev/null
> +++ b/gcc/config/vms/vms-ucrt0.c
> @@ -0,0 +1,127 @@
> +/* VMS crt0 returning Unix style condition codes.
> +   Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc.
> +   Contributed by Douglas B. Rupp (rupp@gnat.com).
> +
> +   This file is part of GCC.
> +
> +   GCC is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 3, or (at your option)
> +   any later version.
> +
> +   GCC is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   Under Section 7 of GPL version 3, you are granted additional
> +   permissions described in the GCC Runtime Library Exception, version
> +   3.1, as published by the Free Software Foundation.
> +
> +   You should have received a copy of the GNU General Public License and
> +   a copy of the GCC Runtime Library Exception along with this program;
> +   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <stdlib.h>
> +
> +/* Lots of cheat to handle 32bits/64bits pointer conversions.
> +   We use 'long long' for 64 bits pointers and 'int' for 32 bits pointers.  */
> +
> +extern void decc$main (void *arg1, void *arg2, void *arg3,
> +                       void *image_file_desc, void *arg5, void *arg6,
> +                       int *, int *, int *);
> +extern int main (int, char **, char **);
> +extern int _malloc32 (int);
> +
> +#ifdef __ia64__
> +#define MAIN_ASM_NAME asm ("ELF$TFRADR")
> +#else
> +#define MAIN_ASM_NAME
> +#endif
> +
> +int __main (void *arg1, void *arg2, void *arg3,
> +            void *image_file_desc, void *arg5, void *arg6) MAIN_ASM_NAME;
> +
> +/* From errnodef.h, but we need to emulate the globalval.  */
> +extern int C$_EXIT1;
> +
> +/* From stsdef.h  */
> +#define STS$V_MSG_NO 0x03
> +#define STS$M_INHIB_MSG 0x10000000
> +
> +/* From ssdef.h  */
> +#define SS$_NORMAL 1
> +
> +int
> +__main (void *arg1, void *arg2, void *arg3,
> +        void *image_file_desc, void *arg5, void *arg6)
> +{
> +  int argc;
> +  int argv;
> +  int envp;
> +  int status;
> +  int i;
> +  long long *long_argv;
> +  long long *long_envp;
> +
> +  /* The argv and envp arrays are 32 bits pointers to 32 bits pointers.  */
> +  decc$main (arg1, arg2, arg3, image_file_desc,
> +	     arg5, arg6, &argc, &argv, &envp);
> +
> +  if (sizeof (void *) == 8)
> +    {
> +      /* Reallocate argv and envp with 64 bit pointers.  */
> +      long_argv = (long long *)
> +        (long long) _malloc32 (sizeof (long long) * (argc + 1));
> +
> +      for (i = 0; i < argc; i++)
> +        long_argv[i] = ((int *) (long long) argv)[i];
> +
> +      long_argv[argc] = 0;
> +
> +      for (i = 0; ((int *) (long long) envp)[i]; i++)
> +        ;
> +      long_envp = (long long *)
> +        (long long) _malloc32 (sizeof (long long) * (i + 1));
> +
> +      for (i = 0; ((int *) (long long) envp)[i]; i++)
> +        long_envp[i] = ((int *) (long long) envp)[i];
> +
> +      long_envp[i] = 0;
> +    }
> +  else
> +    {
> +      long_argv = (long long *) argv;
> +      long_envp = (long long *) envp;
> +    }
> +  status = main (argc, (char **)long_argv, (char **)long_envp);
> +
> +#ifdef CRT0_POSIX_EXIT
> +  /* Map into a range of 0 - 255.  */
> +  status = status & 255;
> +
> +  if (status > 0)
> +    {
> +      int save_status = status;
> +
> +      status = (long) &C$_EXIT1 + ((status - 1) << STS$V_MSG_NO);
> +
> +      /* An exit failure status requires a "severe" error.  All status values
> +	 are defined in errno with a successful (1) severity but can be
> +	 changed to an error (2) severity by adding 1.  In addition for
> +	 compatibility with UNIX exit() routines we inhibit a run-time error
> +	 message from being generated on exit(1).  */
> +
> +      if (save_status == 1)
> +	{
> +	  status++;
> +	  status |= STS$M_INHIB_MSG;
> +	}
> +    }
> +  else
> +    status = SS$_NORMAL;
> +#endif /* CRT0_POSIX_EXIT */
> +
> +  return status;
> +}
>
Richard Henderson - Sept. 22, 2010, 4:04 p.m.
On 09/22/2010 04:02 AM, Tristan Gingold wrote:
> Richard, you have traditionally approved the VMS patches so I have
> CC'ed you.  However, if the SC think the VMS files deserve a
> maintainer, I (and/or Doug Rupp) will be happy to become maintainers
> for the VMS specific parts.

I do think one of you should become VMS maintainer.

>> -  char **argv;
>> -  char **envp;
>> -
>> -#pragma __pointer_size long
>> -
>> -  int i;
>> -  char **long_argv;
>> -  char **long_envp;
...
>> +  int argc;
>> +  int argv;
>> +  int envp;
>> +  int status;
>> +  int i;
>> +  long long *long_argv;
>> +  long long *long_envp;

It would make much more sense to me if you were to use __attribute__((mode()))
to change pointer sizes, rather than just casting between integer types.

In particular, that would get you extension via ADDP4 on ia64, which surely is
More Correct.  It may so happen that vms is not using ia64 segmentation, but it
feels wrong to ignore it entirely.


r~
Tristan Gingold - Sept. 23, 2010, 8:09 a.m.
On Sep 22, 2010, at 6:04 PM, Richard Henderson wrote:

> On 09/22/2010 04:02 AM, Tristan Gingold wrote:
>> Richard, you have traditionally approved the VMS patches so I have
>> CC'ed you.  However, if the SC think the VMS files deserve a
>> maintainer, I (and/or Doug Rupp) will be happy to become maintainers
>> for the VMS specific parts.
> 
> I do think one of you should become VMS maintainer.

Ok, I will forward that to the SC.

>>> -  char **argv;
>>> -  char **envp;
>>> -
>>> -#pragma __pointer_size long
>>> -
>>> -  int i;
>>> -  char **long_argv;
>>> -  char **long_envp;
> ...
>>> +  int argc;
>>> +  int argv;
>>> +  int envp;
>>> +  int status;
>>> +  int i;
>>> +  long long *long_argv;
>>> +  long long *long_envp;
> 
> It would make much more sense to me if you were to use __attribute__((mode()))
> to change pointer sizes, rather than just casting between integer types.

Interesting comment, as internally we use a lot the mode() to deals with pointers
size in C.

> In particular, that would get you extension via ADDP4 on ia64, which surely is
> More Correct.  It may so happen that vms is not using ia64 segmentation, but it
> feels wrong to ignore it entirely.

I am not sure that this is 'More Correct'.  VMS only use segments 0 (process private space)
and 7 (system space) - this is for compatibility with Alpha; therefore addp4 might
create invalid addresses.  On VMS the address must simply be signed extended.

I have double-checked with the VMS native compiler and it doesn't use addp4
to extend addresses but sxt4:

$ type extend.c
#pragma pointer_size 32
typedef char *p32;

#pragma pointer_size 64
typedef char *p64;

p64 conv (p32 a)
{
  return (p64) a;
}

...
			CONV:						        
					   // 000007
			   { .mib 
002C00204840     0000		      alloc   r33 = rspfs, 1, 1, 0, 0
0000B2000200     0001		      sxt4    r8 = a			        
// r8 = r32				   // 000009
004000000000     0002		      nop.b   0 ;;
			   }
			   { .mfb 
000008000000     0010		      nop.m   0
000008000000     0011		      nop.f   0
000108001100     0012		      br.ret.sptk.many rp ;;		        
// br0
			   }
				      .endp   CONV

The use of addp4 is enabled only when TARGET_ILP32 is set - which is not true for VMS,
so using the mode() attribute is only a style choice.

With this deeper view, tell me if you prefer a version with mode() attributes.  If so, I will
write and test it. (Or it might be done as a follow-up).

Tristan.
Richard Henderson - Sept. 23, 2010, 3:12 p.m.
On 09/23/2010 01:09 AM, Tristan Gingold wrote:
> I have double-checked with the VMS native compiler and it doesn't use addp4
> to extend addresses but sxt4:

Interesting.  In which case I suppose the code is fine as-is.


r~

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index d33d1c6..5ba28a6 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -721,7 +721,7 @@  alpha*-dec-osf5.1*)
 alpha64-dec-*vms*)
 	tm_file="${tm_file} alpha/vms.h alpha/vms64.h"
 	xm_file="alpha/xm-vms.h vms/xm-vms64.h"
-	tmake_file="alpha/t-alpha vms/t-vms vms/t-vms64 alpha/t-vms alpha/t-ieee"
+	tmake_file="alpha/t-alpha vms/t-vms alpha/t-vms alpha/t-ieee"
 	xmake_file=vms/x-vms
 	exeext=.exe
 	install_headers_dir=install-headers-cp
@@ -1549,7 +1549,7 @@  ia64*-*-hpux*)
 ia64-hp-*vms*)
 	tm_file="${tm_file} elfos.h ia64/sysv4.h ia64/elf.h ia64/vms.h ia64/vms64.h"
 	xm_file="vms/xm-vms.h vms/xm-vms64.h"
-	tmake_file="vms/t-vms vms/t-vms64 ia64/t-ia64 ia64/t-vms"
+	tmake_file="vms/t-vms ia64/t-ia64 ia64/t-vms"
 	xmake_file=vms/x-vms
 	target_cpu_default="0"
 	if test x$gas = xyes
diff --git a/gcc/config/vms/t-vms b/gcc/config/vms/t-vms
index 132a53b..75756a2 100644
--- a/gcc/config/vms/t-vms
+++ b/gcc/config/vms/t-vms
@@ -24,15 +24,14 @@  LIMITS_H_TEST = false
 # Under VMS, directory names cannot contain dots.
 version:=$(shell echo $(BASEVER_c) | sed -e 's/\./_/g')
 
-# Temporary restriction: VMS_EXTRA_PARTS must be compiled by DEC C.
-#VMS_EXTRA_PARTS=vcrt0.o pcrt0.o
-VMS_EXTRA_PARTS=
-
-DECC=`echo $(CC) | sed -e 's/xgcc -B.*/decc$(exeext)/' -e 's/^gcc/decc/' -e 's/^decc/.\/decc/' -e 's/\(.*\)-gcc/\1-decc/'`
+VMS_EXTRA_PARTS=vcrt0.o pcrt0.o
 
 # Assemble startup files.
-$(T)vcrt0.o: $(CRT0_S) $(GCC_PASSES)
-	$(DECC) -c /names=as_is $(srcdir)/config/vms/vms-crt0.c -o $(T)vcrt0.o
+$(T)vcrt0.o: $(srcdir)/config/vms/vms-ucrt0.c $(GCC_PASSES)
+	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
+	-c -o $(T)vcrt0.o $(srcdir)/config/vms/vms-ucrt0.c
+
+$(T)pcrt0.o: $(srcdir)/config/vms/vms-ucrt0.c $(GCC_PASSES)
+	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
+	-c -o $(T)pcrt0.o -DCRT0_POSIX_EXIT $(srcdir)/config/vms/vms-ucrt0.c
 
-$(T)pcrt0.o: $(CRT0_S) $(GCC_PASSES)
-	$(DECC) -c /names=as_is $(srcdir)/config/vms/vms-psxcrt0.c -o $(T)pcrt0.o
diff --git a/gcc/config/vms/t-vms64 b/gcc/config/vms/t-vms64
deleted file mode 100644
index 2fe0069..0000000
--- a/gcc/config/vms/t-vms64
+++ /dev/null
@@ -1,27 +0,0 @@ 
-# Copyright (C) 2009
-# Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-# Assemble startup files.
-$(T)vcrt0.o: $(CRT0_S) $(GCC_PASSES)
-	$(DECC) -c /names=as_is /pointer_size=64  \
-	     $(srcdir)/config/vms/vms-crt0-64.c -o $(T)vcrt0.o
-
-$(T)pcrt0.o: $(CRT0_S) $(GCC_PASSES)
-	$(DECC) -c /names=as_is /pointer_size=64 \
-	     $(srcdir)/config/vms/vms-psxcrt0-64.c -o $(T)pcrt0.o
diff --git a/gcc/config/vms/vms-crt0-64.c b/gcc/config/vms/vms-crt0-64.c
deleted file mode 100644
index ec59d81..0000000
--- a/gcc/config/vms/vms-crt0-64.c
+++ /dev/null
@@ -1,95 +0,0 @@ 
-/* VMS 64bit crt0 returning VMS style condition codes .
-   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
-   Contributed by Douglas B. Rupp (rupp@gnat.com).
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined(__DECC)
-You Lose! This file can only be compiled with DEC C.
-#else
-
-/* This file can only be compiled with DEC C, due to the call to
-   lib$establish and the pragmas pointer_size.  */
-
-#pragma __pointer_size short
-
-#include <stdlib.h>
-#include <string.h>
-#include <ssdef.h>
-
-extern void decc$main ();
-
-extern int main ();
-
-static int
-handler (sigargs, mechargs)
-     void *sigargs;
-     void *mechargs;
-{
-  return SS$_RESIGNAL;
-}
-
-int
-__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
-     void *arg1, *arg2, *arg3;
-     void *image_file_desc;
-     void *arg5, *arg6;
-{
-  int argc;
-  char **argv;
-  char **envp;
-
-#pragma __pointer_size long
-
-  int i;
-  char **long_argv;
-  char **long_envp;
-
-#pragma __pointer_size short
-
-  lib$establish (handler);
-  decc$main (arg1, arg2, arg3, image_file_desc,
-	     arg5, arg6, &argc, &argv, &envp);
-
-#pragma __pointer_size long
-
-  /* Reallocate argv with 64 bit pointers.  */
-  long_argv = (char **) _malloc32 (sizeof (char *) * (argc + 1));
-
-  for (i = 0; i < argc; i++)
-    long_argv[i] = (char *) _strdup32 (argv[i]);
-
-  long_argv[argc] = (char *) 0;
-
-  for (i = 0; envp[i]; i++);
-  long_envp = (char **) _malloc32 (sizeof (char *) * (i + 1));
-
-  for (i = 0; envp[i]; i++)
-    long_envp[i] = (char *) _strdup32 (envp[i]);
-
-  long_envp[i] = (char *) 0;
-
-#pragma __pointer_size short
-
-  return main (argc, long_argv, long_envp);
-}
-#endif
diff --git a/gcc/config/vms/vms-crt0.c b/gcc/config/vms/vms-crt0.c
deleted file mode 100644
index c0fdaaf..0000000
--- a/gcc/config/vms/vms-crt0.c
+++ /dev/null
@@ -1,66 +0,0 @@ 
-/* VMS crt0 returning VMS style condition codes .
-   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
-   Contributed by Douglas B. Rupp (rupp@gnat.com).
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined(__DECC)
-You Lose! This file can only be compiled with DEC C.
-#else
-
-/* This file can only be compiled with DEC C, due to the call to
-   lib$establish.  */
-
-#include <stdlib.h>
-#include <string.h>
-#include <ssdef.h>
-
-extern void decc$main ();
-
-extern int main ();
-
-static int
-handler (sigargs, mechargs)
-     void *sigargs;
-     void *mechargs;
-{
-  return SS$_RESIGNAL;
-}
-
-int
-__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
-     void *arg1, *arg2, *arg3;
-     void *image_file_desc;
-     void *arg5, *arg6;
-{
-  int argc;
-  char **argv;
-  char **envp;
-
-  lib$establish (handler);
-
-  decc$main(arg1, arg2, arg3, image_file_desc, arg5, arg6,
-	    &argc, &argv, &envp);
-
-  return main (argc, argv, envp);
-}
-#endif
diff --git a/gcc/config/vms/vms-psxcrt0-64.c b/gcc/config/vms/vms-psxcrt0-64.c
deleted file mode 100644
index 45afbc9..0000000
--- a/gcc/config/vms/vms-psxcrt0-64.c
+++ /dev/null
@@ -1,124 +0,0 @@ 
-/* VMS 64bit crt0 returning Unix style condition codes .
-   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
-   Contributed by Douglas B. Rupp (rupp@gnat.com).
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined(__DECC)
-You Lose! This file can only be compiled with DEC C.
-#else
-
-/* This file can only be compiled with DEC C, due to the call to
-   lib$establish and the pragmas pointer_size.  */
-
-#pragma __pointer_size short
-
-#include <stdlib.h>
-#include <string.h>
-#include <ssdef.h>
-#include <stsdef.h>
-#include <errnodef.h>
-
-extern void decc$main ();
-extern int main ();
-
-static int
-handler (sigargs, mechargs)
-     void *sigargs;
-     void *mechargs;
-{
-  return SS$_RESIGNAL;
-}
-
-int
-__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
-     void *arg1, *arg2, *arg3;
-     void *image_file_desc;
-     void *arg5, *arg6;
-{
-  int argc;
-  char **argv;
-  char **envp;
-
-#pragma __pointer_size long
-
-  int i;
-  char **long_argv;
-  char **long_envp;
-  int status;
-
-#pragma __pointer_size short
-
-  lib$establish (handler);
-  decc$main (arg1, arg2, arg3, image_file_desc,
-	     arg5, arg6, &argc, &argv, &envp);
-
-#pragma __pointer_size long
-
-  /* Reallocate argv with 64 bit pointers.  */
-  long_argv = (char **) _malloc32 (sizeof (char *) * (argc + 1));
-
-  for (i = 0; i < argc; i++)
-    long_argv[i] = (char *) _strdup32 (argv[i]);
-
-  long_argv[argc] = (char *) 0;
-
-  for (i = 0; envp[i]; i++);
-  long_envp = (char **) _malloc32 (sizeof (char *) * (i + 1));
-
-  for (i = 0; envp[i]; i++)
-    long_envp[i] = (char *) _strdup32 (envp[i]);
-
-  long_envp[i] = (char *) 0;
-
-#pragma __pointer_size short
-
-  status = main (argc, long_argv, long_envp);
-
-  /* Map into a range of 0 - 255.  */
-  status = status & 255;
-
-  if (status > 0)
-    {
-      int save_status = status;
-
-      status = C$_EXIT1 + ((status - 1) << STS$V_MSG_NO);
-
-      /* An exit failure status requires a "severe" error.  All status values
-	 are defined in errno with a successful (1) severity but can be
-	 changed to an error (2) severity by adding 1.  In addition for
-	 compatibility with UNIX exit() routines we inhibit a run-time error
-	 message from being generated on exit(1).  */
-
-      if (save_status == 1)
-	{
-	  status++;
-	  status |= STS$M_INHIB_MSG;
-	}
-    }
-
-  if (status == 0)
-    status = SS$_NORMAL;
-
-  return status;
-}
-#endif
diff --git a/gcc/config/vms/vms-psxcrt0.c b/gcc/config/vms/vms-psxcrt0.c
deleted file mode 100644
index 5ad5ddb..0000000
--- a/gcc/config/vms/vms-psxcrt0.c
+++ /dev/null
@@ -1,94 +0,0 @@ 
-/* VMS crt0 returning Unix style condition codes .
-   Copyright (C) 2001, 2009 Free Software Foundation, Inc.
-   Contributed by Douglas B. Rupp (rupp@gnat.com).
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined(__DECC)
-You Lose! This file can only be compiled with DEC C.
-#else
-
-/* This file can only be compiled with DEC C, due to the call to
-   lib$establish.  */
-
-#include <stdlib.h>
-#include <string.h>
-#include <ssdef.h>
-#include <stsdef.h>
-#include <errnodef.h>
-
-extern void decc$main ();
-extern int main ();
-
-static int
-handler (sigargs, mechargs)
-     void *sigargs;
-     void *mechargs;
-{
-  return SS$_RESIGNAL;
-}
-
-int
-__main (arg1, arg2, arg3, image_file_desc, arg5, arg6)
-     void *arg1, *arg2, *arg3;
-     void *image_file_desc;
-     void *arg5, *arg6;
-{
-  int argc;
-  char **argv;
-  char **envp;
-  int status;
-
-  lib$establish (handler);
-  decc$main (arg1, arg2, arg3, image_file_desc, arg5, arg6,
-	     &argc, &argv, &envp);
-
-  status = main (argc, argv, envp);
-
-  /* Map into a range of 0 - 255.  */
-  status = status & 255;
-
-  if (status > 0)
-    {
-      int save_status = status;
-
-      status = C$_EXIT1 + ((status - 1) << STS$V_MSG_NO);
-
-      /* An exit failure status requires a "severe" error
-	 All status values are defined in errno with a successful
-	 (1) severity but can be changed to an error (2) severity by adding 1.
-	 In addition for compatibility with UNIX exit() routines we inhibit
-	 a run-time error message from being generated on exit(1).  */
-
-      if (save_status == 1)
-	{
-	  status++;
-	  status |= STS$M_INHIB_MSG;
-	}
-    }
-
-  if (status == 0)
-    status = SS$_NORMAL;
-
-  return status;
-}
-#endif
diff --git a/gcc/config/vms/vms-ucrt0.c b/gcc/config/vms/vms-ucrt0.c
new file mode 100644
index 0000000..344b595
--- /dev/null
+++ b/gcc/config/vms/vms-ucrt0.c
@@ -0,0 +1,127 @@ 
+/* VMS crt0 returning Unix style condition codes.
+   Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc.
+   Contributed by Douglas B. Rupp (rupp@gnat.com).
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdlib.h>
+
+/* Lots of cheat to handle 32bits/64bits pointer conversions.
+   We use 'long long' for 64 bits pointers and 'int' for 32 bits pointers.  */
+
+extern void decc$main (void *arg1, void *arg2, void *arg3,
+                       void *image_file_desc, void *arg5, void *arg6,
+                       int *, int *, int *);
+extern int main (int, char **, char **);
+extern int _malloc32 (int);
+
+#ifdef __ia64__
+#define MAIN_ASM_NAME asm ("ELF$TFRADR")
+#else
+#define MAIN_ASM_NAME
+#endif
+
+int __main (void *arg1, void *arg2, void *arg3,
+            void *image_file_desc, void *arg5, void *arg6) MAIN_ASM_NAME;
+
+/* From errnodef.h, but we need to emulate the globalval.  */
+extern int C$_EXIT1;
+
+/* From stsdef.h  */
+#define STS$V_MSG_NO 0x03
+#define STS$M_INHIB_MSG 0x10000000
+
+/* From ssdef.h  */
+#define SS$_NORMAL 1
+
+int
+__main (void *arg1, void *arg2, void *arg3,
+        void *image_file_desc, void *arg5, void *arg6)
+{
+  int argc;
+  int argv;
+  int envp;
+  int status;
+  int i;
+  long long *long_argv;
+  long long *long_envp;
+
+  /* The argv and envp arrays are 32 bits pointers to 32 bits pointers.  */
+  decc$main (arg1, arg2, arg3, image_file_desc,
+	     arg5, arg6, &argc, &argv, &envp);
+
+  if (sizeof (void *) == 8)
+    {
+      /* Reallocate argv and envp with 64 bit pointers.  */
+      long_argv = (long long *)
+        (long long) _malloc32 (sizeof (long long) * (argc + 1));
+
+      for (i = 0; i < argc; i++)
+        long_argv[i] = ((int *) (long long) argv)[i];
+
+      long_argv[argc] = 0;
+
+      for (i = 0; ((int *) (long long) envp)[i]; i++)
+        ;
+      long_envp = (long long *)
+        (long long) _malloc32 (sizeof (long long) * (i + 1));
+
+      for (i = 0; ((int *) (long long) envp)[i]; i++)
+        long_envp[i] = ((int *) (long long) envp)[i];
+
+      long_envp[i] = 0;
+    }
+  else
+    {
+      long_argv = (long long *) argv;
+      long_envp = (long long *) envp;
+    }
+  status = main (argc, (char **)long_argv, (char **)long_envp);
+
+#ifdef CRT0_POSIX_EXIT
+  /* Map into a range of 0 - 255.  */
+  status = status & 255;
+
+  if (status > 0)
+    {
+      int save_status = status;
+
+      status = (long) &C$_EXIT1 + ((status - 1) << STS$V_MSG_NO);
+
+      /* An exit failure status requires a "severe" error.  All status values
+	 are defined in errno with a successful (1) severity but can be
+	 changed to an error (2) severity by adding 1.  In addition for
+	 compatibility with UNIX exit() routines we inhibit a run-time error
+	 message from being generated on exit(1).  */
+
+      if (save_status == 1)
+	{
+	  status++;
+	  status |= STS$M_INHIB_MSG;
+	}
+    }
+  else
+    status = SS$_NORMAL;
+#endif /* CRT0_POSIX_EXIT */
+
+  return status;
+}