| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| #include <u.h> | |
| #include <libc.h> | |
| #include <bio.h> | |
| enum | |
| { | |
| Void = 1, | |
| Int8, | |
| Uint8, | |
| Int16, | |
| Uint16, | |
| Int32, | |
| Uint32, | |
| Int64, | |
| Uint64, | |
| Float32, | |
| Float64, | |
| Ptr, | |
| Struct, | |
| Array, | |
| Union, | |
| Typedef, | |
| }; | |
| typedef struct Field Field; | |
| typedef struct Type Type; | |
| struct Type | |
| { | |
| Type *next; // next in hash table | |
| // stabs name and two-integer id | |
| char *name; | |
| int n1; | |
| int n2; | |
| // int kind | |
| int kind; | |
| // sub-type for ptr, array | |
| Type *type; | |
| // struct fields | |
| Field *f; | |
| int nf; | |
| int size; | |
| int saved; // recorded in typ array | |
| int warned; // warned about needing type | |
| int printed; // has the definition been printed yet? | |
| }; | |
| struct Field | |
| { | |
| char *name; | |
| Type *type; | |
| int offset; | |
| int size; | |
| }; | |
| // Constants | |
| typedef struct Const Const; | |
| struct Const | |
| { | |
| char *name; | |
| vlong value; | |
| }; | |
| // Recorded constants and types, to be printed. | |
| extern Const *con; | |
| extern int ncon; | |
| extern Type **typ; | |
| extern int ntyp; | |
| extern int kindsize[]; | |
| // Language output | |
| typedef struct Lang Lang; | |
| struct Lang | |
| { | |
| char *constbegin; | |
| char *constfmt; | |
| char *constend; | |
| char *typdef; | |
| char *typdefend; | |
| char *structbegin; | |
| char *unionbegin; | |
| char *structpadfmt; | |
| char *structend; | |
| int (*typefmt)(Fmt*); | |
| }; | |
| extern Lang go, c; | |
| void* emalloc(int); | |
| char* estrdup(char*); | |
| void* erealloc(void*, int); | |
| void parsestabtype(char*); |