view mc.h @ 901:8bdd5061cb8f

RSTRUCT removal (at last)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Apr 2014 11:10:41 +0900
parents 5313ed059cee
children
line wrap: on
line source

/* Micro-C header file */


/************************************************************************
** Copyright (C) 2006 Shinji Kono
** 連絡先: 琉球大学情報工学科 河野 真治  
** (E-Mail Address: kono@ie.u-ryukyu.ac.jp)
**
**    このソースのいかなる複写,改変,修正も許諾します。ただし、
**    その際には、誰が貢献したを示すこの部分を残すこと。
**    再配布や雑誌の付録などの問い合わせも必要ありません。
**    営利利用も上記に反しない範囲で許可します。
**    バイナリの配布の際にはversion messageを保存することを条件とします。
**    このプログラムについては特に何の保証もしない、悪しからず。
**
**    Everyone is permitted to do anything on this program 
**    including copying, modifying, improving,
**    as long as you don't try to pretend that you wrote it.
**    i.e., the above copyright notice has to appear in all copies.  
**    Binary distribution requires original version messages.
**    You don't have to ask before copying, redistribution or publishing.
**    THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
***********************************************************************/

#define FLOAT_CODE 1
#define LONGLONG_CODE 1
#define CASE_CODE 1
#define ASM_CODE 1
#define BIT_FIELD_CODE 1
#define STRUCT_ALIGN 1


/* reserved word start */

/* type ( keyword ) */

#define INT     (-1)
#define UNSIGNED        (-2)
#define CHAR    (-3)
#define UCHAR   (-4)
#define POINTER (-5)
#define ARRAY   (-6)
#define STRUCT  (-7)
#define UNION   (-8)
#define FUNCTION        (-9)

#define SIGNED  (-10)
#define LONG    (-11)
#define SHORT   (-12)
#define USHORT  (-13)
#define VOID    (-14)
#define CODE    (-15)
#define ENUM    (-16)

#define FLOAT   (-17)
#define DOUBLE  (-18)
#define LONGLONG        (-19)
#define ULONGLONG       (-20)

/* type qualifier */

#define KONST   (-21)
#define STATIC  (-22)
#define EXTRN   (-23)
#define EXTRN1  (-24)
#define VOLATILE        (-25)
#define RESTRICT        (-26)
#define INLINE  (-27)
#define NOINLINE  (-28)
#define REGISTER        (-29)
#define FREGISTER       (-30)
#define DREGISTER       (-31)
#define LREGISTER       (-32)
#define POSSIBLE_VALUES       (-33)

#define DOTS    (-34)

/* keyword */

#define GOTO    (-35)
#define RETURN  (-36)
#define BREAK   (-37)
#define CONTINUE        (-38)
#define IF      (-39)
#define ELSE    (-40)
#define FOR     (-41)
#define DO      (-42)
#define WHILE   (-43)
#define SWITCH  (-44)
#define CASE    (-45)
#define DEFAULT (-46)
#define RESERVE (-47)
#define TAG     (-48)
#define FIELD   (-49)
#define IDENT   (-50)
#define MACRO   (-51)
#define BLABEL  (-52)
#define FLABEL  (-53)
#define TYPEDEF (-54)
#define SIZEOF  (-55)
#define TYPE    (-56)
#define DEFINED (-57)

#define ENVIRONMENT     (-58)

#define FMACRO  (-59)
#define LMACRO  (-60)

#define TYPEOF  (-61)
#define ASM     (-62)

#define C_FILE     (-63)
#define C_FUNCTION     (-64)
#define C_LINE     (-65)

#define ALIGNED     (-66)
#define GENERATED     (-67)
#define NORETURN     (-68)
#define ALWAYS_INLINE     (-67)

/* reserved word end */

#define EMPTY   (-99)

/* mode start */
#define TOP     0
#define GDECL   1
#define GSDECL  2
#define GUDECL  3
#define ADECL   4
#define LDECL   5
#define LSDECL  6
#define LUDECL  7
#define STADECL 8
#define STAT    9
#define GTDECL  10
#define LTDECL  11
#define IFDEF   12
#define MDECL   13
#define GEDECL  14
#define LEDECL  15
#define LLDECL  16
#define SFDINIT 17
/* mode end */

