Commit 065ae611 by Zack Weinberg Committed by Zack Weinberg

gengtype.h: Remove all type definitions to gengtype.c...

	* gengtype.h: Remove all type definitions to gengtype.c; leave
	only definitions of options_p, type_p, and pair_p as opaque
	pointers.  Update prototypes.
	* gengtype.c: Many type definitions moved here from gengtype.h.
	Consolidate type definitions at the top of the file.
	(xvasprintf): Delete.
	(xasprintf): Make static.
	(create_nested_pointer_option): Add 'next' parameter.
	(create_field_all, create_field_at): New functions.
	(create_field): Now a thin wrapper around create_field_all.
	(create_optional_field): Rename create_optional_field_ and add
	line argument.  Original name is now a macro which supplies
	__LINE__.
	(oprintf): Use vsnprintf directly.
	(close_output_files): Use fatal rather than perror/exit.
	(note_def_vec, note_def_vec_alloc): Use create_field_at.
	(main): Set progname.  Don't use exit.
	* gengtype-yacc.y (struct_fields): Use create_field_at.
	(option, optionseqopt): Delete.
	(optionseq): Consolidate productions from option here so we
	can use the first argument to create_option.

From-SVN: r123233
parent 17defa6a
2007-03-26 Zack Weinberg <zackw@panix.com>
* gengtype.h: Remove all type definitions to gengtype.c; leave
only definitions of options_p, type_p, and pair_p as opaque
pointers. Update prototypes.
* gengtype.c: Many type definitions moved here from gengtype.h.
Consolidate type definitions at the top of the file.
(xvasprintf): Delete.
(xasprintf): Make static.
(create_nested_pointer_option): Add 'next' parameter.
(create_field_all, create_field_at): New functions.
(create_field): Now a thin wrapper around create_field_all.
(create_optional_field): Rename create_optional_field_ and add
line argument. Original name is now a macro which supplies
__LINE__.
(oprintf): Use vsnprintf directly.
(close_output_files): Use fatal rather than perror/exit.
(note_def_vec, note_def_vec_alloc): Use create_field_at.
(main): Set progname. Don't use exit.
* gengtype-yacc.y (struct_fields): Use create_field_at.
(option, optionseqopt): Delete.
(optionseq): Consolidate productions from option here so we
can use the first argument to create_option.
* gengtype-lex.l: Distinguish unions from structures in the
token type. Don't call find_structure; return the tag as a string.
* gengtype-yacc.y: Add new token types ENT_TYPEDEF_UNION and ENT_UNION.
......
......@@ -57,7 +57,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
%type <p> struct_fields
%type <t> type lasttype
%type <o> optionsopt options option optionseq optionseqopt
%type <o> optionsopt options optionseq
%type <s> type_option stringseq
%%
......@@ -128,33 +128,17 @@ semiequal: ';'
struct_fields: { $$ = NULL; }
| type optionsopt ID bitfieldopt ';' struct_fields
{
pair_p p = XNEW (struct pair);
p->type = adjust_field_type ($1, $2);
p->opt = $2;
p->name = $3;
p->next = $6;
p->line = lexer_line;
$$ = p;
$$ = create_field_at ($6, $1, $3, $2, &lexer_line);
}
| type optionsopt ID ARRAY ';' struct_fields
{
pair_p p = XNEW (struct pair);
p->type = adjust_field_type (create_array ($1, $4), $2);
p->opt = $2;
p->name = $3;
p->next = $6;
p->line = lexer_line;
$$ = p;
$$ = create_field_at ($6, create_array ($1, $4),
$3, $2, &lexer_line);
}
| type optionsopt ID ARRAY ARRAY ';' struct_fields
{
pair_p p = XNEW (struct pair);
p->type = create_array (create_array ($1, $5), $4);
p->opt = $2;
p->name = $3;
p->next = $7;
p->line = lexer_line;
$$ = p;
type_p arr = create_array (create_array ($1, $5), $4);
$$ = create_field_at ($7, arr, $3, $2, &lexer_line);
}
| type ':' bitfieldlen ';' struct_fields
{ $$ = $5; }
......@@ -204,7 +188,7 @@ optionsopt: { $$ = NULL; }
| options { $$ = $1; }
;
options: GTY_TOKEN '(' '(' optionseqopt ')' ')'
options: GTY_TOKEN '(' '(' optionseq ')' ')'
{ $$ = $4; }
;
......@@ -214,31 +198,19 @@ type_option : ALIAS
{ $$ = $1; }
;
option: ID
{ $$ = create_option (NULL, $1, (void *)""); }
| ID '(' stringseq ')'
{ $$ = create_option (NULL, $1, (void *)$3); }
| type_option '(' type ')'
{ $$ = create_option (NULL, $1, adjust_field_type ($3, NULL)); }
| NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
{ $$ = create_nested_ptr_option ($3, $5, $7); }
;
optionseq: option
{
$1->next = NULL;
$$ = $1;
}
| optionseq ',' option
{
$3->next = $1;
$$ = $3;
}
;
optionseqopt: { $$ = NULL; }
| optionseq { $$ = $1; }
;
optionseq: { $$ = NULL; }
| optionseq commaopt ID
{ $$ = create_option ($1, $3, (void *)""); }
| optionseq commaopt ID '(' stringseq ')'
{ $$ = create_option ($1, $3, (void *)$5); }
| optionseq commaopt type_option '(' type ')'
{ $$ = create_option ($1, $3, adjust_field_type ($5, 0)); }
| optionseq commaopt NESTED_PTR '(' type ',' stringseq ',' stringseq ')'
{ $$ = create_nested_ptr_option ($1, $5, $7, $9); }
commaopt: /* nothing */
| ','
;
stringseq: STRING
{ $$ = $1; }
......
......@@ -18,6 +18,9 @@ along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
#ifndef GCC_GENGTYPE_H
#define GCC_GENGTYPE_H
/* A file position, mostly for error messages.
The FILE element may be compared using pointer equality. */
struct fileloc {
......@@ -25,92 +28,10 @@ struct fileloc {
int line;
};
/* Kinds of types we can understand. */
enum typekind {
TYPE_SCALAR,
TYPE_STRING,
TYPE_STRUCT,
TYPE_UNION,
TYPE_POINTER,
TYPE_ARRAY,
TYPE_LANG_STRUCT,
TYPE_PARAM_STRUCT
};
/* Data types handed around within, but opaque to, the lexer and parser. */
typedef struct pair *pair_p;
typedef struct type *type_p;
typedef unsigned lang_bitmap;
/* Option data for the 'nested_ptr' option. */
struct nested_ptr_data {
type_p type;
const char *convert_to;
const char *convert_from;
};
/* A way to pass data through to the output end. */
typedef struct options {
struct options *next;
const char *name;
const char *info;
} *options_p;
/* A name and a type. */
struct pair {
pair_p next;
const char *name;
type_p type;
struct fileloc line;
options_p opt;
};
#define NUM_PARAM 10
/* A description of a type. */
enum gc_used_enum
{
GC_UNUSED = 0,
GC_USED,
GC_MAYBE_POINTED_TO,
GC_POINTED_TO
};
struct type {
enum typekind kind;
type_p next;
type_p pointer_to;
enum gc_used_enum gc_used;
union {
type_p p;
struct {
const char *tag;
struct fileloc line;
pair_p fields;
options_p opt;
lang_bitmap bitmap;
type_p lang_struct;
} s;
bool scalar_is_char;
struct {
type_p p;
const char *len;
} a;
struct {
type_p stru;
type_p param[NUM_PARAM];
struct fileloc line;
} param_struct;
} u;
};
#define UNION_P(x) \
((x)->kind == TYPE_UNION || \
((x)->kind == TYPE_LANG_STRUCT \
&& (x)->u.s.lang_struct->kind == TYPE_UNION))
#define UNION_OR_STRUCT_P(x) \
((x)->kind == TYPE_UNION \
|| (x)->kind == TYPE_STRUCT \
|| (x)->kind == TYPE_LANG_STRUCT)
typedef struct options *options_p;
/* Variables used to communicate between the lexer and the parser. */
extern int lexer_toplevel_done;
......@@ -120,13 +41,6 @@ extern struct fileloc lexer_line;
extern void error_at_line
(struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2;
/* Combines xmalloc() and vasprintf(). */
extern int xvasprintf (char **, const char *, va_list)
ATTRIBUTE_PRINTF (2, 0);
/* Like the above, but more convenient for quick coding. */
extern char * xasprintf (const char *, ...)
ATTRIBUTE_PRINTF_1;
/* 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);
......@@ -139,8 +53,10 @@ 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);
extern options_p create_nested_ptr_option (type_p t, const char *from,
const char *to);
extern options_p create_nested_ptr_option (options_p, type_p t,
const char *from, const char *to);
extern pair_p create_field_at (pair_p next, type_p type, const char *name,
options_p opt, struct fileloc *pos);
extern type_p adjust_field_type (type_p, options_p);
extern void note_variable (const char *s, type_p t, options_p o,
struct fileloc *pos);
......@@ -155,36 +71,4 @@ extern void yyerror (const char *);
extern int yyparse (void);
extern void parse_file (const char *name);
/* Output file handling. */
/* Structure representing an output file. */
struct outf
{
struct outf *next;
const char *name;
size_t buflength;
size_t bufused;
char *buf;
};
typedef struct outf * outf_p;
/* An output file, suitable for definitions, that can see declarations
made in INPUT_FILE and is linked into every language that uses
INPUT_FILE. */
extern outf_p get_output_file_with_visibility
(const char *input_file);
const char *get_output_file_name (const char *);
/* A list of output files suitable for definitions. There is one
BASE_FILES entry for each language. */
extern outf_p base_files[];
/* A bitmap that specifies which of BASE_FILES should be used to
output a definition that is different for each language and must be
defined once in each language that uses INPUT_FILE. */
extern lang_bitmap get_base_file_bitmap (const char *input_file);
/* Print, like fprintf, to O. */
extern void oprintf (outf_p o, const char *S, ...)
ATTRIBUTE_PRINTF_2;
#endif
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