This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
fortran driver patch
- To: egcs at cygnus dot com
- Subject: fortran driver patch
- From: Richard Henderson <rth at cygnus dot com>
- Date: Sun, 12 Oct 1997 00:12:43 -0700
- Reply-To: Richard Henderson <rth at cygnus dot com>
I was getting errors running f-torture from g77 not finding gcc,
despite the --driver nonsense. In any case, the more proper way
to have this done is not to exec at all, just like g++.
Oh, any though it isn't in the patch, rm gcc/f/g77.c. And the
dejagnu bit needs to be changed not to use --driver.
r~
Sun Oct 12 00:06:09 1997 Richard Henderson <rth@cygnus.com>
* Make-lang.in (g77*): Copied from cp/Make-lang.in g++*.
* g77spec.c: New file, mostly copied from g++spec.c
* g77.c: Removed.
? g77spec.c
Index: Make-lang.in
===================================================================
RCS file: /cvs/cvsfiles/egcs/gcc/f/Make-lang.in,v
retrieving revision 1.15
diff -u -p -d -r1.15 Make-lang.in
--- Make-lang.in 1997/10/06 20:13:30 1.15
+++ Make-lang.in 1997/10/12 07:04:55
@@ -109,23 +109,31 @@ F77 f77: f771
f77.maintainer-clean f77.realclean f77.stage1 f77.stage2 f77.stage3 \
f77.stage4 f77.distdir f77.rebuilt
-# Create the compiler driver for g77 (only if `f77' is in LANGUAGES).
-g77: $(srcdir)/f/g77.c $(srcdir)/f/version.c $(CONFIG_H) $(LIBDEPS)
- case '$(LANGUAGES)' in \
- *f77*) \
- $(CC) $(ALL_CFLAGS) $(INCLUDES) $(LDFLAGS) \
- -o $@ $(srcdir)/f/g77.c $(srcdir)/f/version.c $(LIBS) ;; \
- esac
+g77.c: $(srcdir)/gcc.c
+ -rm -f $@
+ $(LN_S) $(srcdir)/gcc.c $@
-# Create a version of the g77 driver which calls the cross-compiler
-# (only if `f77' is in LANGUAGES).
-g77-cross: $(srcdir)/f/g77.c $(srcdir)/f/version.c version.o $(LIBDEPS)
- case '$(LANGUAGES)' in \
- *f77*) \
- $(CC) $(ALL_CFLAGS) $(INCLUDES) $(LDFLAGS) \
- -DGCC_NAME=\"$(GCC_CROSS_NAME)\" \
- -o $@ $(srcdir)/f/g77.c $(srcdir)/f/version.c $(LIBS) ;; \
- esac
+g77spec.o: $(srcdir)/f/g77spec.c
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/f/g77spec.c
+
+# N.B.: This is a copy of the gcc.o rule, with -DLANG_SPECIFIC_DRIVER added.
+# It'd be nice if we could find an easier way to do this---rather than have
+# to track changes to the toplevel gcc Makefile as well.
+# We depend on g77.c last, to make it obvious where it came from.
+g77.o: $(CONFIG_H) multilib.h config.status $(lang_specs_files) g77.c
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ $(DRIVER_DEFINES) \
+ -DLANG_SPECIFIC_DRIVER -c g77.c
+
+# Create the compiler driver for g77.
+g77$(exeext): g77.o g77spec.o version.o choose-temp.o pexecute.o $(LIBDEPS) $(EXTRA_GCC_OBJS)
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ g77.o g77spec.o version.o \
+ choose-temp.o pexecute.o $(EXTRA_GCC_OBJS) $(LIBS)
+
+# Create a version of the g77 driver which calls the cross-compiler.
+g77-cross$(exeext): g77$(exeext)
+ -rm -f g77-cross$(exeext)
+ cp g77$(exeext) g77-cross$(exeext)
F77_SRCS = \
$(srcdir)/f/assert.j \
*** /dev/null Wed Aug 13 13:41:06 1997
--- g77spec.c Sat Oct 11 19:29:56 1997
***************
*** 0 ****
--- 1,269 ----
+ /* Specific flags and argument handling of the Fortran front-end.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+
+ This file is part of GNU CC.
+
+ GNU CC 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 2, or (at your option)
+ any later version.
+
+ GNU CC 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 GNU CC; see the file COPYING. If not, write to
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+ #include "config.h"
+
+ #include <sys/types.h>
+ #include <stdio.h>
+
+ #include "gansidecl.h"
+
+ #ifdef HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+
+ #ifdef HAVE_STRING_H
+ #include <string.h>
+ #endif
+
+ /* This bit is set if we saw a `-xfoo' language specification. */
+ #define LANGSPEC (1<<1)
+ /* This bit is set if they did `-lm' or `-lmath'. */
+ #define MATHLIB (1<<2)
+ /* This bit is set if they did `-lc'. */
+ #define WITHLIBC (1<<3)
+
+ #ifndef MATH_LIBRARY
+ #define MATH_LIBRARY "-lm"
+ #endif
+
+ #ifndef FORTRAN_LIBRARY
+ #define FORTRAN_LIBRARY "-lf2c"
+ #endif
+
+ extern char *xmalloc PROTO((size_t));
+
+ void
+ lang_specific_driver (fn, in_argc, in_argv)
+ void (*fn)();
+ int *in_argc;
+ char ***in_argv;
+ {
+ int i, j;
+
+ /* If non-zero, the user gave us the `-v' flag. */
+ int saw_verbose_flag = 0;
+
+ /* This will be 0 if we encounter a situation where we should not
+ link in libstdf77. */
+ int library = 1;
+
+ /* The number of arguments being added to what's in argv, other than
+ libraries. We use this to track the number of times we've inserted
+ -xf77/-xnone. */
+ int added = 2;
+
+ /* Used to track options that take arguments, so we don't go wrapping
+ those with -xf77/-xnone. */
+ char *quote = NULL;
+
+ /* The new argument list will be contained in this. */
+ char **arglist;
+
+ /* Non-zero if we saw a `-xfoo' language specification on the
+ command line. Used to avoid adding our own -xf77 if the user
+ already gave a language for the file. */
+ int saw_speclang = 0;
+
+ /* "-lm" or "-lmath" if it appears on the command line. */
+ char *saw_math = 0;
+
+ /* "-lc" if it appears on the command line. */
+ char *saw_libc = 0;
+
+ /* An array used to flag each argument that needs a bit set for
+ LANGSPEC, MATHLIB, or WITHLIBC. */
+ int *args;
+
+ /* By default, we throw on the math library. */
+ int need_math = 1;
+
+ /* The total number of arguments with the new stuff. */
+ int argc;
+
+ /* The argument list. */
+ char **argv;
+
+ /* The total number of arguments with the new stuff. */
+ int num_args = 1;
+
+ argc = *in_argc;
+ argv = *in_argv;
+
+ args = (int *) xmalloc (argc * sizeof (int));
+ bzero ((char *) args, argc * sizeof (int));
+
+ for (i = 1; i < argc; i++)
+ {
+ /* If the previous option took an argument, we swallow it here. */
+ if (quote)
+ {
+ quote = NULL;
+ continue;
+ }
+
+ /* We don't do this anymore, since we don't get them with minus
+ signs on them. */
+ if (argv[i][0] == '\0' || argv[i][1] == '\0')
+ continue;
+
+ if (argv[i][0] == '-')
+ {
+ if (library != 0 && (strcmp (argv[i], "-nostdlib") == 0
+ || strcmp (argv[i], "-nodefaultlibs") == 0))
+ {
+ library = 0;
+ }
+ else if (strcmp (argv[i], "-lm") == 0
+ || strcmp (argv[i], "-lmath") == 0
+ #ifdef ALT_LIBM
+ || strcmp (argv[i], ALT_LIBM) == 0
+ #endif
+ )
+ {
+ args[i] |= MATHLIB;
+ need_math = 0;
+ }
+ else if (strcmp (argv[i], "-lc") == 0)
+ args[i] |= WITHLIBC;
+ else if (strcmp (argv[i], "-v") == 0)
+ {
+ saw_verbose_flag = 1;
+ if (argc == 2)
+ {
+ /* If they only gave us `-v', don't try to link in libf2c. */
+ library = 0;
+ }
+ }
+ else if (strncmp (argv[i], "-x", 2) == 0)
+ saw_speclang = 1;
+ else if (((argv[i][2] == '\0'
+ && (char *)strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL)
+ || strcmp (argv[i], "-Tdata") == 0))
+ quote = argv[i];
+ else if (library != 0 && ((argv[i][2] == '\0'
+ && (char *) strchr ("cSEM", argv[i][1]) != NULL)
+ || strcmp (argv[i], "-MM") == 0))
+ {
+ /* Don't specify libraries if we won't link, since that would
+ cause a warning. */
+ library = 0;
+ added -= 2;
+ }
+ else
+ /* Pass other options through. */
+ continue;
+ }
+ else
+ {
+ int len;
+
+ if (saw_speclang)
+ {
+ saw_speclang = 0;
+ continue;
+ }
+
+ /* If the filename ends in .c or .i, put options around it.
+ But not if a specified -x option is currently active. */
+ len = strlen (argv[i]);
+ if (len > 2
+ && (argv[i][len - 1] == 'c' || argv[i][len - 1] == 'i')
+ && argv[i][len - 2] == '.')
+ {
+ args[i] |= LANGSPEC;
+ added += 2;
+ }
+ }
+ }
+
+ if (quote)
+ (*fn) ("argument to `%s' missing\n", quote);
+
+ /* If we know we don't have to do anything, bail now. */
+ if (! added && ! library)
+ {
+ free (args);
+ return;
+ }
+
+ num_args = argc + added + need_math;
+ arglist = (char **) xmalloc (num_args * sizeof (char *));
+
+ /* NOTE: We start at 1 now, not 0. */
+ for (i = 0, j = 0; i < argc; i++, j++)
+ {
+ arglist[j] = argv[i];
+
+ /* Make sure -lf2c is before the math library, since libf2c
+ itself uses those math routines. */
+ if (!saw_math && (args[i] & MATHLIB) && library)
+ {
+ --j;
+ saw_math = argv[i];
+ }
+
+ if (!saw_libc && (args[i] & WITHLIBC) && library)
+ {
+ --j;
+ saw_libc = argv[i];
+ }
+
+ /* Wrap foo.c and foo.i files in a language specification to
+ force the gcc compiler driver to run cc1plus on them. */
+ if (args[i] & LANGSPEC)
+ {
+ int len = strlen (argv[i]);
+ switch (argv[i][len - 1])
+ {
+ case 'F':
+ arglist[j++] = "-xf77-cpp-input";
+ break;
+ case 'r':
+ /* Don't do ratfor for ".for". */
+ if (argv[i][len - 2] == '.')
+ {
+ arglist[j++] = "-xratfor";
+ break;
+ }
+ default:
+ arglist[j++] = "-xf77";
+ break;
+ }
+ arglist[j++] = argv[i];
+ arglist[j] = "-xnone";
+ }
+ }
+
+ /* Add `-lf2c' if we haven't already done so. */
+ if (library)
+ arglist[j++] = FORTRAN_LIBRARY;
+ if (saw_math)
+ arglist[j++] = saw_math;
+ else if (library)
+ arglist[j++] = MATH_LIBRARY;
+ if (saw_libc)
+ arglist[j++] = saw_libc;
+
+ arglist[j] = NULL;
+
+ *in_argc = j;
+ *in_argv = arglist;
+ }