URI:
       cc1.h - scc - simple c99 compiler
  HTML git clone git://git.simple-cc.org/scc
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       cc1.h (9953B)
       ---
            1 #include <stdint.h>
            2 
            3 #define INPUTSIZ LINESIZ
            4 
            5 #define GLOBALCTX 0
            6 #define PARAMCTX  1
            7 
            8 #define NR_USWITCHES 20
            9 
           10 #define FAIL   1
           11 #define NOFAIL 0
           12 
           13 #define EQUAL  0
           14 #define EQUIV  1
           15 
           16 /*
           17  * Definition of enumerations
           18  */
           19 enum {
           20         NOALLOC,
           21         ALLOC
           22 };
           23 
           24 enum typeprops {
           25         TDEFINED = 1 << 0,    /* type defined */
           26         TSIGNED  = 1 << 1,    /* signedness of the type */
           27         TINTEGER = 1 << 2,    /* the type is INT or ENUM */
           28         TARITH   = 1 << 3,    /* the type is INT, ENUM or FLOAT */
           29         TAGGREG  = 1 << 4,    /* the type is STRUCT or UNION */
           30         TK_R     = 1 << 5,    /* this is a K&R-function */
           31         TELLIPSIS= 1 << 6,    /* this function has an ellipsis par */
           32         TFUNDEF  = 1 << 7,    /* function definition */
           33 };
           34 
           35 enum inputtype {
           36         IMACRO = 1 << 0,      /* macro expansion type */
           37         IFILE  = 1 << 1,      /* input file type */
           38         ISTDIN = 1 << 2,      /* stdin type */
           39         IPARAM = 1 << 3,      /* macro param expansion */
           40         IEOF   = 1 << 4,      /* EOF mark */
           41         ITYPE  = IMACRO | IFILE | ISTDIN | IPARAM,
           42 };
           43 
           44 /* data type letters */
           45 enum ns {
           46         L_INT8      = 'C',
           47         L_INT16     = 'I',
           48         L_INT32     = 'W',
           49         L_INT64     = 'Q',
           50         L_UINT8     = 'K',
           51         L_UINT16    = 'N',
           52         L_UINT32    = 'Z',
           53         L_UINT64    = 'O',
           54         L_BOOL      = 'B',
           55 
           56         L_FLOAT     = 'J',
           57         L_DOUBLE    = 'D',
           58         L_LDOUBLE   = 'H',
           59 
           60         L_ELLIPSIS  = 'E',
           61         L_VOID      = '0',
           62         L_POINTER   = 'P',
           63         L_FUNCTION  = 'F',
           64         L_ARRAY     = 'V',
           65         L_UNION     = 'U',
           66         L_STRUCT    = 'S',
           67         L_VA_ARG    = '1',
           68 };
           69 
           70 /* recovery points */
           71 enum {
           72         END_DECL,
           73         END_LDECL,
           74         END_COMP,
           75         END_COND
           76 };
           77 
           78 /* type constructors */
           79 enum typeop {
           80         FTN = 1,
           81         PTR,
           82         ARY,
           83         KRFTN
           84 };
           85 
           86 /* namespaces */
           87 enum namespaces {
           88         NS_DUMMY,
           89         NS_IDEN,
           90         NS_TAG,
           91         NS_LABEL,
           92         NS_CPP,
           93         NS_KEYWORD,
           94         NS_CPPCLAUSES,
           95         NS_MACROPAR,
           96 
           97         /*
           98          * This must be the last constant of the enum definition
           99          * because it marks the beginning of the independent
          100          * struct namespaces
          101          */
          102         NS_STRUCTS,
          103 };
          104 
          105 /* symbol flags */
          106 enum {
          107         SAUTO     = 1 << 0,
          108         SREGISTER = 1 << 1,
          109         SDECLARED = 1 << 2,
          110         SFIELD    = 1 << 3,
          111         SEXTERN   = 1 << 4,
          112         SUSED     = 1 << 5,
          113         SCONSTANT = 1 << 6,
          114         SGLOBAL   = 1 << 7,
          115         SPRIVATE  = 1 << 8,
          116         SLOCAL    = 1 << 9,
          117         SEMITTED  = 1 << 10,
          118         SDEFINED  = 1 << 11,
          119         SRSTRING  = 1 << 11,
          120         SSTRING   = 1 << 12,
          121         STYPEDEF  = 1 << 13,
          122         SINITLST  = 1 << 14,
          123         SHASINIT  = 1 << 15,
          124         SVARIADIC = 1 << 15,
          125 };
          126 
          127 /* node flags */
          128 enum {
          129         NLVAL   = 1 << 0,
          130         NCONST  = 1 << 1,
          131         NEFFECT = 1 << 2,
          132         NDECAY  = 1 << 3,
          133 };
          134 
          135 /* lexer mode, compiler or preprocessor directive */
          136 enum {
          137         CCMODE,
          138         CPPMODE
          139 };
          140 
          141 /* input tokens */
          142 enum tokens {
          143         CONST      = 1 << 0,      /* type qualifier tokens are used as flags */
          144         RESTRICT   = 1 << 1,
          145         VOLATILE   = 1 << 2,
          146         INLINE     = 1 << 3,
          147         TQUALIFIER = 1 << 7,
          148         MACROPAR   = 17,
          149         CONCAT     = 18,
          150         STRINGIZE  = 19,
          151         NOEXPAND   = 20,
          152         EXPAND     = 21,
          153         TYPE       = 129,
          154         IDEN,
          155         SCLASS,
          156         CONSTANT,
          157         STRING,
          158         SIZEOF,
          159         INDIR,
          160         INC,
          161         DEC,
          162         SHL,
          163         SHR,
          164         LE,
          165         GE,
          166         EQ,
          167         NE,
          168         AND,
          169         OR,
          170         MUL_EQ,
          171         DIV_EQ,
          172         MOD_EQ,
          173         ADD_EQ,
          174         SUB_EQ,
          175         AND_EQ,
          176         XOR_EQ,
          177         OR_EQ,
          178         SHL_EQ,
          179         SHR_EQ,
          180         ELLIPSIS,
          181         CASE,
          182         DEFAULT,
          183         IF,
          184         ELSE,
          185         SWITCH,
          186         WHILE,
          187         DO,
          188         FOR,
          189         GOTO,
          190         VOID,
          191         FLOAT,
          192         INT,
          193         BOOL,
          194         VA_LIST,
          195         STRUCT,
          196         UNION,
          197         CHAR,
          198         DOUBLE,
          199         SHORT,
          200         LONG,
          201         LLONG,
          202         COMPLEX,
          203         TYPEDEF,
          204         EXTERN,
          205         STATIC,
          206         AUTO,
          207         REGISTER,
          208         ENUM,
          209         TYPEIDEN,
          210         UNSIGNED,
          211         SIGNED,
          212         CONTINUE,
          213         BREAK,
          214         RETURN,
          215         DEFINE,
          216         DEFINED,
          217         INCLUDE,
          218         LINE,
          219         PRAGMA,
          220         ERROR,
          221         IFDEF,
          222         ELIF,
          223         IFNDEF,
          224         UNDEF,
          225         ENDIF,
          226         BUILTIN,
          227         EOFTOK
          228 };
          229 
          230 /* operations */
          231 enum op {
          232         OADD,
          233         OMUL,
          234         OSUB,
          235         OINC,
          236         ODEC,
          237         ODIV,
          238         OMOD,
          239         OSHL,
          240         OSHR,
          241         OBAND,
          242         OBXOR,
          243         OBOR,
          244         OSNEG,
          245         ONEG,
          246         OCPL,
          247         OAND,
          248         OOR,
          249         OEQ,
          250         ONE,
          251         OLT,
          252         OGE,
          253         OLE,
          254         OGT,
          255         OASSIGN,
          256         OA_MUL,
          257         OA_DIV,
          258         OA_MOD,
          259         OA_ADD,
          260         OA_SUB,
          261         OA_SHL,
          262         OA_SHR,
          263         OA_AND,
          264         OA_XOR,
          265         OA_OR,
          266         OADDR,
          267         OCOMMA,
          268         OCAST,
          269         OPTR,
          270         OSYM,
          271         OASK,
          272         OCOLON,
          273         OFIELD,
          274         OLABEL,
          275         ODEFAULT,
          276         OCASE,
          277         OJUMP,
          278         OBRANCH,
          279         OEXPR,
          280         OEFUN,
          281         OELOOP,
          282         OBLOOP,
          283         OFUN,
          284         OPAR,
          285         OCALL,
          286         OCALLE,
          287         ORET,
          288         ODECL,
          289         OBSWITCH,
          290         OESWITCH,
          291         OINIT,
          292         OBUILTIN,
          293         OTYP,
          294 };
          295 
          296 /*
          297  * Definition of structures
          298  */
          299 typedef struct type Type;
          300 typedef struct symbol Symbol;
          301 typedef struct swtch Switch;
          302 typedef struct node Node;
          303 typedef struct macro Macro;
          304 typedef struct input Input;
          305 typedef struct arch Arch;
          306 typedef uint32_t Rune;
          307 
          308 struct limits {
          309         union {
          310                 unsigned long long i;
          311                 double f;
          312         } max;
          313         union {
          314                 unsigned long long i;
          315                 double f;
          316         } min;
          317 };
          318 
          319 struct builtin {
          320         char *str;
          321         Node *(*fun)(Symbol *);
          322 };
          323 
          324 struct type {
          325         unsigned char op;           /* type builder operator */
          326         int ns;                     /* namespace for struct members */
          327         short id;                   /* type id, used in dcls */
          328         char letter;                /* letter of the type */
          329         unsigned char prop;         /* type properties */
          330         unsigned char align;        /* align of the type */
          331         unsigned long size;         /* sizeof the type */
          332         Type *type;                 /* base type */
          333         Symbol *tag;                /* symbol of the strug tag */
          334         union {
          335                 Type **pars;            /* Function type parameters */
          336                 Symbol **fields;        /* fields of aggregate type */
          337         } p;
          338         union {
          339                 unsigned char rank;     /* conversion rank */
          340                 long long elem;         /* number of type parameters */
          341         } n;
          342         Type *next;                 /* local list pointer */
          343         Type *h_next;               /* hash collision list */
          344 };
          345 
          346 struct symbol {
          347         unsigned char ctx;
          348         unsigned char hide;
          349         int ns;
          350         unsigned short id;
          351         unsigned short flags;
          352         char *name;
          353         Type *type;
          354         unsigned char token;
          355         union {
          356                 long long i;
          357                 unsigned long long u;
          358                 float f;
          359                 double d;
          360                 long double ld;
          361                 char *s;
          362                 Rune *rs;
          363                 unsigned char token;
          364                 Node **init;
          365                 Symbol **pars;
          366                 Node *(*fun)(Symbol *);
          367         } u;
          368         struct symbol *next;
          369         struct symbol *hash;
          370 };
          371 
          372 struct node {
          373         unsigned char op;
          374         unsigned char flags;
          375         Type *type;
          376         Symbol *sym;
          377         struct node *left, *right;
          378 };
          379 
          380 struct swtch {
          381         short nr;
          382         char hasdef;
          383 };
          384 
          385 struct arch {
          386         Type voidtype;
          387         Type pvoidtype;
          388         Type booltype;
          389         Type schartype;
          390         Type uchartype;
          391         Type chartype;
          392         Type ushorttype;
          393         Type shorttype;
          394         Type uinttype;
          395         Type inttype;
          396         Type longtype;
          397         Type ulongtype;
          398         Type ullongtype;
          399         Type llongtype;
          400         Type floattype;
          401         Type doubletype;
          402         Type ldoubletype;
          403         Type sizettype;
          404         Type pdifftype;
          405         Type ellipsistype;
          406         Type va_type;
          407         Type va_list_type;
          408         Type wchartype;
          409 
          410         int (*valid_va_list)(Type *tp);
          411 };
          412 
          413 struct yystype {
          414         Symbol *sym;
          415         Symbol *cppsym;
          416         unsigned char token;
          417 };
          418 
          419 #ifdef NR_MACROARG
          420 struct macro {
          421         Symbol *sym;
          422         char *fname;
          423         char **arglist;
          424         char *buffer;
          425         char *def;
          426         char *arg;
          427         int bufsiz;
          428         int argsiz;
          429         int npars;
          430         Symbol *hideset[NR_MACROARG];
          431 };
          432 #endif
          433 
          434 #if defined(stdin) && defined(NR_MACROARG)
          435 struct input {
          436         char flags;
          437         unsigned lineno;
          438         char *filenam;
          439         FILE *fp;
          440         Macro *macro;
          441         char *line, *begin, *p;
          442         Symbol *hideset[NR_MACROARG];
          443         struct input *next;
          444 };
          445 #endif
          446 
          447 /* error.c */
          448 void error(char *, ...);
          449 void warn(char *, ...);
          450 void unexpected(void);
          451 void errorp(char *, ...);
          452 void cpperror(char *, ...);
          453 Type *deftype(Type *);
          454 
          455 /* types.c */
          456 int eqtype(Type *, Type *, int);
          457 Type *ctype(int, int, int);
          458 Type *mktype(Type *, int, long long, Type *[]);
          459 Type *duptype(Type *);
          460 struct limits *getlimits(Type *);
          461 void typesize(Type *);
          462 void flushtypes(void);
          463 
          464 /* symbol.c */
          465 void dumpstab(Symbol **, char *);
          466 Symbol *lookup(int, char *, int);
          467 Symbol *nextsym(Symbol *, int);
          468 Symbol *install(int, Symbol *);
          469 Symbol *newsym(int, char *);
          470 void pushctx(void), popctx(void);
          471 void killsym(Symbol *);
          472 Symbol *newlabel(void);
          473 void builtins(struct builtin *);
          474 Symbol *newstring(char *, size_t);
          475 Symbol *newrstring(Rune *, size_t);
          476 unsigned newid(void);
          477 void isyms(void);
          478 
          479 /* stmt.c */
          480 void compound(Symbol *, Symbol *, Switch *);
          481 
          482 /* decl.c */
          483 Type *typename(void);
          484 void decl(void);
          485 
          486 /* lex.c */
          487 int ahead(void);
          488 int next(void);
          489 void expect(int);
          490 void discard(void);
          491 int moreinput(void);
          492 int addinput(int, void *, int);
          493 void delinput(void);
          494 void setsafe(int);
          495 void setloc(char *, unsigned);
          496 #define accept(t) ((yytoken == (t)) ? next() : 0)
          497 
          498 /* code.c */
          499 Node *prtree(char *, Node *);
          500 void emit(int, void *);
          501 Node *node(int, Type *, Node *, Node *);
          502 Node *varnode(Symbol *);
          503 Node *constnode(Symbol *);
          504 Node *sizeofnode(Type *);
          505 Node *offsetnode(Symbol *,  Type *);
          506 Node *addrnode(unsigned long long);
          507 void freetree(Node *);
          508 void icode(void);
          509 Node *zeronode(Type *);
          510 
          511 /* fold.c */
          512 Node *simplify(Node *);
          513 unsigned long long ones(int);
          514 
          515 /* expr.c */
          516 Node *decay(Node *), *negate(Node *np), *assign(void);
          517 Node *convert(Node *, Type *, int);
          518 Node *iconstexpr(void), *condexpr(int), *expr(void);
          519 int isnodecmp(int);
          520 int negop(int);
          521 int cmpnode(Node *, unsigned long long);
          522 int power2node(Node *, int *);
          523 
          524 /* init.c */
          525 void initializer(Symbol *);
          526 
          527 /* cpp.c */
          528 void icpp(void);
          529 int cpp(void);
          530 int expand(Symbol *);
          531 void incdir(char *);
          532 void outcpp(void);
          533 void defdefine(char *, char *, char *);
          534 void undefmacro(char *);
          535 void ppragmaln(void);
          536 void delmacro(Macro *);
          537 void sethideset(Input *), unsethideset(Input *);
          538 Macro *newmacro(Symbol *);
          539 Node *defined(void);
          540 
          541 
          542 /* builtin.c */
          543 void ibuilts(void);
          544 
          545 /* arch.c */
          546 void iarch(void);
          547 int valid_va_list(Type *);
          548 
          549 /* architectures */
          550 Arch *amd64_sysv(void);
          551 Arch *z80_scc(void);
          552 Arch *arm64_sysv(void);
          553 Arch *riscv64_sysv(void);
          554 Arch *i386_sysv(void);
          555 
          556 /*
          557  * Definition of global variables
          558  */
          559 extern struct yystype yylval;
          560 extern char yytext[];
          561 extern int yytoken, yyspace;
          562 extern unsigned short yylen;
          563 extern int disexpand, disstring;
          564 extern unsigned cppctx;
          565 extern Input *input;
          566 extern int lexmode, namespace;
          567 extern int onlycpp, onlyheader;
          568 extern unsigned curctx;
          569 extern Symbol *curfun, *zero, *one;
          570 extern unsigned lineno;
          571 extern char filenam[];
          572 extern char *architecture;
          573 
          574 extern Type *voidtype, *pvoidtype, *booltype,
          575             *uchartype,   *chartype, *schartype,
          576             *uinttype,    *inttype,
          577             *sizettype, *pdifftype,
          578             *ushorttype,   *shorttype,
          579             *longtype,    *ulongtype,
          580             *ullongtype,  *llongtype,
          581             *floattype,   *doubletype,  *ldoubletype,
          582             *ellipsistype, *va_list_type, *va_type,
          583             *wchartype;