#define US      1
#define AS      10000
#define SOP     200
#define COP     400
#define DOP     600
#define FOP     800
#define LOP     1000

/* tree node tags start */

#define LIST_ARGS(i) (i==FUNCTION||i==CODE||i==ASM)
#define OP(i)   (i%SOP)                   /* tag value without attribute */
#define OP_TAG(i)   (((i)/SOP)*SOP)       /* attribute of tag */

/* nullary  argments */

#define GVAR    1
#define RGVAR   2
#define URGVAR  3
#define LVAR    4
#define RLVAR   5
#define URLVAR  6
#define CRGVAR  (COP+RGVAR)
#define CURGVAR (COP+URGVAR)
#define CRLVAR  (COP+RLVAR)
#define CURLVAR (COP+URLVAR)
#define FRGVAR  (FOP+RGVAR)
#define FRLVAR  (FOP+RLVAR)
#define DRGVAR  (DOP+RGVAR)
#define DRLVAR  (DOP+RLVAR)
#define SRGVAR  (SOP+RGVAR)
#define SURGVAR (SOP+URGVAR)
#define SRLVAR  (SOP+RLVAR)
#define SURLVAR (SOP+URLVAR)
#define LRGVAR  (LOP+RGVAR)
#define LURGVAR (LOP+URGVAR)
#define LRLVAR  (LOP+RLVAR)
#define LURLVAR (LOP+URLVAR)

#define CONST   7
#define DCONST  (DOP+CONST)
#define FCONST  (FOP+CONST)
#define LCONST  (LOP+CONST)
#define STRING  8
#define FNAME   9
#define LCALL   10
#define COMMENT         11
#define DECL    12
#define COMP    13
#define IVAR    14
#define RIVAR   15
#define BUILTIN_INF     16
#define BUILTIN_INFF    17
#define BUILTIN_INFL    18
#define LABEL   19
#define STRINGS 20

#define NULLARY_ARGS(i) (i==RETURN||i==ENVIRONMENT||i==LCALL||i==REGISTER||i==DREGISTER||i==FREGISTER||i==LREGISTER||(GVAR<=(i%SOP)&&(i%SOP)<=LABEL))

/* unary  argments */

#define ADDRESS 21
#define MINUS   22
#define LNOT    23
#define BNOT    24
#define INC     25
#define PERIOD  26
#define ARROW   27
#define POSTINC 28
#define UPOSTINC        29
#define PREINC  30
#define UPREINC 31
#define POSTDEC 32
#define UPOSTDEC        33
#define PREDEC  34
#define UPREDEC 35
#define DEC     36
#define CPOSTINC (COP+POSTINC)
#define CUPOSTINC (COP+UPOSTINC)
#define CPREINC (COP+PREINC)
#define CUPREINC (COP+UPREINC)
#define CPOSTDEC (COP+POSTDEC)
#define CUPOSTDEC (COP+UPOSTDEC)
#define CPREDEC (COP+CPREDEC)
#define CUPREDEC (COP+UPREDEC)
#define SPOSTINC (SOP+POSTINC)
#define SUPOSTINC (SOP+UPOSTINC)
#define SPREINC (SOP+PREINC)
#define SUPREINC (SOP+UPREINC)
#define SPOSTDEC (SOP+POSTDEC)
#define SUPOSTDEC (SOP+UPOSTDEC)
#define SPREDEC (SOP+PREDEC)
#define SUPREDEC (SOP+UPREDEC)
#define FPOSTINC        (FOP+POSTINC)
#define FPREINC (FOP+PREINC)
#define DPOSTINC        (DOP+POSTINC)
#define DPREINC (DOP+PREINC)
#define LPOSTINC        (LOP+POSTINC)
#define LPREINC (LOP+PREINC)
#define LUPOSTINC       (LOP+UPOSTINC)
#define LUPREINC        (LOP+UPREINC)
#define INDIRECT        37
#define RINDIRECT       38
#define URINDIRECT      39
#define CRINDIRECT      (COP+RINDIRECT)
#define CURINDIRECT     (COP+URINDIRECT)
#define SRINDIRECT      (SOP+RINDIRECT)
#define SURINDIRECT     (SOP+URINDIRECT)
#define FRINDIRECT      (FOP+RINDIRECT)
#define DRINDIRECT      (DOP+RINDIRECT)
#define LRINDIRECT      (LOP+RINDIRECT)
#define LURINDIRECT     (LOP+URINDIRECT)
#define ALLOCA  41
#define BUILTINP        42
#define BUILTIN_EXPECT  43
#define BUILTIN_FABS    44
#define BUILTIN_FABSF   45
#define BUILTIN_FABSL   46
#define ATTRIBUTE       47
#define BIT_FIELD       48
#define RBIT_FIELD      49
#define BPREINC         50
#define BPOSTINC        51
#define CAST    52
#define DECL_DATA       53
#define CONV    54

