gengtype.h (struct type): Replace 'sc' with boolean, scalar_is_char.

* gengtype.h (struct type): Replace 'sc' with boolean, scalar_is_char.
	(string_type): Don't declare.
	(do_scalar_typedef): Declare.
	(create_scalar_type): Update prototype.
	* gengtype.c (string_type): Make static.
	(scalar_nonchar, scalar_char): New.
	(do_scalar_typedef): Export.  Always use scalar_nonchar for the type.
	(resolve_typedef): Use scalar_nonchar for error recovery.
	(create_scalar_type): Remove name_len field.  Return scalar_char
	or scalar_nonchar as appropriate.
	(adjust_field_type): Look at scalar_is_char boolean to decide whether
	to use string_type.
	(throughout): Use scalar_nonchar instead of calling create_scalar_type,
	whenever possible.
	(main): Initialize scalar_char and scalar_nonchar before calling
	gen_rtx_next.
	* gengtype-lex.l: Adjust for removal of second argument to
	create_scalar_type.  Use yylval.s instead of yylval.t when
	returning SCALAR.
	* gengtype-yacc.y: Type of SCALAR is string.  Call
	create_scalar_type from type:SCALAR rule.  Adjust for removal of
	second argument to create_scalar_type.

From-SVN: r123231
This commit is contained in:
Zack Weinberg 2007-03-26 20:55:10 +00:00 committed by Zack Weinberg
parent 4a399aef3a
commit 95161faf6d
5 changed files with 73 additions and 46 deletions

View File

@ -1,5 +1,28 @@
2007-03-26 Zack Weinberg <zackw@panix.com>
* gengtype.h (struct type): Replace 'sc' with boolean, scalar_is_char.
(string_type): Don't declare.
(do_scalar_typedef): Declare.
(create_scalar_type): Update prototype.
* gengtype.c (string_type): Make static.
(scalar_nonchar, scalar_char): New.
(do_scalar_typedef): Export. Always use scalar_nonchar for the type.
(resolve_typedef): Use scalar_nonchar for error recovery.
(create_scalar_type): Remove name_len field. Return scalar_char
or scalar_nonchar as appropriate.
(adjust_field_type): Look at scalar_is_char boolean to decide whether
to use string_type.
(throughout): Use scalar_nonchar instead of calling create_scalar_type,
whenever possible.
(main): Initialize scalar_char and scalar_nonchar before calling
gen_rtx_next.
* gengtype-lex.l: Adjust for removal of second argument to
create_scalar_type. Use yylval.s instead of yylval.t when
returning SCALAR.
* gengtype-yacc.y: Type of SCALAR is string. Call
create_scalar_type from type:SCALAR rule. Adjust for removal of
second argument to create_scalar_type.
* vec.h: Remove all #if IN_GENGTYPE blocks.
Add comment saying that changes may require adjustments to gengtype.
* gengtype.c: Don't include coretypes.h or tm.h.

View File

@ -95,7 +95,6 @@ ITYPE {IWORD}({WS}{IWORD})*
char *namestart;
size_t namelen;
struct type *t;
char *typestart;
size_t typelen;
@ -112,9 +111,10 @@ ITYPE {IWORD}({WS}{IWORD})*
ISSPACE (typestart[typelen-1]);
typelen--)
;
typestart[typelen] = '\0';
t = create_scalar_type (typestart, typelen);
do_typedef ((const char *) xmemdup (namestart, namelen, namelen+1), t,
do_typedef ((const char *) xmemdup (namestart, namelen, namelen+1),
create_scalar_type (typestart),
&lexer_line);
update_lineno (yytext, yyleng);
}
@ -122,7 +122,6 @@ ITYPE {IWORD}({WS}{IWORD})*
[^[:alnum:]_]typedef{WS}{ID}{WS}{ID}{WS}"(" {
char *namestart;
size_t namelen;
struct type *t;
for (namestart = yytext + yyleng - 2; ISSPACE (*namestart); namestart--)
;
@ -130,16 +129,14 @@ ITYPE {IWORD}({WS}{IWORD})*
;
namestart -= namelen - 1;
t = create_scalar_type ("function type", sizeof ("function type")-1);
do_typedef ((const char *) xmemdup (namestart, namelen, namelen+1), t,
&lexer_line);
do_scalar_typedef ((const char *) xmemdup (namestart, namelen, namelen+1),
&lexer_line);
update_lineno (yytext, yyleng);
}
[^[:alnum:]_]typedef{WS}{ID}{WS}?"*"?{WS}?"("{WS}?"*"{WS}?{ID}{WS}?")"{WS}?"(" {
char *namestart;
size_t namelen;
struct type *t;
for (namestart = yytext + yyleng - 2; !ISIDNUM (*namestart); namestart--)
;
@ -147,9 +144,8 @@ ITYPE {IWORD}({WS}{IWORD})*
;
namestart -= namelen - 1;
t = create_scalar_type ("function type", sizeof ("function type")-1);
do_typedef ((const char *) xmemdup (namestart, namelen, namelen+1), t,
&lexer_line);
do_scalar_typedef ((const char *) xmemdup (namestart, namelen, namelen+1),
&lexer_line);
update_lineno (yytext, yyleng);
}
@ -270,7 +266,7 @@ ITYPE {IWORD}({WS}{IWORD})*
for (len = yyleng; ISSPACE (yytext[len-1]); len--)
;
yylval.t = create_scalar_type (yytext, len);
yylval.s = (const char *) xmemdup (yytext, len, len+1);
update_lineno (yytext, yyleng);
return SCALAR;
}

