This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch v2] convert config/vms/*crt0* files to gcc style (PR 44242)
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;
> +}
>