gengtype.h revision 117395
1/* Process source files and output type information.
2   Copyright (C) 2002 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 2, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING.  If not, write to the Free
18Software Foundation, 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA.  */
20
21/* A file position, mostly for error messages.
22   The FILE element may be compared using pointer equality.  */
23struct fileloc {
24  const char *file;
25  int line;
26};
27
28/* Kinds of types we can understand.  */
29enum typekind {
30  TYPE_SCALAR,
31  TYPE_STRING,
32  TYPE_STRUCT,
33  TYPE_UNION,
34  TYPE_POINTER,
35  TYPE_ARRAY,
36  TYPE_LANG_STRUCT,
37  TYPE_PARAM_STRUCT
38};
39
40/* A way to pass data through to the output end.  */
41typedef struct options {
42  struct options *next;
43  const char *name;
44  const void *info;
45} *options_p;
46
47typedef struct pair *pair_p;
48typedef struct type *type_p;
49typedef unsigned lang_bitmap;
50
51/* A name and a type.  */
52struct pair {
53  pair_p next;
54  const char *name;
55  type_p type;
56  struct fileloc line;
57  options_p opt;
58};
59
60#define NUM_PARAM 10
61
62/* A description of a type.  */
63struct type {
64  enum typekind kind;
65  type_p next;
66  type_p pointer_to;
67  enum gc_used_enum {
68    GC_UNUSED = 0,
69    GC_USED,
70    GC_MAYBE_POINTED_TO,
71    GC_POINTED_TO
72  } gc_used;
73  union {
74    type_p p;
75    struct {
76      const char *tag;
77      struct fileloc line;
78      pair_p fields;
79      options_p opt;
80      lang_bitmap bitmap;
81      type_p lang_struct;
82    } s;
83    char *sc;
84    struct {
85      type_p p;
86      const char *len;
87    } a;
88    struct {
89      type_p stru;
90      type_p param[NUM_PARAM];
91      struct fileloc line;
92    } param_struct;
93  } u;
94};
95
96#define UNION_P(x)					\
97 ((x)->kind == TYPE_UNION || 				\
98  ((x)->kind == TYPE_LANG_STRUCT 			\
99   && (x)->u.s.lang_struct->kind == TYPE_UNION))
100#define UNION_OR_STRUCT_P(x)			\
101 ((x)->kind == TYPE_UNION 			\
102  || (x)->kind == TYPE_STRUCT 			\
103  || (x)->kind == TYPE_LANG_STRUCT)
104
105/* The one and only TYPE_STRING.  */
106extern struct type string_type;
107
108/* Variables used to communicate between the lexer and the parser.  */
109extern int lexer_toplevel_done;
110extern struct fileloc lexer_line;
111
112/* Print an error message.  */
113extern void error_at_line
114  PARAMS ((struct fileloc *pos, const char *msg, ...)) ATTRIBUTE_PRINTF_2;
115
116/* Combines xmalloc() and vasprintf().  */
117extern int xvasprintf PARAMS ((char **, const char *, va_list))
118     ATTRIBUTE_PRINTF (2, 0);
119/* Like the above, but more convenient for quick coding.  */
120extern char * xasprintf PARAMS ((const char *, ...))
121     ATTRIBUTE_PRINTF_1;
122
123/* Constructor routines for types.  */
124extern void do_typedef PARAMS ((const char *s, type_p t, struct fileloc *pos));
125extern type_p resolve_typedef PARAMS ((const char *s, struct fileloc *pos));
126extern void new_structure PARAMS ((const char *name, int isunion,
127				   struct fileloc *pos, pair_p fields,
128				   options_p o));
129extern type_p find_structure PARAMS ((const char *s, int isunion));
130extern type_p create_scalar_type PARAMS ((const char *name, size_t name_len));
131extern type_p create_pointer PARAMS ((type_p t));
132extern type_p create_array PARAMS ((type_p t, const char *len));
133extern type_p adjust_field_type PARAMS ((type_p, options_p));
134extern void note_variable PARAMS ((const char *s, type_p t, options_p o,
135				   struct fileloc *pos));
136extern void note_yacc_type PARAMS ((options_p o, pair_p fields,
137				    pair_p typeinfo, struct fileloc *pos));
138
139/* Lexer and parser routines, most automatically generated.  */
140extern int yylex PARAMS((void));
141extern void yyerror PARAMS ((const char *));
142extern int yyparse PARAMS ((void));
143extern void parse_file PARAMS ((const char *name));
144
145/* Output file handling.  */
146
147/* Structure representing an output file.  */
148struct outf
149{
150  struct outf *next;
151  const char *name;
152  size_t buflength;
153  size_t bufused;
154  char *buf;
155};
156
157typedef struct outf * outf_p;
158
159/* The output header file that is included into pretty much every
160   source file.  */
161extern outf_p header_file;
162
163/* An output file, suitable for definitions, that can see declarations
164   made in INPUT_FILE and is linked into every language that uses
165   INPUT_FILE.  */
166extern outf_p get_output_file_with_visibility
167   PARAMS ((const char *input_file));
168const char *get_output_file_name PARAMS ((const char *));
169
170/* A list of output files suitable for definitions.  There is one
171   BASE_FILES entry for each language.  */
172extern outf_p base_files[];
173
174/* A bitmap that specifies which of BASE_FILES should be used to
175   output a definition that is different for each language and must be
176   defined once in each language that uses INPUT_FILE.  */
177extern lang_bitmap get_base_file_bitmap PARAMS ((const char *input_file));
178
179/* Print, like fprintf, to O.  */
180extern void oprintf PARAMS ((outf_p o, const char *S, ...))
181     ATTRIBUTE_PRINTF_2;
182