gengtype.h revision 302408
1/* Process source files and output type information. 2 Copyright (C) 2002, 2003, 2004 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, 51 Franklin Street, Fifth Floor, Boston, MA 1902110-1301, 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 40typedef struct pair *pair_p; 41typedef struct type *type_p; 42typedef unsigned lang_bitmap; 43 44/* Option data for the 'nested_ptr' option. */ 45struct 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. */ 52typedef struct options { 53 struct options *next; 54 const char *name; 55 const char *info; 56} *options_p; 57 58/* A name and a type. */ 59struct 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. */ 70enum gc_used_enum 71 { 72 GC_UNUSED = 0, 73 GC_USED, 74 GC_MAYBE_POINTED_TO, 75 GC_POINTED_TO 76 }; 77 78struct 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. */ 116extern struct type string_type; 117 118/* Variables used to communicate between the lexer and the parser. */ 119extern int lexer_toplevel_done; 120extern struct fileloc lexer_line; 121 122/* Print an error message. */ 123extern void error_at_line 124 (struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2; 125 126/* Combines xmalloc() and vasprintf(). */ 127extern int xvasprintf (char **, const char *, va_list) 128 ATTRIBUTE_PRINTF (2, 0); 129/* Like the above, but more convenient for quick coding. */ 130extern char * xasprintf (const char *, ...) 131 ATTRIBUTE_PRINTF_1; 132 133/* Constructor routines for types. */ 134extern void do_typedef (const char *s, type_p t, struct fileloc *pos); 135extern type_p resolve_typedef (const char *s, struct fileloc *pos); 136extern type_p new_structure (const char *name, int isunion, 137 struct fileloc *pos, pair_p fields, 138 options_p o); 139extern type_p find_structure (const char *s, int isunion); 140extern type_p create_scalar_type (const char *name, size_t name_len); 141extern type_p create_pointer (type_p t); 142extern type_p create_array (type_p t, const char *len); 143extern options_p create_option (options_p, const char *name, const void *info); 144extern type_p adjust_field_type (type_p, options_p); 145extern void note_variable (const char *s, type_p t, options_p o, 146 struct fileloc *pos); 147extern 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. */ 151extern int yylex (void); 152extern void yyerror (const char *); 153extern int yyparse (void); 154extern void parse_file (const char *name); 155 156/* Output file handling. */ 157 158/* Structure representing an output file. */ 159struct outf 160{ 161 struct outf *next; 162 const char *name; 163 size_t buflength; 164 size_t bufused; 165 char *buf; 166}; 167 168typedef 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. */ 173extern outf_p get_output_file_with_visibility 174 (const char *input_file); 175const 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. */ 179extern 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. */ 184extern lang_bitmap get_base_file_bitmap (const char *input_file); 185 186/* Print, like fprintf, to O. */ 187extern void oprintf (outf_p o, const char *S, ...) 188 ATTRIBUTE_PRINTF_2; 189