From 54303c25f3d61ab8696e233bfe5d1d154617a600 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Thu, 4 Apr 2019 12:05:06 -0700 Subject: Merge headers into cc.h --- backend.h | 41 ----- cc.h | 512 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ decl.c | 10 +- decl.h | 53 ------- deps.mk | 28 ++-- eval.c | 7 +- eval.h | 1 - expr.c | 9 +- expr.h | 94 ------------ init.c | 7 +- init.h | 11 -- main.c | 5 +- pp.c | 5 +- pp.h | 8 - qbe.c | 9 +- scan.c | 4 +- scan.h | 4 - scope.c | 4 +- scope.h | 22 --- stmt.c | 9 +- stmt.h | 4 - token.c | 3 +- token.h | 124 --------------- type.c | 3 +- type.h | 125 --------------- 25 files changed, 539 insertions(+), 563 deletions(-) delete mode 100644 backend.h create mode 100644 cc.h delete mode 100644 decl.h delete mode 100644 eval.h delete mode 100644 expr.h delete mode 100644 init.h delete mode 100644 pp.h delete mode 100644 scan.h delete mode 100644 scope.h delete mode 100644 stmt.h delete mode 100644 token.h delete mode 100644 type.h diff --git a/backend.h b/backend.h deleted file mode 100644 index 2ef3e9a..0000000 --- a/backend.h +++ /dev/null @@ -1,41 +0,0 @@ -struct gotolabel { - struct value *label; - _Bool defined; -}; - -struct switchcases { - void *root; - struct value *defaultlabel; -}; - -struct repr; -struct decl; -struct expr; -struct init; -struct scope; -struct type; - -struct switchcases *mkswitch(void); -void switchcase(struct switchcases *, uint64_t, struct value *); - -struct value *mkblock(char *); -struct value *mkglobal(char *, _Bool); -struct value *mkintconst(struct repr *, uint64_t); - -uint64_t intconstvalue(struct value *); - -struct func *mkfunc(char *, struct type *, struct scope *); -struct type *functype(struct func *); -void funclabel(struct func *, struct value *); -struct value *funcexpr(struct func *, struct expr *); -void funcjmp(struct func *, struct value *); -void funcjnz(struct func *, struct value *, struct value *, struct value *); -void funcret(struct func *, struct value *); -struct gotolabel *funcgoto(struct func *, char *); -void funcswitch(struct func *, struct value *, struct switchcases *, struct value *); -void funcinit(struct func *, struct decl *, struct init *); - -void emitfunc(struct func *, _Bool); -void emitdata(struct decl *, struct init *); - -extern struct repr i8, i16, i32, i64, f32, f64; diff --git a/cc.h b/cc.h new file mode 100644 index 0000000..0606c10 --- /dev/null +++ b/cc.h @@ -0,0 +1,512 @@ +/* token */ + +enum tokenkind { + TNONE, + + TEOF, + TNEWLINE, + + TIDENT, + TNUMBER, + TCHARCONST, + TSTRINGLIT, + + /* keyword */ + TAUTO, + TBREAK, + TCASE, + TCHAR, + TCONST, + TCONTINUE, + TDEFAULT, + TDO, + TDOUBLE, + TELSE, + TENUM, + TEXTERN, + TFLOAT, + TFOR, + TGOTO, + TIF, + TINLINE, + TINT, + TLONG, + TREGISTER, + TRESTRICT, + TRETURN, + TSHORT, + TSIGNED, + TSIZEOF, + TSTATIC, + TSTRUCT, + TSWITCH, + TTYPEDEF, + TUNION, + TUNSIGNED, + TVOID, + TVOLATILE, + TWHILE, + T_ALIGNAS, + T_ALIGNOF, + T_ATOMIC, + T_BOOL, + T_COMPLEX, + T_GENERIC, + T_IMAGINARY, + T_NORETURN, + T_STATIC_ASSERT, + T_THREAD_LOCAL, + T__TYPEOF__, + + /* punctuator */ + TLBRACK, + TRBRACK, + TLPAREN, + TRPAREN, + TLBRACE, + TRBRACE, + TPERIOD, + TARROW, + TINC, + TDEC, + TBAND, + TMUL, + TADD, + TSUB, + TBNOT, + TLNOT, + TDIV, + TMOD, + TSHL, + TSHR, + TLESS, + TGREATER, + TLEQ, + TGEQ, + TEQL, + TNEQ, + TXOR, + TBOR, + TLAND, + TLOR, + TQUESTION, + TCOLON, + TSEMICOLON, + TELLIPSIS, + TASSIGN, + TMULASSIGN, + TDIVASSIGN, + TMODASSIGN, + TADDASSIGN, + TSUBASSIGN, + TSHLASSIGN, + TSHRASSIGN, + TBANDASSIGN, + TXORASSIGN, + TBORASSIGN, + TCOMMA, + THASH, + THASHHASH, +}; + +struct location { + const char *file; + size_t line, col; +}; + +struct token { + enum tokenkind kind; + struct location loc; + char *lit; +}; + +extern struct token tok; + +void tokprint(const struct token *); +_Noreturn void error(const struct location *, const char *, ...); +struct token; + +/* scan */ + +int scanfrom(const char *file); +void scan(struct token *); +struct location; + +void ppinit(const char *); + +void next(void); +_Bool peek(int); +char *expect(int, const char *); +_Bool consume(int); + +/* type */ + +enum typequal { + QUALNONE, + + QUALCONST = 1<<1, + QUALRESTRICT = 1<<2, + QUALVOLATILE = 1<<3, + QUALATOMIC = 1<<4, +}; + +enum typekind { + TYPENONE, + + TYPEQUALIFIED, + TYPEVOID, + TYPEBASIC, + TYPEPOINTER, + TYPEARRAY, + TYPEFUNC, + TYPESTRUCT, + TYPEUNION, +}; + +enum typeprop { + PROPNONE, + + PROPOBJECT = 1<<0, + PROPCHAR = 1<<1, + PROPINT = 1<<2, + PROPREAL = 1<<3, + PROPARITH = 1<<4, + PROPSCALAR = 1<<5, + PROPAGGR = 1<<6, + PROPDERIVED = 1<<7, + PROPFLOAT = 1<<8, +}; + +struct param { + char *name; + struct type *type; + struct value *value; + struct param *next; +}; + +struct bitfield { + short before; /* number of bits in the storage unit before the bit-field */ + short after; /* number of bits in the storage unit after the bit-field */ +}; + +struct member { + char *name; + struct type *type; + uint64_t offset; + struct bitfield bits; + struct member *next; +}; + +struct type { + enum typekind kind; + int align; + uint64_t size; + struct repr *repr; + union { + struct type *base; + struct list link; /* used only during construction of type */ + }; + _Bool incomplete; + union { + struct { + enum typequal kind; + } qualified; + struct { + enum { + BASICBOOL, + BASICCHAR, + BASICSHORT, + BASICINT, + BASICENUM, + BASICLONG, + BASICLONGLONG, + BASICFLOAT, + BASICDOUBLE, + BASICLONGDOUBLE, + } kind; + _Bool issigned, iscomplex; + } basic; + struct { + uint64_t length; + } array; + struct { + _Bool isprototype, isvararg, isnoreturn, paraminfo; + struct param *params; + } func; + struct { + char *tag; + struct member *members; + } structunion; + }; +}; + +struct type *mktype(enum typekind); +struct type *mkqualifiedtype(struct type *, enum typequal); +struct type *mkpointertype(struct type *); +struct type *mkarraytype(struct type *, uint64_t); + +_Bool typecompatible(struct type *, struct type *); +_Bool typesame(struct type *, struct type *); +struct type *typecomposite(struct type *, struct type *); +struct type *typeunqual(struct type *, enum typequal *); +struct type *typecommonreal(struct type *, struct type *); +struct type *typeargpromote(struct type *); +struct type *typeintpromote(struct type *); +enum typeprop typeprop(struct type *); +struct member *typemember(struct type *, const char *, uint64_t *); + +struct param *mkparam(char *, struct type *); + +extern struct type typevoid; +extern struct type typebool; +extern struct type typechar, typeschar, typeuchar; +extern struct type typeshort, typeushort; +extern struct type typeint, typeuint; +extern struct type typelong, typeulong; +extern struct type typellong, typeullong; +extern struct type typefloat, typedouble, typelongdouble; +extern struct type typevalist, typevalistptr; + +/* decl */ + +enum declkind { + DECLTYPE, + DECLOBJECT, + DECLFUNC, + DECLCONST, + DECLBUILTIN, +}; + +enum linkage { + LINKNONE, + LINKINTERN, + LINKEXTERN, +}; + +enum builtinkind { + BUILTINALLOCA, + BUILTINCONSTANTP, + BUILTININFF, + BUILTINNANF, + BUILTINOFFSETOF, + BUILTINVAARG, + BUILTINVACOPY, + BUILTINVAEND, + BUILTINVALIST, + BUILTINVASTART, +}; + +struct decl { + enum declkind kind; + enum linkage linkage; + struct type *type; + struct value *value; + + /* objects and functions */ + struct list link; + int align; /* may be more strict than type requires */ + _Bool tentative, defined; + + /* built-ins */ + enum builtinkind builtin; +}; + +struct scope; +struct func; + +struct decl *mkdecl(enum declkind, struct type *, enum linkage); +_Bool decl(struct scope *, struct func *); +struct type *typename(struct scope *); + +struct expr; +struct decl *stringdecl(struct expr *); + +void emittentativedefns(void); + +/* scope */ + +struct scope { + struct hashtable *tags; + struct hashtable *decls; + struct value *breaklabel; + struct value *continuelabel; + struct switchcases *switchcases; + struct scope *parent; +}; + +void scopeinit(void); +struct scope *mkscope(struct scope *); +struct scope *delscope(struct scope *); + +struct decl; +void scopeputdecl(struct scope *, const char *, struct decl *); +struct decl *scopegetdecl(struct scope *, const char *, _Bool); + +struct type; +void scopeputtag(struct scope *, const char *, struct type *); +struct type *scopegettag(struct scope *, const char *, _Bool); + +extern struct scope filescope; + +/* expr */ + +enum exprkind { + /* primary expression */ + EXPRIDENT, + EXPRCONST, + EXPRSTRING, + + /* postfix expression */ + EXPRCALL, + /* member E.M gets transformed to *(typeof(E.M) *)((char *)E + offsetof(typeof(E), M)) */ + EXPRINCDEC, + EXPRCOMPOUND, + /* subscript E1[E2] gets transformed to *((E1)+(E2)) */ + + EXPRUNARY, + EXPRCAST, + EXPRBINARY, + EXPRCOND, + EXPRASSIGN, + EXPRCOMMA, + + EXPRBUILTIN, + EXPRTEMP, +}; + +enum exprflags { + EXPRFLAG_LVAL = 1<<0, + EXPRFLAG_DECAYED = 1<<1, +}; + +struct expr { + enum exprkind kind; + enum exprflags flags; + struct type *type; + struct expr *next; + union { + struct { + struct decl *decl; + } ident; + union { + uint64_t i; + double f; + } constant; + struct { + char *data; + size_t size; + } string; + struct { + struct expr *func, *args; + size_t nargs; + } call; + struct { + struct init *init; + } compound; + struct { + int op; + _Bool post; + struct expr *base; + } incdec; + struct { + int op; + struct expr *base; + } unary; + struct { + struct expr *e; + } cast; + struct { + int op; + struct expr *l, *r; + } binary; + struct { + struct expr *e, *t, *f; + } cond; + struct { + struct expr *l, *r; + } assign; + struct { + struct expr *exprs; + } comma; + struct { + int kind; + struct expr *arg; + } builtin; + struct value *temp; + }; +}; + +struct scope; + +struct expr *expr(struct scope *); +struct expr *assignexpr(struct scope *); +uint64_t intconstexpr(struct scope *, _Bool); +void delexpr(struct expr *); + +struct expr *exprconvert(struct expr *, struct type *); + +/* eval */ + +struct expr *eval(struct expr *); + +/* init */ + +struct init { + uint64_t start, end; + struct expr *expr; + struct init *next; +}; + +struct scope; +struct type; + +struct init *mkinit(uint64_t, uint64_t, struct expr *); +struct init *parseinit(struct scope *, struct type *); +struct func; +struct scope; + +void stmt(struct func *, struct scope *); + +/* backend */ + +struct gotolabel { + struct value *label; + _Bool defined; +}; + +struct switchcases { + void *root; + struct value *defaultlabel; +}; + +struct repr; +struct decl; +struct expr; +struct init; +struct scope; +struct type; + +struct switchcases *mkswitch(void); +void switchcase(struct switchcases *, uint64_t, struct value *); + +struct value *mkblock(char *); +struct value *mkglobal(char *, _Bool); +struct value *mkintconst(struct repr *, uint64_t); + +uint64_t intconstvalue(struct value *); + +struct func *mkfunc(char *, struct type *, struct scope *); +struct type *functype(struct func *); +void funclabel(struct func *, struct value *); +struct value *funcexpr(struct func *, struct expr *); +void funcjmp(struct func *, struct value *); +void funcjnz(struct func *, struct value *, struct value *, struct value *); +void funcret(struct func *, struct value *); +struct gotolabel *funcgoto(struct func *, char *); +void funcswitch(struct func *, struct value *, struct switchcases *, struct value *); +void funcinit(struct func *, struct decl *, struct init *); + +void emitfunc(struct func *, _Bool); +void emitdata(struct decl *, struct init *); + +extern struct repr i8, i16, i32, i64, f32, f64; diff --git a/decl.c b/decl.c index 70cc3aa..3e07e9d 100644 --- a/decl.c +++ b/decl.c @@ -7,16 +7,8 @@ #include #include #include "util.h" -#include "backend.h" -#include "decl.h" -#include "expr.h" +#include "cc.h" #include "htab.h" -#include "init.h" -#include "pp.h" -#include "scope.h" -#include "stmt.h" -#include "token.h" -#include "type.h" static struct list tentativedefns = {&tentativedefns, &tentativedefns}; diff --git a/decl.h b/decl.h deleted file mode 100644 index 4335278..0000000 --- a/decl.h +++ /dev/null @@ -1,53 +0,0 @@ -enum declkind { - DECLTYPE, - DECLOBJECT, - DECLFUNC, - DECLCONST, - DECLBUILTIN, -}; - -enum linkage { - LINKNONE, - LINKINTERN, - LINKEXTERN, -}; - -enum builtinkind { - BUILTINALLOCA, - BUILTINCONSTANTP, - BUILTININFF, - BUILTINNANF, - BUILTINOFFSETOF, - BUILTINVAARG, - BUILTINVACOPY, - BUILTINVAEND, - BUILTINVALIST, - BUILTINVASTART, -}; - -struct decl { - enum declkind kind; - enum linkage linkage; - struct type *type; - struct value *value; - - /* objects and functions */ - struct list link; - int align; /* may be more strict than type requires */ - _Bool tentative, defined; - - /* built-ins */ - enum builtinkind builtin; -}; - -struct scope; -struct func; - -struct decl *mkdecl(enum declkind, struct type *, enum linkage); -_Bool decl(struct scope *, struct func *); -struct type *typename(struct scope *); - -struct expr; -struct decl *stringdecl(struct expr *); - -void emittentativedefns(void); diff --git a/deps.mk b/deps.mk index cb8f974..2765d8b 100644 --- a/deps.mk +++ b/deps.mk @@ -1,22 +1,18 @@ driver.o: driver.c util.h config.h util.o: util.c util.h -decl.o: decl.c util.h backend.h decl.h expr.h htab.h init.h pp.h scope.h \ - stmt.h token.h type.h -eval.o: eval.c util.h backend.h decl.h eval.h expr.h token.h type.h -expr.o: expr.c util.h decl.h eval.h expr.h init.h pp.h scope.h token.h \ - type.h +decl.o: decl.c util.h cc.h htab.h +eval.o: eval.c util.h cc.h +expr.o: expr.c util.h cc.h htab.o: htab.c util.h htab.h -init.o: init.c util.h decl.h expr.h init.h pp.h token.h type.h -main.o: main.c util.h arg.h decl.h pp.h scope.h token.h -pp.o: pp.c util.h pp.h scan.h token.h -scan.o: scan.c util.h scan.h token.h -scope.o: scope.c util.h decl.h htab.h scope.h type.h +init.o: init.c util.h cc.h +main.o: main.c util.h arg.h cc.h +pp.o: pp.c util.h cc.h +scan.o: scan.c util.h cc.h +scope.o: scope.c util.h cc.h htab.h siphash.o: siphash.c -stmt.o: stmt.c util.h backend.h decl.h expr.h pp.h scope.h stmt.h token.h \ - type.h +stmt.o: stmt.c util.h cc.h tree.o: tree.c util.h tree.h -token.o: token.c util.h token.h -type.o: type.c util.h backend.h type.h +token.o: token.c util.h cc.h +type.o: type.c util.h cc.h util.o: util.c util.h -qbe.o: qbe.c util.h backend.h decl.h eval.h expr.h htab.h init.h scope.h \ - token.h tree.h type.h ops.h +qbe.o: qbe.c util.h cc.h htab.h tree.h ops.h diff --git a/eval.c b/eval.c index f6334b6..209441d 100644 --- a/eval.c +++ b/eval.c @@ -2,12 +2,7 @@ #include #include #include "util.h" -#include "backend.h" -#include "decl.h" -#include "eval.h" -#include "expr.h" -#include "token.h" -#include "type.h" +#include "cc.h" static void binary(struct expr *expr, enum tokenkind op, struct expr *l, struct expr *r) diff --git a/eval.h b/eval.h deleted file mode 100644 index d28c37e..0000000 --- a/eval.h +++ /dev/null @@ -1 +0,0 @@ -struct expr *eval(struct expr *); diff --git a/expr.c b/expr.c index e8a1ff0..f0746aa 100644 --- a/expr.c +++ b/expr.c @@ -8,14 +8,7 @@ #include #include #include "util.h" -#include "decl.h" -#include "eval.h" -#include "expr.h" -#include "init.h" -#include "pp.h" -#include "scope.h" -#include "token.h" -#include "type.h" +#include "cc.h" static struct expr * mkexpr(enum exprkind k, struct type *t, enum exprflags flags) diff --git a/expr.h b/expr.h deleted file mode 100644 index e660848..0000000 --- a/expr.h +++ /dev/null @@ -1,94 +0,0 @@ -enum exprkind { - /* primary expression */ - EXPRIDENT, - EXPRCONST, - EXPRSTRING, - - /* postfix expression */ - EXPRCALL, - /* member E.M gets transformed to *(typeof(E.M) *)((char *)E + offsetof(typeof(E), M)) */ - EXPRINCDEC, - EXPRCOMPOUND, - /* subscript E1[E2] gets transformed to *((E1)+(E2)) */ - - EXPRUNARY, - EXPRCAST, - EXPRBINARY, - EXPRCOND, - EXPRASSIGN, - EXPRCOMMA, - - EXPRBUILTIN, - EXPRTEMP, -}; - -enum exprflags { - EXPRFLAG_LVAL = 1<<0, - EXPRFLAG_DECAYED = 1<<1, -}; - -struct expr { - enum exprkind kind; - enum exprflags flags; - struct type *type; - struct expr *next; - union { - struct { - struct decl *decl; - } ident; - union { - uint64_t i; - double f; - } constant; - struct { - char *data; - size_t size; - } string; - struct { - struct expr *func, *args; - size_t nargs; - } call; - struct { - struct init *init; - } compound; - struct { - int op; - _Bool post; - struct expr *base; - } incdec; - struct { - int op; - struct expr *base; - } unary; - struct { - struct expr *e; - } cast; - struct { - int op; - struct expr *l, *r; - } binary; - struct { - struct expr *e, *t, *f; - } cond; - struct { - struct expr *l, *r; - } assign; - struct { - struct expr *exprs; - } comma; - struct { - int kind; - struct expr *arg; - } builtin; - struct value *temp; - }; -}; - -struct scope; - -struct expr *expr(struct scope *); -struct expr *assignexpr(struct scope *); -uint64_t intconstexpr(struct scope *, _Bool); -void delexpr(struct expr *); - -struct expr *exprconvert(struct expr *, struct type *); diff --git a/init.c b/init.c index 1b0c5e0..44acd8f 100644 --- a/init.c +++ b/init.c @@ -6,12 +6,7 @@ #include #include #include "util.h" -#include "decl.h" -#include "expr.h" -#include "init.h" -#include "pp.h" -#include "token.h" -#include "type.h" +#include "cc.h" struct object { uint64_t offset; diff --git a/init.h b/init.h deleted file mode 100644 index 410b4d7..0000000 --- a/init.h +++ /dev/null @@ -1,11 +0,0 @@ -struct init { - uint64_t start, end; - struct expr *expr; - struct init *next; -}; - -struct scope; -struct type; - -struct init *mkinit(uint64_t, uint64_t, struct expr *); -struct init *parseinit(struct scope *, struct type *); diff --git a/main.c b/main.c index d526bae..dd7938f 100644 --- a/main.c +++ b/main.c @@ -5,10 +5,7 @@ #include #include "util.h" #include "arg.h" -#include "decl.h" -#include "pp.h" -#include "scope.h" -#include "token.h" +#include "cc.h" static noreturn void usage(void) diff --git a/pp.c b/pp.c index 2c47d59..757492b 100644 --- a/pp.c +++ b/pp.c @@ -1,12 +1,11 @@ #include #include +#include #include #include #include #include "util.h" -#include "pp.h" -#include "scan.h" -#include "token.h" +#include "cc.h" static struct token pending; diff --git a/pp.h b/pp.h deleted file mode 100644 index 462fd0c..0000000 --- a/pp.h +++ /dev/null @@ -1,8 +0,0 @@ -struct location; - -void ppinit(const char *); - -void next(void); -_Bool peek(int); -char *expect(int, const char *); -_Bool consume(int); diff --git a/qbe.c b/qbe.c index a40540a..bb223c2 100644 --- a/qbe.c +++ b/qbe.c @@ -6,16 +6,9 @@ #include #include #include "util.h" -#include "backend.h" -#include "decl.h" -#include "eval.h" -#include "expr.h" +#include "cc.h" #include "htab.h" -#include "init.h" -#include "scope.h" -#include "token.h" #include "tree.h" -#include "type.h" struct name { char *str; diff --git a/scan.c b/scan.c index 3c3b3da..f5ad2f9 100644 --- a/scan.c +++ b/scan.c @@ -1,12 +1,12 @@ #include #include #include +#include #include #include #include #include "util.h" -#include "scan.h" -#include "token.h" +#include "cc.h" struct buffer { char *str; diff --git a/scan.h b/scan.h deleted file mode 100644 index ebfd513..0000000 --- a/scan.h +++ /dev/null @@ -1,4 +0,0 @@ -struct token; - -int scanfrom(const char *file); -void scan(struct token *); diff --git a/scope.c b/scope.c index fac5cb8..1dc9f5c 100644 --- a/scope.c +++ b/scope.c @@ -3,10 +3,8 @@ #include #include #include "util.h" -#include "decl.h" +#include "cc.h" #include "htab.h" -#include "scope.h" -#include "type.h" struct scope filescope; diff --git a/scope.h b/scope.h deleted file mode 100644 index feb2e8b..0000000 --- a/scope.h +++ /dev/null @@ -1,22 +0,0 @@ -struct scope { - struct hashtable *tags; - struct hashtable *decls; - struct value *breaklabel; - struct value *continuelabel; - struct switchcases *switchcases; - struct scope *parent; -}; - -void scopeinit(void); -struct scope *mkscope(struct scope *); -struct scope *delscope(struct scope *); - -struct decl; -void scopeputdecl(struct scope *, const char *, struct decl *); -struct decl *scopegetdecl(struct scope *, const char *, _Bool); - -struct type; -void scopeputtag(struct scope *, const char *, struct type *); -struct type *scopegettag(struct scope *, const char *, _Bool); - -extern struct scope filescope; diff --git a/stmt.c b/stmt.c index 262f6a8..73e391c 100644 --- a/stmt.c +++ b/stmt.c @@ -5,14 +5,7 @@ #include #include #include "util.h" -#include "backend.h" -#include "decl.h" -#include "expr.h" -#include "pp.h" -#include "scope.h" -#include "stmt.h" -#include "token.h" -#include "type.h" +#include "cc.h" static bool gotolabel(struct func *f) diff --git a/stmt.h b/stmt.h deleted file mode 100644 index 668f769..0000000 --- a/stmt.h +++ /dev/null @@ -1,4 +0,0 @@ -struct func; -struct scope; - -void stmt(struct func *, struct scope *); diff --git a/token.c b/token.c index d118fd7..fe358a9 100644 --- a/token.c +++ b/token.c @@ -1,8 +1,9 @@ #include +#include #include #include #include "util.h" -#include "token.h" +#include "cc.h" struct token tok; diff --git a/token.h b/token.h deleted file mode 100644 index ad19311..0000000 --- a/token.h +++ /dev/null @@ -1,124 +0,0 @@ -enum tokenkind { - TNONE, - - TEOF, - TNEWLINE, - - TIDENT, - TNUMBER, - TCHARCONST, - TSTRINGLIT, - - /* keyword */ - TAUTO, - TBREAK, - TCASE, - TCHAR, - TCONST, - TCONTINUE, - TDEFAULT, - TDO, - TDOUBLE, - TELSE, - TENUM, - TEXTERN, - TFLOAT, - TFOR, - TGOTO, - TIF, - TINLINE, - TINT, - TLONG, - TREGISTER, - TRESTRICT, - TRETURN, - TSHORT, - TSIGNED, - TSIZEOF, - TSTATIC, - TSTRUCT, - TSWITCH, - TTYPEDEF, - TUNION, - TUNSIGNED, - TVOID, - TVOLATILE, - TWHILE, - T_ALIGNAS, - T_ALIGNOF, - T_ATOMIC, - T_BOOL, - T_COMPLEX, - T_GENERIC, - T_IMAGINARY, - T_NORETURN, - T_STATIC_ASSERT, - T_THREAD_LOCAL, - T__TYPEOF__, - - /* punctuator */ - TLBRACK, - TRBRACK, - TLPAREN, - TRPAREN, - TLBRACE, - TRBRACE, - TPERIOD, - TARROW, - TINC, - TDEC, - TBAND, - TMUL, - TADD, - TSUB, - TBNOT, - TLNOT, - TDIV, - TMOD, - TSHL, - TSHR, - TLESS, - TGREATER, - TLEQ, - TGEQ, - TEQL, - TNEQ, - TXOR, - TBOR, - TLAND, - TLOR, - TQUESTION, - TCOLON, - TSEMICOLON, - TELLIPSIS, - TASSIGN, - TMULASSIGN, - TDIVASSIGN, - TMODASSIGN, - TADDASSIGN, - TSUBASSIGN, - TSHLASSIGN, - TSHRASSIGN, - TBANDASSIGN, - TXORASSIGN, - TBORASSIGN, - TCOMMA, - THASH, - THASHHASH, -}; - -struct location { - const char *file; - size_t line, col; -}; - -struct token { - enum tokenkind kind; - struct location loc; - char *lit; -}; - -extern struct token tok; - -void tokprint(const struct token *); -_Noreturn void error(const struct location *, const char *, ...); diff --git a/type.c b/type.c index 43c74cd..89136ec 100644 --- a/type.c +++ b/type.c @@ -4,8 +4,7 @@ #include #include #include "util.h" -#include "backend.h" -#include "type.h" +#include "cc.h" struct type typevoid = {.kind = TYPEVOID, .incomplete = true}; diff --git a/type.h b/type.h deleted file mode 100644 index 6311f45..0000000 --- a/type.h +++ /dev/null @@ -1,125 +0,0 @@ -enum typequal { - QUALNONE, - - QUALCONST = 1<<1, - QUALRESTRICT = 1<<2, - QUALVOLATILE = 1<<3, - QUALATOMIC = 1<<4, -}; - -enum typekind { - TYPENONE, - - TYPEQUALIFIED, - TYPEVOID, - TYPEBASIC, - TYPEPOINTER, - TYPEARRAY, - TYPEFUNC, - TYPESTRUCT, - TYPEUNION, -}; - -enum typeprop { - PROPNONE, - - PROPOBJECT = 1<<0, - PROPCHAR = 1<<1, - PROPINT = 1<<2, - PROPREAL = 1<<3, - PROPARITH = 1<<4, - PROPSCALAR = 1<<5, - PROPAGGR = 1<<6, - PROPDERIVED = 1<<7, - PROPFLOAT = 1<<8, -}; - -struct param { - char *name; - struct type *type; - struct value *value; - struct param *next; -}; - -struct bitfield { - short before; /* number of bits in the storage unit before the bit-field */ - short after; /* number of bits in the storage unit after the bit-field */ -}; - -struct member { - char *name; - struct type *type; - uint64_t offset; - struct bitfield bits; - struct member *next; -}; - -struct type { - enum typekind kind; - int align; - uint64_t size; - struct repr *repr; - union { - struct type *base; - struct list link; /* used only during construction of type */ - }; - _Bool incomplete; - union { - struct { - enum typequal kind; - } qualified; - struct { - enum { - BASICBOOL, - BASICCHAR, - BASICSHORT, - BASICINT, - BASICENUM, - BASICLONG, - BASICLONGLONG, - BASICFLOAT, - BASICDOUBLE, - BASICLONGDOUBLE, - } kind; - _Bool issigned, iscomplex; - } basic; - struct { - uint64_t length; - } array; - struct { - _Bool isprototype, isvararg, isnoreturn, paraminfo; - struct param *params; - } func; - struct { - char *tag; - struct member *members; - } structunion; - }; -}; - -struct type *mktype(enum typekind); -struct type *mkqualifiedtype(struct type *, enum typequal); -struct type *mkpointertype(struct type *); -struct type *mkarraytype(struct type *, uint64_t); - -_Bool typecompatible(struct type *, struct type *); -_Bool typesame(struct type *, struct type *); -struct type *typecomposite(struct type *, struct type *); -struct type *typeunqual(struct type *, enum typequal *); -struct type *typecommonreal(struct type *, struct type *); -struct type *typeargpromote(struct type *); -struct type *typeintpromote(struct type *); -enum typeprop typeprop(struct type *); -struct member *typemember(struct type *, const char *, uint64_t *); - -struct param *mkparam(char *, struct type *); - -extern struct type typevoid; -extern struct type typebool; -extern struct type typechar, typeschar, typeuchar; -extern struct type typeshort, typeushort; -extern struct type typeint, typeuint; -extern struct type typelong, typeulong; -extern struct type typellong, typeullong; -extern struct type typefloat, typedouble, typelongdouble; -extern struct type typevalist, typevalistptr; -- cgit v1.2.3