summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/config/alpha/osf.h4
-rw-r--r--gcc/gcc.c109
-rw-r--r--gcc/gcc.h3
-rw-r--r--gcc/java/ChangeLog11
-rw-r--r--gcc/java/jvgenmain.c13
-rw-r--r--gcc/java/jvspec.c18
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)
{