#define UNARY_ARGS(i) (ADDRESS<=(i%SOP)&&(i%SOP)<=CONV)

/* binary  argments */

#define MUL     55
#define UMUL    56
#define DIV     57
#define UDIV    58
#define MOD     59
#define UMOD    60
#define ADD     61
#define SUB     62
#define CMP     63      
#define RSHIFT  64
#define URSHIFT 65
#define LSHIFT  66
#define ULSHIFT 67
#define GT      68
#define UGT     69
#define GE      70
#define UGE     71
#define LT      72
#define ULT     73
#define LE      74
#define ULE     75
#define EQ      76
#define NEQ     77
#define BAND    78
#define EOR     79
#define BOR     80
#define LAND    81
#define LOR     82
#define ASS     83
#define UCMP    84
#define UCMPGE  85
#define CMPGE   86
#define CMPEQ   87
#define CMPNEQ  88
#define ASSOP   89
#define UASSOP  90
#define COMMA   91

#define CASS    (COP+ASS)
#define CASSOP  (COP+ASSOP)
#define CUASSOP (COP+UASSOP)

#define SASS    (SOP+ASS)
#define SASSOP (SOP+ASSOP)
#define SUASSOP (SOP+UASSOP)

#define DASS    (DOP+ASS)
#define DCMPGE  (DOP+CMPGE)
#define DCMPEQ  (DOP+CMPEQ)
#define DCMPNEQ (DOP+CMPNEQ)
#define DASSOP  (DOP+ASSOP)
#define DCMP    (DOP+CMP)
#define DMINUS  (DOP+MINUS)
#define DMUL    (DOP+MUL)
#define DDIV    (DOP+DIV)
#define DADD    (DOP+ADD)
#define DSUB    (DOP+SUB)

#define FASS    (FOP+ASS)
#define FCMPGE  (FOP+CMPGE)
#define FCMPEQ  (FOP+CMPEQ)
#define FCMPNEQ (FOP+CMPNEQ)
#define FASSOP  (FOP+ASSOP)
#define FCMP    (FOP+CMP)
#define FMINUS  (FOP+MINUS)
#define FMUL    (FOP+MUL)
#define FDIV    (FOP+DIV)
#define FADD    (FOP+ADD)
#define FSUB    (FOP+SUB)

#define LASS    (LOP+CASS)
#define LCMPGE  (LOP+CMPGE)
#define LCMPEQ  (LOP+CMPEQ)
#define LCMPNEQ (LOP+CMPNEQ)
#define LASSOP  (LOP+CASSOP)
#define LUASSOP (LOP+CUASSOP)
#define LCMP    (LOP+CMP)
#define LMINUS  (LOP+MINUS)
#define LMUL    (LOP+MUL)
#define LDIV    (LOP+DIV)
#define LUMUL   (LOP+UMUL)
#define LUDIV   (LOP+UDIV)
#define LADD    (LOP+ADD)
#define LSUB    (LOP+SUB)


#define LMOD    (LOP+MOD)
#define LUMOD   (LOP+UMOD)
#define LLSHIFT (LOP+LSHIFT)
#define LULSHIFT        (LOP+ULSHIFT)
#define LRSHIFT (LOP+RSHIFT)
#define LURSHIFT        (LOP+URSHIFT)
#define LBAND   (LOP+BAND)
#define LEOR    (LOP+EOR)
#define LBOR    (LOP+BOR)

