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

login
register
mail settings
Submitter Tristan Gingold
Date Sept. 9, 2010, 9:39 a.m.
Message ID <707B51E0-F382-4641-AE9A-D48FF48F3BD0@adacore.com>
Download mbox | patch
Permalink /patch/64268/
State New
Headers show

Comments

Tristan Gingold - Sept. 9, 2010, 9:39 a.m.
Hi,

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: Use GCC_FOR_TARGET and vms-ucrt0.c to
	build vcrt0.o and pcrt0.o
	* config/vms/t-vms32: New file.
	* config/vms/t-vms (VMS_EXTRA_PARTS): Uncomment it.  Move
	vcrt0.o and prct0.o targets to t-vms32 and t-vms64.  Remove DECC.
	* config.gcc (alpha-dec-vms): Use t-vms.

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index d33d1c6..25b5301 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -730,7 +730,7 @@  alpha64-dec-*vms*)
 alpha*-dec-*vms*)
 	tm_file="${tm_file} alpha/vms.h"
 	xm_file="alpha/xm-vms.h"
-	tmake_file="alpha/t-alpha vms/t-vms alpha/t-vms alpha/t-ieee"
+	tmake_file="alpha/t-alpha vms/t-vms vms/t-vms32 alpha/t-vms alpha/t-ieee"
 	xmake_file=vms/x-vms
 	exeext=.exe
 	install_headers_dir=install-headers-cp
diff --git a/gcc/config/vms/t-vms b/gcc/config/vms/t-vms
index 132a53b..c882ab0 100644
--- a/gcc/config/vms/t-vms
+++ b/gcc/config/vms/t-vms
@@ -24,15 +24,4 @@  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/'`
-
-# 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)pcrt0.o: $(CRT0_S) $(GCC_PASSES)
-	$(DECC) -c /names=as_is $(srcdir)/config/vms/vms-psxcrt0.c -o $(T)pcrt0.o
+VMS_EXTRA_PARTS=vcrt0.o pcrt0.o
diff --git a/gcc/config/vms/t-vms32 b/gcc/config/vms/t-vms32
new file mode 100644
index 0000000..7ba9b79
--- /dev/null
+++ b/gcc/config/vms/t-vms32
@@ -0,0 +1,29 @@ 
+# Copyright (C) 2010
+# 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: $(srcdir)/config/vms/vms-ucrt0.c $(GCC_PASSES)
+	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
+	-c -o $(T)vcrt0.o -DCRT0_64 $(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_64 -DCRT0_POSIX_EXIT \
+        $(srcdir)/config/vms/vms-ucrt0.c
+
diff --git a/gcc/config/vms/t-vms64 b/gcc/config/vms/t-vms64
index 2fe0069..ac49703 100644
--- a/gcc/config/vms/t-vms64
+++ b/gcc/config/vms/t-vms64
@@ -18,10 +18,12 @@ 
 # <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)vcrt0.o: $(srcdir)/config/vms/vms-ucrt0.c $(GCC_PASSES)
+	$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
+	-c -o $(T)vcrt0.o -DCRT0_64 $(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_64 -DCRT0_POSIX_EXIT \
+        $(srcdir)/config/vms/vms-ucrt0.c
 
-$(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..acb60ff
--- /dev/null
+++ b/gcc/config/vms/vms-ucrt0.c
@@ -0,0 +1,123 @@ 
+/* 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.  */
+
+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 void *_malloc32 (long);
+
+#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;
+
+#ifdef CRT0_64
+  int i;
+  long *long_argv;
+  long *long_envp;
+#endif /* CRT0_64 */
+
+  decc$main (arg1, arg2, arg3, image_file_desc,
+	     arg5, arg6, &argc, &argv, &envp);
+
+#ifdef CRT0_64
+  /* Reallocate argv and envp with 64 bit pointers.  */
+  long_argv = (long *) (long) _malloc32 (sizeof (long) * (argc + 1));
+
+  for (i = 0; i < argc; i++)
+    long_argv[i] = ((int *) (long) argv)[i];
+
+  long_argv[argc] = 0;
+
+  for (i = 0; ((int *) (long) envp)[i]; i++)
+    ;
+  long_envp = (long *) (long) _malloc32 (sizeof (long ) * (i + 1));
+
+  for (i = 0; ((int *) (long)envp)[i]; i++)
+    long_envp[i] = ((int *) (long)envp)[i];
+
+  long_envp[i] = 0;
+
+  status = main (argc, (char **)long_argv, (char **)long_envp);
+#else /* !CRT0_64 */
+  status = main (argc, (char **)argv, (char **)envp);
+#endif
+
+#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;
+}