View File

@ -47,7 +47,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
%token NESTED_PTR
%token <s>PARAM_IS
%token NUM
%token <t>SCALAR
%token <s>SCALAR
%token <s>ID
%token <s>STRING
%token <s>ARRAY
@ -158,7 +158,7 @@ bitfieldlen: NUM | ID
;
type: SCALAR
{ $$ = $1; }
{ $$ = create_scalar_type ($1); }
| ID
{ $$ = resolve_typedef ($1, &lexer_line); }
| VEC_TOKEN '(' ID ',' ID ')'
@ -175,9 +175,9 @@ type: SCALAR
| UNION ID
{ $$ = find_structure ($2, 1); }
| ENUM ID
{ $$ = create_scalar_type ($2, strlen ($2)); }
{ $$ = create_scalar_type ($2); }
| ENUM ID '{' enum_items '}'
{ $$ = create_scalar_type ($2, strlen ($2)); }
{ $$ = create_scalar_type ($2); }
;
enum_items: /* empty */

View File

@ -78,8 +78,18 @@ xasprintf (const char *format, ...)
/* The one and only TYPE_STRING. */
struct type string_type = {
TYPE_STRING, NULL, NULL, GC_USED, {0}
static struct type string_type = {
TYPE_STRING, 0, 0, GC_USED, {0}
};
/* The two and only TYPE_SCALARs. Their u.scalar_is_char flags are
set to appropriate values at the beginning of main. */
static struct type scalar_nonchar = {
TYPE_SCALAR, 0, 0, GC_USED, {0}
};
static struct type scalar_char = {
TYPE_SCALAR, 0, 0, GC_USED, {0}
};
/* Lists of various things. */
@ -89,7 +99,6 @@ static type_p structures;
static type_p param_structs;
static pair_p variables;
static void do_scalar_typedef (const char *, struct fileloc *);
static type_p find_param_structure
(type_p t, type_p param[NUM_PARAM]);
static type_p adjust_field_tree_exp (type_p t, options_p opt);
@ -121,12 +130,14 @@ do_typedef (const char *s, type_p t, struct fileloc *pos)
typedefs = p;
}
/* Define S as a typename of a scalar. */
/* Define S as a typename of a scalar. Cannot be used to define
typedefs of 'char'. Note: is also used for pointer-to-function
typedefs (which are therefore not treated as pointers). */
static void
void
do_scalar_typedef (const char *s, struct fileloc *pos)
{
do_typedef (s, create_scalar_type (s, strlen (s)), pos);
do_typedef (s, &scalar_nonchar, pos);
}
/* Return the type previously defined for S. Use POS to report errors. */
@ -139,7 +150,7 @@ resolve_typedef (const char *s, struct fileloc *pos)
if (strcmp (p->name, s) == 0)
return p->type;
error_at_line (pos, "unidentified type `%s'", s);
return create_scalar_type ("char", 4);
return &scalar_nonchar; /* treat as "int" */
}
/* Create and return a new structure with tag NAME (or a union iff
@ -269,12 +280,12 @@ find_param_structure (type_p t, type_p param[NUM_PARAM])
/* Return a scalar type with name NAME. */
type_p
create_scalar_type (const char *name, size_t name_len)
create_scalar_type (const char *name)
{
type_p r = XCNEW (struct type);
r->kind = TYPE_SCALAR;
r->u.sc = (char *) xmemdup (name, name_len, name_len + 1);
return r;
if (!strcmp (name, "char") || !strcmp (name, "unsigned char"))
return &scalar_char;
else
return &scalar_nonchar;
}
/* Return a pointer to T. */
@ -499,7 +510,7 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
bitmap_tp = create_pointer (find_structure ("bitmap_element_def", 0));
basic_block_tp = create_pointer (find_structure ("basic_block_def", 0));
constant_tp = create_pointer (find_structure ("constant_descriptor_rtx", 0));
scalar_tp = create_scalar_type ("rtunion scalar", 14);
scalar_tp = &scalar_nonchar; /* rtunion int */
{
pair_p note_flds = NULL;
@ -796,13 +807,11 @@ adjust_field_type (type_p t, options_p opt)
if (! length_p
&& pointer_p
&& t->u.p->kind == TYPE_SCALAR
&& (strcmp (t->u.p->u.sc, "char") == 0
|| strcmp (t->u.p->u.sc, "unsigned char") == 0))
&& t->u.p->u.scalar_is_char)
return &string_type;
if (t->kind == TYPE_ARRAY && t->u.a.p->kind == TYPE_POINTER
&& t->u.a.p->u.p->kind == TYPE_SCALAR
&& (strcmp (t->u.a.p->u.p->u.sc, "char") == 0
|| strcmp (t->u.a.p->u.p->u.sc, "unsigned char") == 0))
&& t->u.a.p->u.p->u.scalar_is_char)
return create_array (&string_type, t->u.a.len);
return t;
@ -3015,7 +3024,7 @@ note_def_vec (const char *typename, bool is_scalar, struct fileloc *pos)
if (is_scalar)
{
t = create_scalar_type (typename, strlen (typename));
t = create_scalar_type (typename);
o = 0;
}
else
@ -3034,7 +3043,7 @@ note_def_vec (const char *typename, bool is_scalar, struct fileloc *pos)
fields = f;
f = XNEW (struct pair);
f->type = adjust_field_type (create_scalar_type ("unsigned", 8), 0);
f->type = adjust_field_type (create_scalar_type ("unsigned"), 0);
f->name = "alloc";
f->opt = 0;
f->line = *pos;
@ -3042,7 +3051,7 @@ note_def_vec (const char *typename, bool is_scalar, struct fileloc *pos)
fields = f;
f = XNEW (struct pair);
f->type = adjust_field_type (create_scalar_type ("unsigned", 8), 0);
f->type = adjust_field_type (create_scalar_type ("unsigned"), 0);
f->name = "num";
f->opt = 0;
f->line = *pos;
@ -3083,10 +3092,13 @@ main (int ARG_UNUSED (argc), char ** ARG_UNUSED (argv))
static struct fileloc pos = { __FILE__, __LINE__ };
unsigned j;
gen_rtx_next ();
srcdir_len = strlen (srcdir);
scalar_char.u.scalar_is_char = true;
scalar_nonchar.u.scalar_is_char = false;
gen_rtx_next ();
do_scalar_typedef ("CUMULATIVE_ARGS", &pos);
do_scalar_typedef ("REAL_VALUE_TYPE", &pos);
do_scalar_typedef ("double_int", &pos);
@ -3101,9 +3113,7 @@ main (int ARG_UNUSED (argc), char ** ARG_UNUSED (argv))
do_typedef ("PTR", create_pointer (resolve_typedef ("void", &pos)), &pos);
do_typedef ("HARD_REG_SET", create_array (
create_scalar_type ("unsigned long", strlen ("unsigned long")),
"2"), &pos);
do_typedef ("HARD_REG_SET", create_array (&scalar_nonchar, "2"), &pos);
for (i = 0; i < NUM_GT_FILES; i++)
{

View File

@ -90,7 +90,7 @@ struct type {
lang_bitmap bitmap;
type_p lang_struct;
} s;
char *sc;
bool scalar_is_char;
struct {
type_p p;
const char *len;
@ -112,9 +112,6 @@ struct type {
|| (x)->kind == TYPE_STRUCT \
|| (x)->kind == TYPE_LANG_STRUCT)
/* The one and only TYPE_STRING. */
extern struct type string_type;
/* Variables used to communicate between the lexer and the parser. */
extern int lexer_toplevel_done;
extern struct fileloc lexer_line;
@ -132,12 +129,13 @@ extern char * xasprintf (const char *, ...)
/* Constructor routines for types. */
extern void do_typedef (const char *s, type_p t, struct fileloc *pos);
extern void do_scalar_typedef (const char *s, struct fileloc *pos);
extern type_p resolve_typedef (const char *s, struct fileloc *pos);
extern type_p new_structure (const char *name, int isunion,
struct fileloc *pos, pair_p fields,
options_p o);
extern type_p find_structure (const char *s, int isunion);
extern type_p create_scalar_type (const char *name, size_t name_len);
extern type_p create_scalar_type (const char *name);
extern type_p create_pointer (type_p t);
extern type_p create_array (type_p t, const char *len);
extern options_p create_option (options_p, const char *name, const void *info);