#define BASS    92
#define BASSOP  93
#define BFD_REPL        94

#define JUMP    95
#define DECL_DATA_ARRAY         96
#define DECL_DATA_LIST          97
#define DECL_DATA_FIELD         98

#define STASS   99


#define BINARY_ARGS(i) ((MUL<=(i%SOP)&&(i%SOP)<=STASS)||i==ARRAY)

/* ternary  argments */

#define COND    100
#define UCOND   101
#define SCOND   (SOP+COND)
#define SUCOND   (SOP+UCOND)
#define DCOND   (DOP+COND)
#define FCOND   (FOP+COND)
#define LCOND   (LOP+COND)
#define LUCOND  (LOP+UCOND)

#define TERNARY_ARGS(i) (COND==(i%SOP)||UCOND==(i%SOP))

/* not appeared as tags */

#define LPAR    102
#define RPAR    103
#define LBRA    104
#define RBRA    105
#define LC      106
#define RC      107
#define COLON   108
#define SM      109
#define CNAME   110

#define I2C     111
#define I2S     112
#define I2I     113
#define I2U     114
#define I2D     115
#define I2F     116
#define I2LL    117
#define I2ULL   118

#define U2UC    119
#define U2US    120
#define U2I     121
#define U2U     122
#define U2D     123
#define U2F     124
#define U2LL    125
#define U2ULL   126


#define D2I     (DOP+I2I)
#define D2U     (DOP+I2U)
#define D2D     (DOP+I2D)
#define D2F     (DOP+I2F)
#define D2LL    (DOP+I2LL)
#define D2ULL   (DOP+I2ULL)

#define F2I     (FOP+I2I)
#define F2U     (FOP+I2U)
#define F2D     (FOP+I2D)
#define F2F     (FOP+I2F)
#define F2LL    (FOP+I2LL)
#define F2ULL   (FOP+I2ULL)

#define LL2I    (LOP+I2I)
#define LL2U    (LOP+I2U)
#define LL2D    (LOP+I2D)
#define LL2F    (LOP+I2F)
#define LL2LL   (LOP+I2LL)
#define LL2ULL  (LOP+I2ULL)

#define ULL2I   (LOP+U2I)
#define ULL2U   (LOP+U2U)
#define ULL2D   (LOP+U2D)
#define ULL2F   (LOP+U2F)
#define ULL2LL  (LOP+U2LL)
#define ULL2ULL (LOP+U2ULL)

#define BUILTIN_TYPES_COMPATIBLE_P      127

/* tree node tags end */

/* statement start */

#define ST_DECL         128
#define ST_IF           129
#define ST_DO           130
#define ST_WHILE        131
#define ST_FOR          132
#define ST_SWITCH       133
#define ST_COMP         134
#define ST_BREAK        135
#define ST_CONTINUE     136
#define ST_CASE         137
#define ST_DEFAULT      138
#define ST_RETURN       139
#define ST_GOTO         140
#define ST_ASM          141
#define ST_LABEL        142
#define ST_OP           143
#define ST_COMMENT      144

#define IS_STATEMENT(i) (i==INLINE||(ST_DECL<=i&&i<=ST_COMMENT))

#define HAS_ADDRESS     145

/* statement end */

/* error number start */

#define FILERR  1
#define DCERR   2
#define RDERR   3
#define STERR   4
#define EXERR   5
#define CNERR   6
#define CHERR   7
#define GSERR   8
#define LSERR   9
#define STRERR  10
#define LNERR   11
#define EOFERR  12
#define MCERR   13
#define INCERR  14
#define HPERR   15
#define TYERR   16
#define LVERR   17
#define UDERR   18
#define OPTION  19
#define REG_ERR 20
#define RGERR 21
#define CODE_ERR        22
#define MSERR   23
#define BTERR   24
#define HSERR   25
#define NMERR   26
#define MMERR   27
#define INERR   28
#define AGERR   29
#define ILERR   30
#define CSERR   31
#define GTERR   32
#define FNERR   33
#define UCERR   34
#define UFERR   35
#define ENERR   36
#define RETERR   37
#define UFLDERR   38
#define SIERR   39

