GCJ Build Error
Alexandre Petit-Bianco
apbianco@cygnus.com
Fri Aug 10 17:34:00 GMT 2001
Antonio Ake writes:
> Ok. First I need to tell you this, In version 3.0, libgcj for True64
> is not supported. There have been solved like 10 problems for True64
> v5.0(mine version) for GCC 3.0, and finally there is a very
> acceptable version.
OK, unfortunately, that patch will have to be reverted:
http://gcc.gnu.org/ml/gcc/2001-08/msg00569.html
It's not too obvious to me what makes it break things for some folks.
Mark Mitchell is pushing for this to happen. Rainer is unreachable
until September 10. I don't really have the time to look into
that. We'll have to revert the patch and re-open the PR java/227. I
know, it's a bummer. Hopefully support will be restored in the trunk
(the patch will be removed from the trunk too) as soon as someone has
some usefull time to spend on it.
Note that this doesn't prevent anyone from keeping them changes
locally and keep on hacking. The patch that will be reverted is the
following.
./A
Index: gcc.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gcc.c,v
retrieving revision 1.205.2.18
retrieving revision 1.205.2.19
diff -u -p -r1.205.2.18 -r1.205.2.19
--- gcc.c 2001年06月10日 00:30:43 1.205.2.18
+++ gcc.c 2001年08月02日 12:22:49 1.205.2.19
@@ -243,6 +243,7 @@ static void clear_failure_queue PARAMS (
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));
@@ -266,7 +267,6 @@ static void process_command PARAMS ((in
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 *));
@@ -3869,6 +3869,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. */
@@ -4012,6 +4069,8 @@ do_spec_1 (spec, inswitch, soft_matched_
argbuf_index--;
}
+ set_collect_gcc_options ();
+
if (argbuf_index > 0)
{
value = execute ();
@@ -5395,7 +5454,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;
{
@@ -5567,52 +5626,6 @@ main (argc, argv)
Decode switches that are handled locally. */
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. */
Index: gcc.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gcc.h,v
retrieving revision 1.3.6.2
retrieving revision 1.3.6.3
diff -u -p -r1.3.6.2 -r1.3.6.3
--- gcc.h 2001年05月18日 18:40:50 1.3.6.2
+++ gcc.h 2001年08月02日 12:22:50 1.3.6.3
@@ -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. */
Index: java/jvgenmain.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jvgenmain.c,v
retrieving revision 1.23.2.1
retrieving revision 1.23.2.2
diff -u -p -r1.23.2.1 -r1.23.2.2
--- jvgenmain.c 2001年07月04日 12:04:06 1.23.2.1
+++ jvgenmain.c 2001年08月02日 12:22:54 1.23.2.2
@@ -62,14 +62,14 @@ static void usage (const char *) ATTRIBU
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)
last_arg = i;
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);
Index: java/jvspec.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jvspec.c,v
retrieving revision 1.35.2.6
retrieving revision 1.35.2.7
diff -u -p -r1.35.2.6 -r1.35.2.7
--- jvspec.c 2001年07月13日 23:12:35 1.35.2.6
+++ jvspec.c 2001年08月02日 12:22:54 1.35.2.7
@@ -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}\
@@ -67,8 +67,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. */
@@ -528,8 +528,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)
{
More information about the Java
mailing list