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; 189