/* error number end */

/* ctmode bit */

#define KONST_BIT       1
#define VOLATILE_BIT    2
#define RESTRICT_BIT    4

#define FILES 10
#define MAX_INCLUDE_PATH_COUNT 10
/*
    For this comiler 8192*2 is Ok. Linux kernel requires 8192*4.
       we need automatic increment of gsyms?
 */
#define GSYMS           (8192*32)
#define HEAPSIZE        150000
#define CHEAPSIZE       (sizeof(NMTBL)*8192)
#define LBUFSIZE        4096
#define STRSIZE         4096

typedef struct nametable {
        char *nm;
        struct nametable *next;
        int sc,attr;
        int ty,dsp; 
        union {
            struct nametable *nptr;
            char *nm;
        } u;
} NMTBL;

extern int *heap;                   /* heap area (in cheap ) */
extern NMTBL *global_list;          /* list of all global NMTBL */
extern NMTBL *local_static_list;    /* list of local static variable */

#if FLOAT_CODE
extern int dlist2(int e1, double e2);
#endif
#if LONGLONG_CODE
extern int llist2(int e1, long long e2);
#endif
extern int list2(int e1, int e2);
extern int list3(int e1, int e2, int e3);
extern int list3n(int e1, int e2, NMTBL *e3);
extern int glist3n(int e1, int e2, NMTBL *e3);
extern int list4(int e1, int e2, int e3,int e4);
extern int list4n(int e1, int e2, int e3,NMTBL *e4);
extern int list4s(int e1, int e2, int e3,char *e4);
extern int glist4n(int e1, int e2, int e3,NMTBL *e4);
extern int list5(int e1, int e2, int e3,int e4,int e5);
extern int list5n(int e1, int e2, int e3,int e4,NMTBL * e5);
extern int length(int e1);
extern int getfree(int size);
extern int nth(int n,int e1);
extern int reverse0(int t1);
extern int append4(int p,int a1,int a2,int a3);
extern int append5(int p,int a1,int a2,int a3,int a4);
extern int insert_ascend(int p,int e,int eq());

extern void free_nptr(NMTBL *n);
extern NMTBL *get_nptr();

#define  align(x,alig) ((x+(alig-1))&~(alig-1))

// mc-tree.c

extern void print_expr(int e, FILE *vout);


// #if 1
//extern int heapsize;
// #define CHECK_HEAP1(b) ({int _k=(int)(b);if(_k>heapsize||_k<=0)error(-1);_k;})
//#else
#define CHECK_HEAP(b)  (b)
//#endif

#define car(e) (heap[(int)(CHECK_HEAP(e))])

#define cadr(e) (heap[((int)(CHECK_HEAP(e)))+1])

#define caddr(e) (heap[((int)(CHECK_HEAP(e)))+2])

#define cadddr(e) (heap[((int)(CHECK_HEAP(e)))+3])

#define caddddr(e) (heap[((int)(CHECK_HEAP(e)))+4])

#define ncaddr(e) (*(NMTBL**)&heap[((int)(e))+2])

#define ncadddr(e) (*(NMTBL**)&heap[((int)(e))+3])

#define ncaddddr(e) (*(NMTBL**)&heap[((int)(e))+4])

#define vcaddr(e) (*(void**)&heap[((int)(e))+2])

#define vcadddr(e) (*(void**)&heap[((int)(e))+3])

#define pcaddr(e) (*(int**)&heap[((int)(e))+2])

#define pcadddr(e) (*(int**)&heap[((int)(e))+3])

#define scaddr(e) (*(char**)&heap[((int)(e))+2])
#ifdef NOTHREAD
        my_spe_run_thread(t_args);
#endif
#define scadddr(e) (*(char**)&heap[((int)(e))+3])

#if FLOAT_CODE
#define dcadr(e) (*(double*)&heap[((int)(e))+1])
#define dcaddr(e) (*(double*)&heap[((int)(e))+2])
#endif

#if LONGLONG_CODE
#define lcadr(e) (*(long long*)&heap[((int)(e))+1])
#define lcaddr(e) (*(long long*)&heap[((int)(e))+2])
#endif

/* end */