| // 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*); |