aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@cygnus.com>2000-03-14 18:08:35 +0000
committerNick Clifton <nickc@gcc.gnu.org>2000-03-14 18:08:35 +0000
commit3ac63d94884330d66adb4448f557bf06460b4293 (patch)
treef5aa3882a6b4e6949b62f409484862b9f208fd92
parentc487e4846704a9f954636159e05437711c4c2bf4 (diff)
downloadgcc-3ac63d94884330d66adb4448f557bf06460b4293.zip
gcc-3ac63d94884330d66adb4448f557bf06460b4293.tar.gz
gcc-3ac63d94884330d66adb4448f557bf06460b4293.tar.bz2
Fix spec string parsing bugs
From-SVN: r32535
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gcc.c80
2 files changed, 53 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9344b19..376206f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2000-03-14 Nick Clifton <nickc@cygnus.com>
+
+ * gcc.c (do_spec_1): Catch the case where %* is used in a
+ substitution pattern, but it has not been initialised.
+ Issue a meaningful error message if an unrecognised operator
+ is encountered in a spec string.
+
2000-03-14 Richard Earnshaw <rearnsha@arm.com>
* function.c (prepare_function_start): Correctly initialize
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 1e1b154..14499cf 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -522,7 +522,8 @@ static char *multilib_exclusions;
static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS;
-struct user_specs {
+struct user_specs
+{
struct user_specs *next;
const char *filename;
};
@@ -1123,8 +1124,9 @@ struct spec_list
#define INIT_STATIC_SPEC(NAME,PTR) \
{ NAME, NULL_PTR, PTR, (struct spec_list *)0, sizeof (NAME)-1, 0 }
-/* List of statically defined specs */
-static struct spec_list static_specs[] = {
+/* List of statically defined specs. */
+static struct spec_list static_specs[] =
+{
INIT_STATIC_SPEC ("asm", &asm_spec),
INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
INIT_STATIC_SPEC ("cpp", &cpp_spec),
@@ -1150,7 +1152,7 @@ static struct spec_list static_specs[] = {
#ifdef EXTRA_SPECS /* additional specs needed */
/* Structure to keep track of just the first two args of a spec_list.
- That is all that the EXTRA_SPECS macro gives us. */
+ That is all that the EXTRA_SPECS macro gives us. */
struct spec_list_1
{
char *name;
@@ -1176,7 +1178,7 @@ init_spec ()
int i;
if (specs)
- return; /* already initialized */
+ return; /* Already initialized. */
if (verbose_flag)
notice ("Using builtin specs.\n");
@@ -1223,7 +1225,7 @@ set_spec (name, spec)
int name_len = strlen (name);
int i;
- /* If this is the first call, initialize the statically allocated specs */
+ /* If this is the first call, initialize the statically allocated specs. */
if (!specs)
{
struct spec_list *next = (struct spec_list *)0;
@@ -1237,14 +1239,14 @@ set_spec (name, spec)
specs = sl;
}
- /* See if the spec already exists */
+ /* See if the spec already exists. */
for (sl = specs; sl; sl = sl->next)
if (name_len == sl->name_len && !strcmp (sl->name, name))
break;
if (!sl)
{
- /* Not found - make it */
+ /* Not found - make it. */
sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
sl->name = xstrdup (name);
sl->name_len = name_len;
@@ -1265,7 +1267,7 @@ set_spec (name, spec)
notice ("Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
#endif
- /* Free the old spec */
+ /* Free the old spec. */
if (old_spec && sl->alloc_p)
free (old_spec);
@@ -2153,7 +2155,7 @@ make_relative_prefix (progname, bin_prefix, prefix)
prefix_dirs = split_directories (prefix, &prefix_num);
- /* Find how many directories are in common between bin_prefix & prefix */
+ /* Find how many directories are in common between bin_prefix & prefix. */
n = (prefix_num < bin_num) ? prefix_num : bin_num;
for (common = 0; common < n; common++)
{
@@ -2454,7 +2456,7 @@ execute ()
struct command
{
const char *prog; /* program name. */
- char **argv; /* vector of args. */
+ char **argv; /* vector of args. */
int pid; /* pid of process for this command. */
};
@@ -3844,7 +3846,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
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 */
+ at run time. In particular, stage1 loses. */
if (!IS_DIR_SEPARATOR (pl->prefix[0]))
continue;
#endif
@@ -4266,7 +4268,8 @@ do_spec_1 (spec, inswitch, soft_matched_part)
char *y;
/* Copy all of CPP_PREDEFINES into BUF,
- but force them all into the reserved name space if they aren't already there. The reserved name space is all
+ but force them all into the reserved name space if they
+ aren't already there. The reserved name space is all
identifiers beginning with two underscores or with one
underscore and a capital letter. We do the forcing by
adding up to two underscores to the beginning and end
@@ -4359,7 +4362,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
else if (*y == ' ' || *y == '\t')
/* Copy whitespace to the result. */
*x++ = *y++;
- /* Don't copy -A options */
+ /* Don't copy -A options. */
else
y++;
}
@@ -4408,8 +4411,16 @@ do_spec_1 (spec, inswitch, soft_matched_part)
break;
case '*':
- do_spec_1 (soft_matched_part, 1, NULL_PTR);
- do_spec_1 (" ", 0, NULL_PTR);
+ if (soft_matched_part)
+ {
+ do_spec_1 (soft_matched_part, 1, NULL_PTR);
+ do_spec_1 (" ", 0, NULL_PTR);
+ }
+ else
+ /* Catch the case where a spec string contains something like
+ '%{foo:%*}'. ie there is no * in the pattern on the left
+ hand side of the :. */
+ error ("Spec failure: '%%*' has not been initialised by pattern match");
break;
/* Process a string found as the value of a spec given by name.
@@ -4430,7 +4441,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
while (*p && *p != ')' && *p != ']')
p++;
- /* See if it's in the list */
+ /* See if it's in the list. */
for (len = p - name, sl = specs; sl; sl = sl->next)
if (sl->name_len == len && !strncmp (sl->name, name, len))
{
@@ -4458,7 +4469,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
int flag = 0;
/* Copy all of NAME into BUF, but put __ after
- every -D and at the end of each arg, */
+ every -D and at the end of each arg. */
while (1)
{
if (! strncmp (y, "-D", 2))
@@ -4560,7 +4571,8 @@ do_spec_1 (spec, inswitch, soft_matched_part)
break;
default:
- abort ();
+ error ("Spec failure: Unrecognised spec option '%c'", c);
+ break;
}
break;
@@ -5203,7 +5215,7 @@ main (argc, argv)
init_spec ();
/* We need to check standard_exec_prefix/just_machine_suffix/specs
- for any override of as, ld and libraries. */
+ for any override of as, ld and libraries. */
specs_file = (char *) alloca (strlen (standard_exec_prefix)
+ strlen (just_machine_suffix)
+ sizeof ("specs"));
@@ -5556,7 +5568,7 @@ lookup_compiler (name, length, language)
{
struct compiler *cp;
- /* If this was specified by the user to be a linker input, indicate that. */
+ /* If this was specified by the user to be a linker input, indicate that. */
if (language != 0 && language[0] == '*')
return 0;
@@ -5756,7 +5768,7 @@ validate_all_switches ()
}
}
- /* look through the linked list of specs read from the specs file */
+ /* Look through the linked list of specs read from the specs file. */
for (spec = specs; spec ; spec = spec->next)
{
p = *(spec->ptr_spec);
@@ -5827,7 +5839,8 @@ used_arg (p, len)
const char *p;
int len;
{
- struct mswitchstr {
+ struct mswitchstr
+ {
char *str;
char *replace;
int len;
@@ -5845,7 +5858,7 @@ used_arg (p, len)
int cnt = 0;
/* Break multilib_matches into the component strings of string and replacement
- string */
+ string. */
for (q = multilib_matches; *q != '\0'; q++)
if (*q == ';')
cnt++;
@@ -5953,7 +5966,7 @@ static void
set_multilib_dir ()
{
char *p;
- int this_path_len;
+ unsigned int this_path_len;
char *this_path, *this_arg;
int not_arg;
int ok;
@@ -6006,9 +6019,7 @@ set_multilib_dir ()
}
if (ok)
- {
- return;
- }
+ return;
++p;
}
@@ -6114,7 +6125,7 @@ print_multilib_info ()
char *p = multilib_select;
char *last_path = 0, *this_path;
int skip;
- int last_path_len = 0;
+ unsigned int last_path_len = 0;
while (*p != '\0')
{
@@ -6194,8 +6205,8 @@ print_multilib_info ()
++q;
}
- if (! strncmp(arg, this_arg, (len < q - arg) ? q - arg : len) ||
- default_arg(this_arg, e - this_arg))
+ if (! strncmp (arg, this_arg, (len < q - arg) ? q - arg : len) ||
+ default_arg (this_arg, e - this_arg))
{
mp = 1;
break;
@@ -6203,7 +6214,6 @@ print_multilib_info ()
if (*q == ' ')
++q;
-
}
if (! mp)
@@ -6212,6 +6222,7 @@ print_multilib_info ()
if (*e == ' ')
++e;
}
+
if (m)
{
skip = 1;
@@ -6226,7 +6237,7 @@ print_multilib_info ()
if (! skip)
{
/* If this is a duplicate, skip it. */
- skip = (last_path != 0 && p - this_path == last_path_len
+ skip = (last_path != 0 && (unsigned int)(p - this_path) == last_path_len
&& ! strncmp (last_path, this_path, last_path_len));
last_path = this_path;
@@ -6315,7 +6326,7 @@ print_multilib_info ()
if (! skip)
{
- /* If there are extra options, print them now */
+ /* If there are extra options, print them now. */
if (multilib_extra && *multilib_extra)
{
int print_at = TRUE;
@@ -6334,6 +6345,7 @@ print_multilib_info ()
}
}
}
+
putchar ('\n');
}