don't assert if a struct-type symbol hasn't been defined
[xorcyst.git] / RCS / symtab.h,v
blob44d447955ecbf199328593dc75d888a2b8ad4546
1 head    1.8;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
8 1.8
9 date    2007.08.12.18.59.10;    author khansen; state Exp;
10 branches;
11 next    1.7;
13 1.7
14 date    2007.08.09.20.34.09;    author khansen; state Exp;
15 branches;
16 next    1.6;
18 1.6
19 date    2007.07.22.13.35.20;    author khansen; state Exp;
20 branches;
21 next    1.5;
23 1.5
24 date    2005.01.05.02.27.23;    author kenth;   state Exp;
25 branches;
26 next    1.4;
28 1.4
29 date    2004.12.19.20.47.04;    author kenth;   state Exp;
30 branches;
31 next    1.3;
33 1.3
34 date    2004.12.16.13.21.47;    author kenth;   state Exp;
35 branches;
36 next    1.2;
38 1.2
39 date    2004.12.06.04.54.00;    author kenth;   state Exp;
40 branches;
41 next    1.1;
43 1.1
44 date    2004.06.30.07.56.45;    author kenth;   state Exp;
45 branches;
46 next    ;
49 desc
53 1.8
54 log
55 @ability to generate pure 6502 binary
57 text
58 @/*
59  * $Id: symtab.h,v 1.7 2007/08/09 20:34:09 khansen Exp khansen $
60  * $Log: symtab.h,v $
61  * Revision 1.7  2007/08/09 20:34:09  khansen
62  * progress
63  *
64  * Revision 1.6  2007/07/22 13:35:20  khansen
65  * convert tabs to whitespaces
66  *
67  * Revision 1.5  2005/01/05 02:27:23  kenth
68  * ordered_field_list has pointer to symtab_entry instead of id
69  *
70  * Revision 1.4  2004/12/19 20:47:04  kenth
71  * xorcyst 1.4.0
72  *
73  * Revision 1.3  2004/12/16 13:21:47  kenth
74  * added RECORD_SYMBOL
75  *
76  * Revision 1.2  2004/12/06 04:54:00  kenth
77  * xorcyst 1.1.0
78  *
79  * Revision 1.1  2004/06/30 07:56:45  kenth
80  * Initial revision
81  *
82  */
84 /**
85  *    (C) 2004 Kent Hansen
86  *
87  *    The XORcyst is free software; you can redistribute it and/or modify
88  *    it under the terms of the GNU General Public License as published by
89  *    the Free Software Foundation; either version 2 of the License, or
90  *    (at your option) any later version.
91  *
92  *    The XORcyst is distributed in the hope that it will be useful,
93  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
94  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
95  *    GNU General Public License for more details.
96  *
97  *    You should have received a copy of the GNU General Public License
98  *    along with The XORcyst; if not, write to the Free Software
99  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
100  */
102 #ifndef SYMTAB_H
103 #define SYMTAB_H
105 #include "astnode.h"
108  * The possible types of symbol.
109  */
110 enum tag_symbol_type {
111     LABEL_SYMBOL=0,     /* A label */
112     CONSTANT_SYMBOL,    /* A constant */
113     MACRO_SYMBOL,       /* A macro */
114     STRUC_SYMBOL,       /* A structure */
115     UNION_SYMBOL,       /* A union */
116     RECORD_SYMBOL,      /* A record */
117     ENUM_SYMBOL,        /* An enumeration */
118     VAR_SYMBOL,     /* A variable */
119     PROC_SYMBOL,        /* A procedure */
120     ANY_SYMBOL
123 typedef enum tag_symbol_type symbol_type;
125 typedef struct tag_label_attribs label_attribs;
127 /* Possible bits for entry.flags */
128 #define PUBLIC_FLAG 0x01    /* Symbol is public (exported) */
129 #define EXTRN_FLAG  0x02    /* Symbol is external */
130 #define DATA_FLAG   0x04    /* Symbol is in dataseg */
131 #define VOLATILE_FLAG   0x08    /* Symbol is volatile */
132 #define ZEROPAGE_FLAG   0x10    /* Symbol should be mapped to ZP */
133 #define ALIGN_FLAG  0x20    /* Symbol has alignment constraint */
134 #define ADDR_FLAG   0x40    /* Symbol has hardcoded address */
135 #define ERROR_UNDEFINED_FLAG  0x80
137  * Must keep a definition-ordered list of struct or union's fields.
138  */
139 struct tag_ordered_field_list {
140     struct tag_symtab_entry *entry;
141     struct tag_ordered_field_list *next;
144 typedef struct tag_ordered_field_list ordered_field_list;
147  * Structure that describes a struct or union.
148  */
149 struct tag_struc_attribs {
150     astnode *size;  /* total size of the struct or union */
151     ordered_field_list *fields;
154 typedef struct tag_struc_attribs struc_attribs;
156 struct tag_field_attribs {
157     astnode *offset;    /* offset from start of structure, in bytes */
158     astnode *size;      /* size of field, in bytes */
161 typedef struct tag_field_attribs field_attribs;
164  * Structure that describes a symbol table entry.
165  */
166 struct tag_symtab_entry {
167     symbol_type type;
168     char *id;
169     astnode *def;   /* Pointer to something that describes this entry more */
170     int flags;
171     int tag;
172     int ref_count;
173     int align;  /* 2^align = boundary */
174     int address;
175     struct tag_symtab *symtab;  /* Child symbols (STRUC|UNION|ENUM_SYMBOL) */
176     union {
177         field_attribs field;    /* type == VAR_SYMBOL */
178         struc_attribs struc;    /* type == UNION|STRUC_SYMBOL */
179     };
180     struct tag_symtab_entry *left;
181     struct tag_symtab_entry *right;
182     struct tag_symtab_entry *parent;
185 typedef struct tag_symtab_entry symtab_entry;
188  * Structure that describes a symbol table.
189  */
190 struct tag_symtab {
191     struct tag_symtab *parent;
192     symtab_entry *root;
195 typedef struct tag_symtab symtab;
198  * Structure that describes a list of identifiers.
199  */
200 struct tag_symbol_ident_list {
201     char **idents;
202     int size;
205 typedef struct tag_symbol_ident_list symbol_ident_list;
207 /* Function prototypes */
208 symtab *symtab_create();
209 void symtab_push(symtab *);
210 symtab *symtab_pop();
211 symtab *symtab_tos();
212 symtab *symtab_parent();
213 symtab_entry *symtab_enter(const char *, symbol_type, astnode *, int);
214 symtab_entry *symtab_lookup(const char *);
215 symtab_entry *symtab_lookup_recursive(const char *);
216 symtab_entry *symtab_global_lookup(const char *);
217 int symtab_size();
218 int symtab_type_count(symbol_type);
219 void symtab_finalize(symtab *);
220 void symtab_remove(const char *);
221 void symtab_remove_by_type(symbol_type);
222 int symtab_list(symbol_ident_list *);
223 int symtab_list_type(symbol_type, symbol_ident_list *);
224 void symtab_list_finalize(symbol_ident_list *);
225 void symtab_print();
227 #endif  /* !SYMTAB_H */
233 @progress
235 text
236 @d2 1
237 a2 1
238  * $Id: symtab.h,v 1.6 2007/07/22 13:35:20 khansen Exp khansen $
239 d4 3
240 d78 1
241 a78 1
248 @convert tabs to whitespaces
250 text
251 @d2 1
252 a2 1
253  * $Id: symtab.h,v 1.5 2005/01/05 02:27:23 kenth Exp khansen $
254 d4 3
255 d155 1
261 @ordered_field_list has pointer to symtab_entry instead of id
263 text
264 @d2 1
265 a2 1
266  * $Id: symtab.h,v 1.4 2004/12/19 20:47:04 kenth Exp kenth $
267 d4 3
268 d48 10
269 a57 10
270         LABEL_SYMBOL=0,         /* A label */
271         CONSTANT_SYMBOL,        /* A constant */
272         MACRO_SYMBOL,           /* A macro */
273         STRUC_SYMBOL,           /* A structure */
274         UNION_SYMBOL,           /* A union */
275         RECORD_SYMBOL,          /* A record */
276         ENUM_SYMBOL,            /* An enumeration */
277         VAR_SYMBOL,             /* A variable */
278         PROC_SYMBOL,            /* A procedure */
279         ANY_SYMBOL
280 d65 7
281 a71 7
282 #define PUBLIC_FLAG     0x01    /* Symbol is public (exported) */
283 #define EXTRN_FLAG      0x02    /* Symbol is external */
284 #define DATA_FLAG       0x04    /* Symbol is in dataseg */
285 #define VOLATILE_FLAG   0x08    /* Symbol is volatile */
286 #define ZEROPAGE_FLAG   0x10    /* Symbol should be mapped to ZP */
287 #define ALIGN_FLAG      0x20    /* Symbol has alignment constraint */
288 #define ADDR_FLAG       0x40    /* Symbol has hardcoded address */
289 d77 2
290 a78 2
291         struct tag_symtab_entry *entry;
292         struct tag_ordered_field_list *next;
293 d87 2
294 a88 2
295         astnode *size;  /* total size of the struct or union */
296         ordered_field_list *fields;
297 d94 2
298 a95 2
299         astnode *offset;        /* offset from start of structure, in bytes */
300         astnode *size;          /* size of field, in bytes */
301 d104 16
302 a119 16
303         symbol_type type;
304         char *id;
305         astnode *def;   /* Pointer to something that describes this entry more */
306         int flags;
307         int tag;
308         int ref_count;
309         int align;      /* 2^align = boundary */
310         int address;
311         struct tag_symtab *symtab;      /* Child symbols (STRUC|UNION|ENUM_SYMBOL) */
312         union {
313                 field_attribs field;    /* type == VAR_SYMBOL */
314                 struc_attribs struc;    /* type == UNION|STRUC_SYMBOL */
315         };
316         struct tag_symtab_entry *left;
317         struct tag_symtab_entry *right;
318         struct tag_symtab_entry *parent;
319 d128 2
320 a129 2
321         struct tag_symtab *parent;
322         symtab_entry *root;
323 d138 2
324 a139 2
325         char **idents;
326         int size;
327 d163 1
328 a163 1
329 #endif  /* !SYMTAB_H */
335 @xorcyst 1.4.0
337 text
338 @d2 1
339 a2 1
340  * $Id: symtab.h,v 1.3 2004/12/16 13:21:47 kenth Exp kenth $
341 d4 3
342 d74 1
343 a74 1
344         const char *id;
350 @added RECORD_SYMBOL
352 text
353 @d2 1
354 a2 1
355  * $Id: symtab.h,v 1.2 2004/12/06 04:54:00 kenth Exp kenth $
356 d4 3
357 d63 3
358 d104 2
364 @xorcyst 1.1.0
366 text
367 @d2 1
368 a2 1
369  * $Id: symtab.h,v 1.1 2004/06/30 07:56:45 kenth Exp $
370 d4 3
371 d44 1
377 @Initial revision
379 text
380 @d2 5
381 a6 2
382  * $Id$
383  * $Log$
384 d30 2
385 d39 5
386 a43 1
387         EXTERNAL_SYMBOL,        /* An external symbol */
388 d53 1
389 a53 1
390 #define DEFINED_FLAG    0x02    /* Symbol is defined */
391 d58 27
392 d90 1
393 a90 1
394         void *def;      /* Pointer to something that describes this entry more */
395 d93 2
396 d96 2
397 a97 1
398                 int ref_count;  /* type == LABEL_SYMBOL */
399 d132 1
400 a132 1
401 symtab_entry *symtab_enter(const char *, symbol_type, void *, int);
402 d134 1