diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/alpha/osf.h | 4 | ||||
-rw-r--r-- | gcc/gcc.c | 109 | ||||
-rw-r--r-- | gcc/gcc.h | 3 | ||||
-rw-r--r-- | gcc/java/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/java/jvgenmain.c | 13 | ||||
-rw-r--r-- | gcc/java/jvspec.c | 18 |
7 files changed, 110 insertions, 60 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ee75869dfa7..59f1526e94c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2001-08-02 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * gcc.c (set_collect_gcc_options): New function, split out from + main. + Ignore elided switches. + (do_spec_1): Invoke before executing command. + (set_input): Export. + Move declaration ... + * gcc.h (set_input): ... here. + * config/alpha/osf.h (ASM_FINAL_SPEC): Use %U.s to refer to input + file. + 2001-08-02 Nathan Sidwell <nathan@codesourcery.com> Kill -fhonor-std. diff --git a/gcc/config/alpha/osf.h b/gcc/config/alpha/osf.h index 250974c46e7..4386f561bc6 100644 --- a/gcc/config/alpha/osf.h +++ b/gcc/config/alpha/osf.h @@ -121,7 +121,7 @@ Boston, MA 02111-1307, USA. */ %{K: -I %b.o~} \ %{!K: %{save-temps: -I %b.o~}} \ %{c:%W{o*}%{!o*:-o %b.o}}%{!c:-o %U.o} \ - %{.s:%i} %{!.s:%g.s}}}" + %{.s:%i} %{!.s:%U.s}}}" #else #define ASM_FINAL_SPEC "\ @@ -130,7 +130,7 @@ Boston, MA 02111-1307, USA. */ %{K: -I %b.o~} \ %{!K: %{save-temps: -I %b.o~}} \ %{c:%W{o*}%{!o*:-o %b.o}}%{!c:-o %U.o} \ - %{.s:%i} %{!.s:%g.s}}}" + %{.s:%i} %{!.s:%U.s}}}" #endif diff --git a/gcc/gcc.c b/gcc/gcc.c index 409ac2bbe9a..ed86fa0c2f2 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -289,6 +289,7 @@ static void clear_failure_queue PARAMS ((void)); static int check_live_switch PARAMS ((int, int)); static const char *handle_braces PARAMS ((const char *)); static char *save_string PARAMS ((const char *, int)); +static void set_collect_gcc_options PARAMS ((void)); static int do_spec_1 PARAMS ((const char *, int, const char *)); static const char *find_file PARAMS ((const char *)); static int is_directory PARAMS ((const char *, const char *, int)); @@ -312,7 +313,6 @@ static void process_command PARAMS ((int, const char *const *)); static int execute PARAMS ((void)); static void clear_args PARAMS ((void)); static void fatal_error PARAMS ((int)); -static void set_input PARAMS ((const char *)); static void init_gcc_specs PARAMS ((struct obstack *, const char *, const char *)); @@ -3960,6 +3960,63 @@ process_command (argc, argv) switches[n_switches].part1 = 0; infiles[n_infiles].name = 0; } + +/* Store switches not filtered out but %{<S} in spec in COLLECT_GCC_OPTIONS + and place that in the environment. */ + +static void +set_collect_gcc_options () +{ + int i; + int first_time; + + /* Build COLLECT_GCC_OPTIONS to have all of the options specified to + the compiler. */ + obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=", + sizeof ("COLLECT_GCC_OPTIONS=") - 1); + + first_time = TRUE; + for (i = 0; (int) i < n_switches; i++) + { + const char *const *args; + const char *p, *q; + if (!first_time) + obstack_grow (&collect_obstack, " ", 1); + + first_time = FALSE; + + /* Ignore elided switches. */ + if (switches[i].live_cond == SWITCH_IGNORE) + continue; + + obstack_grow (&collect_obstack, "'-", 2); + q = switches[i].part1; + while ((p = strchr (q, '\''))) + { + obstack_grow (&collect_obstack, q, p - q); + obstack_grow (&collect_obstack, "'\\''", 4); + q = ++p; + } + obstack_grow (&collect_obstack, q, strlen (q)); + obstack_grow (&collect_obstack, "'", 1); + + for (args = switches[i].args; args && *args; args++) + { + obstack_grow (&collect_obstack, " '", 2); + q = *args; + while ((p = strchr (q, '\''))) + { + obstack_grow (&collect_obstack, q, p - q); + obstack_grow (&collect_obstack, "'\\''", 4); + q = ++p; + } + obstack_grow (&collect_obstack, q, strlen (q)); + obstack_grow (&collect_obstack, "'", 1); + } + } + obstack_grow (&collect_obstack, "\0", 1); + putenv (obstack_finish (&collect_obstack)); +} /* Process a spec string, accumulating and running commands. */ @@ -4103,6 +4160,8 @@ do_spec_1 (spec, inswitch, soft_matched_part) argbuf_index--; } + set_collect_gcc_options (); + if (argbuf_index > 0) { value = execute (); @@ -5486,7 +5545,7 @@ is_directory (path1, path2, linker) /* Set up the various global variables to indicate that we're processing the input file named FILENAME. */ -static void +void set_input (filename) const char *filename; { @@ -5659,52 +5718,6 @@ main (argc, argv) process_command (argc, argv); - { - int first_time; - - /* Build COLLECT_GCC_OPTIONS to have all of the options specified to - the compiler. */ - obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=", - sizeof ("COLLECT_GCC_OPTIONS=") - 1); - - first_time = TRUE; - for (i = 0; (int) i < n_switches; i++) - { - const char *const *args; - const char *p, *q; - if (!first_time) - obstack_grow (&collect_obstack, " ", 1); - - first_time = FALSE; - obstack_grow (&collect_obstack, "'-", 2); - q = switches[i].part1; - while ((p = strchr (q, '\''))) - { - obstack_grow (&collect_obstack, q, p - q); - obstack_grow (&collect_obstack, "'\\''", 4); - q = ++p; - } - obstack_grow (&collect_obstack, q, strlen (q)); - obstack_grow (&collect_obstack, "'", 1); - - for (args = switches[i].args; args && *args; args++) - { - obstack_grow (&collect_obstack, " '", 2); - q = *args; - while ((p = strchr (q, '\''))) - { - obstack_grow (&collect_obstack, q, p - q); - obstack_grow (&collect_obstack, "'\\''", 4); - q = ++p; - } - obstack_grow (&collect_obstack, q, strlen (q)); - obstack_grow (&collect_obstack, "'", 1); - } - } - obstack_grow (&collect_obstack, "\0", 1); - putenv (obstack_finish (&collect_obstack)); - } - /* Initialize the vector of specs to just the default. This means one element containing 0s, as a terminator. */ diff --git a/gcc/gcc.h b/gcc/gcc.h index 62526769d86..55a79a90fa9 100644 --- a/gcc/gcc.h +++ b/gcc/gcc.h @@ -1,5 +1,5 @@ /* Header file for modules that link with gcc.c - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -33,6 +33,7 @@ extern void fatal PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; extern void error PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1; extern void pfatal_with_name PARAMS ((const char *)) ATTRIBUTE_NORETURN; +extern void set_input PARAMS ((const char *)); /* Spec files linked with gcc.c must provide definitions for these. */ diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 3c02e8088db..24f5c40ee8e 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -22,6 +22,17 @@ syntax error encountered during class definition. Fixes PR java/2956 +2001-08-02 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> + + * jvspec.c (jvgenmain_spec): Cannot use %umain, breaks + ASM_FINAL_SPEC. + (lang_specific_pre_link): Use set_input to set input_filename. + Append `main' here. + * jvgenmain.c (usage): Append literal `main' to CLASSNAME. + (main): Fix definition. + Strip `main' from classname. + Fixes PR java/227. + 2001-07-18 Tom Tromey <tromey@redhat.com> For PR java/2812: diff --git a/gcc/java/jvgenmain.c b/gcc/java/jvgenmain.c index ab43ddda3f9..9a425715066 100644 --- a/gcc/java/jvgenmain.c +++ b/gcc/java/jvgenmain.c @@ -61,14 +61,14 @@ static void usage (const char *) ATTRIBUTE_NORETURN; static void usage (const char *name) { - fprintf (stderr, "Usage: %s [OPTIONS]... CLASSNAME [OUTFILE]\n", name); + fprintf (stderr, "Usage: %s [OPTIONS]... CLASSNAMEmain [OUTFILE]\n", name); exit (1); } int -main (int argc, const char **argv) +main (int argc, char **argv) { - const char *classname; + char *classname, *p; FILE *stream; const char *mangled_classname; int i, last_arg; @@ -92,6 +92,13 @@ main (int argc, const char **argv) classname = argv[i]; + /* gcj always appends `main' to classname. We need to strip this here. */ + p = strrchr (classname, 'm'); + if (p == NULL || p == classname || strcmp (p, "main") != 0) + usage (argv[0]); + else + *p = '\0'; + gcc_obstack_init (mangle_obstack); mangled_classname = do_mangle_classname (classname); diff --git a/gcc/java/jvspec.c b/gcc/java/jvspec.c index 44342cf401a..761c580310d 100644 --- a/gcc/java/jvspec.c +++ b/gcc/java/jvspec.c @@ -52,8 +52,8 @@ int lang_specific_extra_outfiles = 0; int shared_libgcc = 1; const char jvgenmain_spec[] = - "jvgenmain %{D*} %i %{!pipe:%umain.i} |\n\ - cc1 %{!pipe:%Umain.i} %1 \ + "jvgenmain %{D*} %b %{!pipe:%u.i} |\n\ + cc1 %{!pipe:%U.i} %1 \ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\ %{g*} %{O*} \ %{v:-version} %{pg:-p} %{p}\ @@ -68,8 +68,8 @@ const char jvgenmain_spec[] = %{f*} -fdollars-in-identifiers\ %{aux-info*}\ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ - %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%Umain.s}} |\n\ - %{!S:as %a %Y -o %d%w%umain%O %{!pipe:%Umain.s} %A\n }"; + %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%U.s}} |\n\ + %{!S:as %a %Y -o %d%w%u%O %{!pipe:%U.s} %A\n }"; /* Return full path name of spec file if it is in DIR, or NULL if not. */ @@ -529,8 +529,14 @@ lang_specific_pre_link () int err; if (main_class_name == NULL) return 0; - input_filename = main_class_name; - input_filename_length = strlen (main_class_name); + /* Append `main' to make the filename unique and allow + + gcj --main=hello -save-temps hello.java + + to work. jvgenmain needs to strip this `main' to arrive at the correct + class name. Append dummy `.c' that can be stripped by set_input so %b + is correct. */ + set_input (concat (main_class_name, "main.c", NULL)); err = do_spec (jvgenmain_spec); if (err == 0) { |