gengtype.c (write_field_root): New function.
gcc/ * gengtype.c (write_field_root): New function. (write_root): Use it. From-SVN: r161937
This commit is contained in:
parent
1b13783702
commit
647565f6b8
@ -1,3 +1,8 @@
|
|||||||
|
2010-07-07 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
|
* gengtype.c (write_field_root): New function.
|
||||||
|
(write_root): Use it.
|
||||||
|
|
||||||
2010-07-07 Wei Guozhi <carrot@google.com>
|
2010-07-07 Wei Guozhi <carrot@google.com>
|
||||||
|
|
||||||
* config/arm/thumb2.md (peephole2 to convert zero_extract/compare
|
* config/arm/thumb2.md (peephole2 to convert zero_extract/compare
|
||||||
|
@ -3174,6 +3174,37 @@ finish_root_table (struct flist *flp, const char *pfx, const char *lastname,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A subroutine of write_root for writing the roots for field FIELD_NAME,
|
||||||
|
which has type FIELD_TYPE. Parameters F to EMIT_PCH are the parameters
|
||||||
|
of the caller. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
write_field_root (outf_p f, pair_p v, type_p type, const char *name,
|
||||||
|
int has_length, struct fileloc *line, const char *if_marked,
|
||||||
|
bool emit_pch, type_p field_type, const char *field_name)
|
||||||
|
{
|
||||||
|
/* If the field reference is relative to V, rather than to some
|
||||||
|
subcomponent of V, we can mark any subarrays with a single stride.
|
||||||
|
We're effectively treating the field as a global variable in its
|
||||||
|
own right. */
|
||||||
|
if (type == v->type)
|
||||||
|
{
|
||||||
|
struct pair newv;
|
||||||
|
|
||||||
|
newv = *v;
|
||||||
|
newv.type = field_type;
|
||||||
|
newv.name = ACONCAT ((v->name, ".", field_name, NULL));
|
||||||
|
v = &newv;
|
||||||
|
}
|
||||||
|
/* Otherwise, any arrays nested in the structure are too complex to
|
||||||
|
handle. */
|
||||||
|
else if (field_type->kind == TYPE_ARRAY)
|
||||||
|
error_at_line (line, "nested array `%s.%s' is too complex to be a root",
|
||||||
|
name, field_name);
|
||||||
|
write_root (f, v, field_type, ACONCAT ((name, ".", field_name, NULL)),
|
||||||
|
has_length, line, if_marked, emit_pch);
|
||||||
|
}
|
||||||
|
|
||||||
/* Write out to F the table entry and any marker routines needed to
|
/* Write out to F the table entry and any marker routines needed to
|
||||||
mark NAME as TYPE. The original variable is V, at LINE.
|
mark NAME as TYPE. The original variable is V, at LINE.
|
||||||
HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
|
HAS_LENGTH is nonzero iff V was a variable-length array. IF_MARKED
|
||||||
@ -3232,27 +3263,18 @@ write_root (outf_p f, pair_p v, type_p type, const char *name, int has_length,
|
|||||||
validf = ufld;
|
validf = ufld;
|
||||||
}
|
}
|
||||||
if (validf != NULL)
|
if (validf != NULL)
|
||||||
{
|
write_field_root (f, v, type, name, 0, line, if_marked,
|
||||||
char *newname;
|
emit_pch, validf->type,
|
||||||
newname = xasprintf ("%s.%s.%s",
|
ACONCAT ((fld->name, ".",
|
||||||
name, fld->name, validf->name);
|
validf->name, NULL)));
|
||||||
write_root (f, v, validf->type, newname, 0, line,
|
|
||||||
if_marked, emit_pch);
|
|
||||||
free (newname);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (desc)
|
else if (desc)
|
||||||
error_at_line (line,
|
error_at_line (line,
|
||||||
"global `%s.%s' has `desc' option but is not union",
|
"global `%s.%s' has `desc' option but is not union",
|
||||||
name, fld->name);
|
name, fld->name);
|
||||||
else
|
else
|
||||||
{
|
write_field_root (f, v, type, name, 0, line, if_marked,
|
||||||
char *newname;
|
emit_pch, fld->type, fld->name);
|
||||||
newname = xasprintf ("%s.%s", name, fld->name);
|
|
||||||
write_root (f, v, fld->type, newname, 0, line, if_marked,
|
|
||||||
emit_pch);
|
|
||||||
free (newname);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user