re PR other/3968 (COLLECT_GCC_OPTIONS empty)

* gcc.c (set_collect_gcc_options): New function, split out from
	main.
	Ignore elided switches.
	(do_spec): Invoke before executing command.
	(do_spec_1): Likewise.
	Fixes PR other/3968.

	* gcc.c (set_input): Export.
	Move declaration ...
	gcc.h (set_input): ... here.

	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.

From-SVN: r47385
This commit is contained in:
Rainer Orth 2001-11-27 17:31:38 +00:00 committed by Rainer Orth
parent ae08d4c0e9
commit b856c15d7e
5 changed files with 111 additions and 57 deletions

View File

@ -1,3 +1,18 @@
2001-11-27 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* gcc.c (set_input): Export.
Move declaration ...
gcc.h (set_input): ... here.
2001-11-27 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* gcc.c (set_collect_gcc_options): New function, split out from
main.
Ignore elided switches.
(do_spec): Invoke before executing command.
(do_spec_1): Likewise.
Fixes PR other/3968.
2001-11-27 Hans-Peter Nilsson <hp@axis.com>
* config/cris/cris.h (INT_ASM_OP): Remove.

111
gcc/gcc.c
View File

@ -286,6 +286,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));
@ -309,7 +310,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 *));
#ifdef ENABLE_SHARED_LIBGCC
static void init_gcc_specs PARAMS ((struct obstack *,
const char *,
@ -3985,6 +3985,63 @@ process_command (argc, argv)
switches[n_switches].part1 = 0;
infiles[n_infiles].name = 0;
}
/* Store switches not filtered out by %{<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. */
@ -4058,6 +4115,8 @@ do_spec (spec)
if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
argbuf_index--;
set_collect_gcc_options ();
if (argbuf_index > 0)
value = execute ();
}
@ -4128,6 +4187,8 @@ do_spec_1 (spec, inswitch, soft_matched_part)
argbuf_index--;
}
set_collect_gcc_options ();
if (argbuf_index > 0)
{
value = execute ();
@ -5506,7 +5567,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;
{
@ -5668,52 +5729,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. */

View File

@ -1,3 +1,14 @@
2001-11-27 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-11-18 Roger Sayle <roger@eyesopen.com>
* parse.h (java_expand_switch): Remove old prototype.

View File

@ -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);

View File

@ -54,8 +54,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}\
@ -71,8 +71,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:%g.s}} |\n\
%{!S:as %a %Y -o %d%w%u%O %{!pipe:%g.s} %A\n }";
/* Return full path name of spec file if it is in DIR, or NULL if
not. */
@ -571,8 +571,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)
{