This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

3.0.1 PATCH: Allow jvgenmain to work with ASM_FINAL_SPEC (version 2)


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)
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]