This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
3.0.1 PATCH: Allow jvgenmain to work with ASM_FINAL_SPEC (version 2)
- To: java-patches at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Subject: 3.0.1 PATCH: Allow jvgenmain to work with ASM_FINAL_SPEC (version 2)
- From: Rainer Orth <ro at TechFak dot Uni-Bielefeld dot DE>
- Date: Fri, 27 Jul 2001 19:40:55 +0200 (MEST)
This is an updated version of
http://gcc.gnu.org/ml/java-patches/2001-q3/msg00127.html
which restores gcj -save-temps --main=<main class name> to working
condition.
While changing jvgenmain, I noticed that this file uses a wrong definition
for main, like several others: the components of argv[] are supposed to be
writable, and main *must* be declared as
int main (int, char **);
(or int main (void)) according to ISO C 99. Is there any reason to deviate
from this, here and in a couple of other places?
Together with
http://gcc.gnu.org/ml/java-patches/2001-q3/msg00128.html
(still unreviewed, too), I was able to successfully bootstrap gcc 3.0.1
20010719 on alpha-dec-osf4.0f and alpha-dec-osf5.1 with --enable-libgcj and
get reasonable libjava testsuite results (identical on Tru64 UNIX V4.0F and
V5.1):
=== libjava Summary ===
# of expected passes 1595
# of unexpected failures 9
# of unexpected successes 10
# of expected failures 14
# of untested testcases 88
Ok for branch and mainline?
Rainer
-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University
Email: ro@TechFak.Uni-Bielefeld.DE
Thu Jul 26 18:25:18 2001 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* gcc.c (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.
java:
* 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.
Index: gcc/gcc.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gcc.c,v
retrieving revision 1.205.2.18
diff -u -p -r1.205.2.18 gcc.c
--- gcc.c 2001/06/10 00:30:43 1.205.2.18
+++ gcc.c 2001/07/27 16:09:01
@@ -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 *));
@@ -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;
{
Index: gcc/gcc.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gcc.h,v
retrieving revision 1.3.6.2
diff -u -p -r1.3.6.2 gcc.h
--- gcc.h 2001/05/18 18:40:50 1.3.6.2
+++ gcc.h 2001/07/27 16:09:01
@@ -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: gcc/config/alpha/osf.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/alpha/osf.h,v
retrieving revision 1.15.4.4
diff -u -p -r1.15.4.4 osf.h
--- osf.h 2001/07/19 18:01:30 1.15.4.4
+++ osf.h 2001/07/27 16:09:03
@@ -118,7 +118,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 "\
@@ -127,7 +127,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
Index: gcc/java/jvgenmain.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jvgenmain.c,v
retrieving revision 1.23.2.1
diff -u -p -r1.23.2.1 jvgenmain.c
--- jvgenmain.c 2001/07/04 12:04:06 1.23.2.1
+++ jvgenmain.c 2001/07/27 16:09:09
@@ -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: gcc/java/jvspec.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jvspec.c,v
retrieving revision 1.35.2.6
diff -u -p -r1.35.2.6 jvspec.c
--- jvspec.c 2001/07/13 23:12:35 1.35.2.6
+++ jvspec.c 2001/07/27 16:09:10
@@ -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)
{