Commit 647565f6 by Richard Sandiford Committed by Richard Sandiford

gengtype.c (write_field_root): New function.

gcc/
	* gengtype.c (write_field_root): New function.
	(write_root): Use it.

From-SVN: r161937
parent 1b137837
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, ...@@ -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, ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment