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