gcc.c (struct prefix_list): Add forward declaration.

2004-05-23 Paolo Bonzini <bonzini@gnu.org>

	* gcc.c (struct prefix_list): Add forward declaration.
	(do_spec_path): New function, extracted from...
	(do_spec_1) <'D'>: ... here.  Drop support for
	SPACE_AFTER_L_OPTION.
	(do_spec_1) <'I'>: Use do_spec_path.
	(process_command): Do not store the 'include' suffix
	in include_prefixes.
	* system.h: Poison SPACE_AFTER_L_OPTION.

From-SVN: r82197
This commit is contained in:
Paolo Bonzini 2004-05-24 07:19:22 +00:00 committed by Paolo Bonzini
parent 8d4a2ff6c6
commit 76391e5a04
3 changed files with 136 additions and 117 deletions

View File

@ -1,3 +1,14 @@
2004-05-23 Paolo Bonzini <bonzini@gnu.org>
* gcc.c (struct prefix_list): Add forward declaration.
(do_spec_path): New function, extracted from...
(do_spec_1) <'D'>: ... here. Drop support for
SPACE_AFTER_L_OPTION.
(do_spec_1) <'I'>: Use do_spec_path.
(process_command): Do not store the 'include' suffix
in include_prefixes.
* system.h: Poison SPACE_AFTER_L_OPTION.
2002-05-23 Roger Sayle <roger@eyesopen.com>
* fold-const.c (non_lvalue): Explicitly list the tree codes that

240
gcc/gcc.c
View File

