OSDN Git Service

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