@ -290,6 +290,7 @@ static struct rusage rus, prus;
/* Forward declaration for prototypes. */
struct path_prefix;
struct prefix_list;
static void init_spec (void);
static void store_arg (const char *, int, int);
@ -323,6 +324,7 @@ static const char *eval_spec_function (const char *, const char *);
static const char *handle_spec_function (const char *);
static char *save_string (const char *, int);
static void set_collect_gcc_options (void);
static void do_spec_path (struct prefix_list *, const char *, int, int, int, const char *, const char *);
static int do_spec_1 (const char *, int, const char *);
static int do_spec_2 (const char *);
static void do_option_spec (const char *, const char *);
@ -3309,9 +3311,8 @@ process_command (int argc, const char **argv)
nstore[endp - startp] = 0;
add_prefix (&exec_prefixes, nstore, 0,
PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&include_prefixes,
concat (nstore, "include", NULL),
0, PREFIX_PRIORITY_LAST, 0, NULL, 0);
add_prefix (&include_prefixes, nstore, 0,
PREFIX_PRIORITY_LAST, 0, NULL, 0);
if (*endp == 0)
break;
endp = startp = endp + 1;
@ -3663,15 +3664,14 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
&& (IS_DIR_SEPARATOR (value[len - 1])))
{
if (len == 7)
add_prefix (&include_prefixes, "include", NULL,
add_prefix (&include_prefixes, "./", NULL,
PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
else
{
char * string = xmalloc (len + 1);
strncpy (string, value, len - 7);
strcpy (string + len - 7, "include");
add_prefix (&include_prefixes, string, NULL,
char *string = xmalloc (len - 6);
memcpy (string, value, len - 7);
string[len - 7] = 0;
add_prefix (&include_prefixes, string, NULL,
PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
}
}
@ -3680,8 +3680,8 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
add_prefix (&startfile_prefixes, value, NULL,
PREFIX_PRIORITY_B_OPT, 0, &warn_B, 0);
add_prefix (&include_prefixes, concat (value, "include", NULL),
NULL, PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
add_prefix (&include_prefixes, value, NULL,
PREFIX_PRIORITY_B_OPT, 0, NULL, 0);
n_switches++;
}
break;
@ -4394,6 +4394,107 @@ do_self_spec (const char *spec)
}
}
void
do_spec_path (struct prefix_list *pl, const char *option,
int omit_if_relative, int separate_options,
int only_subdir,
const char *dir_for_machine_suffix,
const char *dir_for_no_suffix)
{
static size_t bufsize = 0;
static char *buffer;
int idx;
/* Used on systems which record the specified -L dirs
and use them to search for dynamic linking. */
/* Relative directories always come from -B,
and it is better not to use them for searching
at run time. In particular, stage1 loses. */
if (omit_if_relative
&& !IS_ABSOLUTE_PATH (pl->prefix))
return;
/* Try subdirectory if there is one. */
if (machine_suffix && dir_for_machine_suffix)
{
if (strlen (pl->prefix) + strlen (machine_suffix)
>= bufsize)
bufsize = (strlen (pl->prefix)
+ strlen (machine_suffix)) * 2 + 1;
buffer = xrealloc (buffer, bufsize);
strcpy (buffer, pl->prefix);
strcat (buffer, machine_suffix);
if (is_directory (buffer, dir_for_machine_suffix, 1))
{
do_spec_1 (option, separate_options, NULL);
if (separate_options)
do_spec_1 (" ", 0, NULL);
do_spec_1 (buffer, 1, NULL);
do_spec_1 (dir_for_machine_suffix, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
if (!pl->require_machine_suffix && dir_for_no_suffix)
{
if (is_directory (pl->prefix, dir_for_no_suffix, 1))
{
do_spec_1 (option, separate_options, NULL);
if (separate_options)
do_spec_1 (" ", 0, NULL);
do_spec_1 (pl->prefix, 1, NULL);
do_spec_1 (dir_for_no_suffix, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
if (only_subdir)
return;
if (machine_suffix)
{
if (is_directory (pl->prefix, machine_suffix, 1))
{
do_spec_1 (option, separate_options, NULL);
if (separate_options)
do_spec_1 (" ", 0, NULL);
do_spec_1 (pl->prefix, 1, NULL);
/* Remove slash from machine_suffix. */
if (strlen (machine_suffix) >= bufsize)
bufsize = strlen (machine_suffix) * 2 + 1;
buffer = xrealloc (buffer, bufsize);
strcpy (buffer, machine_suffix);
idx = strlen (buffer);
if (IS_DIR_SEPARATOR (buffer[idx - 1]))
buffer[idx - 1] = 0;
do_spec_1 (buffer, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
if (!pl->require_machine_suffix)
{
if (is_directory (pl->prefix, "", 1))
{
do_spec_1 (option, separate_options, NULL);
if (separate_options)
do_spec_1 (" ", 0, NULL);
/* Remove slash from pl->prefix. */
if (strlen (pl->prefix) >= bufsize)
bufsize = strlen (pl->prefix) * 2 + 1;
buffer = xrealloc (buffer, bufsize);
strcpy (buffer, pl->prefix);
idx = strlen (buffer);
if (IS_DIR_SEPARATOR (buffer[idx - 1]))
buffer[idx - 1] = 0;
do_spec_1 (buffer, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
}
/* Process the sub-spec SPEC as a portion of a larger spec.
This is like processing a whole spec except that we do
not initialize at the beginning and we do not supply a
@ -4530,110 +4631,22 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
case 'D':
{
struct prefix_list *pl = startfile_prefixes.plist;
size_t bufsize = 100;
char *buffer = xmalloc (bufsize);
int idx;
for (; pl; pl = pl->next)
{
#ifdef RELATIVE_PREFIX_NOT_LINKDIR
/* Used on systems which record the specified -L dirs
and use them to search for dynamic linking. */
/* Relative directories always come from -B,
and it is better not to use them for searching
at run time. In particular, stage1 loses. */
if (!IS_ABSOLUTE_PATH (pl->prefix))
continue;
#endif
/* Try subdirectory if there is one. */
if (multilib_dir != NULL
|| (pl->os_multilib && multilib_os_dir != NULL))
{
const char *multi_dir;
const char *no_suffix_multilib_dir;
multi_dir = pl->os_multilib ? multilib_os_dir
: multilib_dir;
if (machine_suffix && multilib_dir)
{
if (strlen (pl->prefix) + strlen (machine_suffix)
>= bufsize)
bufsize = (strlen (pl->prefix)
+ strlen (machine_suffix)) * 2 + 1;
buffer = xrealloc (buffer, bufsize);
strcpy (buffer, pl->prefix);
strcat (buffer, machine_suffix);
if (is_directory (buffer, multilib_dir, 1))
{
do_spec_1 ("-L", 0, NULL);
#ifdef SPACE_AFTER_L_OPTION
do_spec_1 (" ", 0, NULL);
no_suffix_multilib_dir = pl->os_multilib ? multilib_os_dir
: multilib_dir;
/* Do not separate options, include non-multilibbed variant. */
do_spec_path (pl, "-L",
#ifdef RELATIVE_PREFIX_NOT_LINKDIR
1,
#else
0,
#endif
do_spec_1 (buffer, 1, NULL);
do_spec_1 (multilib_dir, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
if (!pl->require_machine_suffix)
{
if (is_directory (pl->prefix, multi_dir, 1))
{
do_spec_1 ("-L", 0, NULL);
#ifdef SPACE_AFTER_L_OPTION
do_spec_1 (" ", 0, NULL);
#endif
do_spec_1 (pl->prefix, 1, NULL);
do_spec_1 (multi_dir, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
}
if (machine_suffix)
{
if (is_directory (pl->prefix, machine_suffix, 1))
{
do_spec_1 ("-L", 0, NULL);
#ifdef SPACE_AFTER_L_OPTION
do_spec_1 (" ", 0, NULL);
#endif
do_spec_1 (pl->prefix, 1, NULL);
/* Remove slash from machine_suffix. */
if (strlen (machine_suffix) >= bufsize)
bufsize = strlen (machine_suffix) * 2 + 1;
buffer = xrealloc (buffer, bufsize);
strcpy (buffer, machine_suffix);
idx = strlen (buffer);
if (IS_DIR_SEPARATOR (buffer[idx - 1]))
buffer[idx - 1] = 0;
do_spec_1 (buffer, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
if (!pl->require_machine_suffix)
{
if (is_directory (pl->prefix, "", 1))
{
do_spec_1 ("-L", 0, NULL);
#ifdef SPACE_AFTER_L_OPTION
do_spec_1 (" ", 0, NULL);
#endif
/* Remove slash from pl->prefix. */
if (strlen (pl->prefix) >= bufsize)
bufsize = strlen (pl->prefix) * 2 + 1;
buffer = xrealloc (buffer, bufsize);
strcpy (buffer, pl->prefix);
idx = strlen (buffer);
if (IS_DIR_SEPARATOR (buffer[idx - 1]))
buffer[idx - 1] = 0;
do_spec_1 (buffer, 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
}
}
0, 0, multilib_dir, no_suffix_multilib_dir);
}
free (buffer);
}
break;
@ -4885,13 +4898,8 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
}
for (; pl; pl = pl->next)
{
do_spec_1 ("-isystem", 1, NULL);
/* Make this a separate argument. */
do_spec_1 (" ", 0, NULL);
do_spec_1 (pl->prefix, 1, NULL);
do_spec_1 (" ", 0, NULL);
}
/* Separate options, don't include non-suffixed variant. */
do_spec_path (pl, "-isystem", 0, 1, 1, "include", "include");
}
break;

View File

@ -643,7 +643,7 @@ typedef char _Bool;
TRADITIONAL_PIPELINE_INTERFACE DFA_PIPELINE_INTERFACE \
DBX_OUTPUT_STANDARD_TYPES BUILTIN_SETJMP_FRAME_VALUE \
SUNOS4_SHARED_LIBRARIES PROMOTE_FOR_CALL_ONLY \
NO_RECURSIVE_FUNCTION_CSE
SPACE_AFTER_L_OPTION NO_RECURSIVE_FUNCTION_CSE
/* Hooks that are no longer used. */
#pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \