home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / sozobon / scsrc20 / hcc / nodes.h < prev    next >
C/C++ Source or Header  |  1991-02-22  |  5KB  |  215 lines

  1. /* Copyright (c) 1988,1991 by Sozobon, Limited.  Author: Johann Ruegg
  2.  *
  3.  * Permission is granted to anyone to use this software for any purpose
  4.  * on any computer system, and to redistribute it freely, with the
  5.  * following restrictions:
  6.  * 1) No charge may be made other than reasonable charges for reproduction.
  7.  * 2) Modified versions must be clearly marked as such.
  8.  * 3) The authors are not responsible for any harmful consequences
  9.  *    of using this software, even if they result from defects in it.
  10.  *
  11.  *    nodes.h
  12.  */
  13.  
  14. /*
  15.  *    stuff common to all nodes
  16.  */
  17. #define COMMON    int cflags;    \
  18.         int fill;    \
  19.         union node *left;    \
  20.         union node *right;    \
  21.         union node *tptr;    \
  22.         union node *nm_ext;    \
  23.         char cname[NMSIZE]
  24.  
  25. #define n_flags    e.cflags
  26. #define n_left    e.left
  27. #define n_next    e.left
  28. #define n_right e.right
  29. #define n_tptr    e.tptr
  30. #define n_nmx    e.nm_ext
  31. #define n_name    e.cname
  32.  
  33. /*
  34.  *    expression (and symbol table) node
  35.  */
  36. struct enode {
  37.     COMMON;
  38.     int    token;        /* must be same place as tnode */
  39.     int    eflags;
  40.     char    etype;        /* type of node */
  41.     char    sc;
  42.     char    eprec;
  43.     char    rno;
  44.     union {
  45.         long    vival;
  46.         long    voffs;
  47.         double    vfval;
  48.     } vu;
  49. #ifndef NOFIELDS
  50.     unsigned    fldw:6, fldof:6;    /* use fields just so
  51.                         we know fields work */
  52. #else
  53.     char    fldw, fldof;        /* use if cant do fields */
  54. #endif
  55. };
  56.  
  57. #define e_token    e.token
  58. #define e_flags    e.eflags
  59. #define e_prec    e.eprec
  60. #define e_rno    e.rno
  61. #define e_type    e.etype
  62. #define e_ival    e.vu.vival
  63. #define e_offs    e.vu.voffs
  64. #define e_fval    e.vu.vfval
  65. #define e_sc    e.sc
  66. #define e_fldw    e.fldw
  67. #define e_fldo    e.fldof
  68.  
  69. /* for e_flags values, see tok.h */
  70.  
  71. /* values for e_type */
  72.  
  73. #define E_LEAF    0    /* no descendants */
  74. #define E_UNARY 1    /* left node is expr, no right node */
  75. #define E_BIN    2    /* left and right are expr */
  76. #define E_SPEC    3    /* special '(', '[', '.', '->', ... */
  77.  
  78. /*
  79.  * code generation node
  80.  */
  81. struct gnode {
  82.     COMMON;
  83.     int    token;
  84.     int    eflags;
  85.     char    etype;
  86.     char    sc;
  87. /* all of above fields must match first fields in enode! */
  88.  
  89.     char    needs;        /* registers needed */
  90.     char    grno;        /* register used in ret value */
  91.     char    basety;        /* type FLOAT, UNS, INT or AGREG */
  92.     char    basesz;        /* size 1,2,4 or 3 -> see bsize */
  93.     char    gr1, gr2;
  94.     char    *betwc;        /* code for between L and R */
  95.     union {
  96.         long    goffs;        /* offsets for OREG, ONAME */
  97.         double    gfval;        /* value of FCON */
  98.     } gu;
  99.     long    bsize;        /* AGREG size or misc. */
  100.     struct {
  101. #ifndef NOFIELDS
  102. #ifdef AZ_HOST
  103.         unsigned gfldw:6, gfldo:6;    /* BUG! */
  104. #else
  105.         int    gfldw:6, gfldo:6;    /* field info */
  106. #endif
  107. #else
  108.         char    gfldw, gfldo;    /* use if no fields */
  109. #endif
  110.         short    fill;
  111.     } gfl;
  112. };
  113.  
  114. #define g_token    g.token
  115. #define g_flags    g.eflags
  116. #define g_type    g.etype
  117. #define g_sc    g.sc
  118. #define g_needs g.needs
  119. #define g_rno    g.grno
  120. #define g_offs    g.gu.goffs
  121. #define g_fval    g.gu.gfval
  122. #define g_betw    g.betwc
  123. #define g_ty    g.basety
  124. #define g_sz    g.basesz
  125. #define g_code    g.tptr
  126. #define g_bsize    g.bsize
  127. #define g_fldw    g.gfl.gfldw
  128. #define g_fldo    g.gfl.gfldo
  129. #define g_r1    g.gr1
  130. #define g_r2    g.gr2
  131.  
  132. /* types of operands -- ordered in cast strength order */
  133. #define ET_S    1    /* signed integer */
  134. #define ET_U    2    /* unsigned integer */
  135. #define ET_F    3    /* float or double */
  136. #define ET_A    4    /* aggregate */
  137.  
  138. /*
  139.  *    type list node
  140.  */
  141. struct tnode {
  142.     COMMON;
  143.     int    token;        /* must be same place as enode */
  144.     int    tflags;
  145.     char    aln;        /* alignment needed */
  146.     long    tsize;
  147. };
  148.  
  149. #define t_token    t.token
  150. #define t_flags    t.tflags
  151. #define t_size    t.tsize
  152. #define t_aln    t.aln
  153.  
  154. /*
  155.  *    name extension node
  156.  */
  157. struct nmext {
  158.     COMMON;
  159.     char nmx[NMXSIZE-NMSIZE];    /* name extension (with name)*/
  160. };
  161.  
  162. #define x_nm    x.nmx
  163.  
  164. /*
  165.  *    block info node
  166.  */
  167. struct bnode {
  168.     COMMON;
  169.     union node *syms;
  170.     union node *tags;
  171.     int    regs;        /* reg alloc mask */
  172.     long    lsize;        /* size of locals */
  173.     int    tmsize;        /* max tmps used for 1 expr */
  174. };
  175.  
  176. #define b_syms    b.syms
  177. #define b_tags    b.tags
  178. #define b_regs    b.regs
  179. #define b_size    b.lsize
  180. #define b_tsize b.tmsize
  181.  
  182. /*
  183.  *    node to hold case for switch generation
  184.  */
  185. struct cnode {
  186.     COMMON;
  187.     int    c_value;    /* value for case */
  188.     int    c_label;    /* case label or label label */
  189.     int    c_def;        /* label defined */
  190. };
  191.  
  192. #define c_defined c.c_def
  193. #define c_casev c.c_value
  194. #define c_casel c.c_label
  195.  
  196. union node {
  197.     struct enode e;
  198.     struct tnode t;
  199.     struct nmext x;
  200.     struct bnode b;
  201.     struct cnode c;
  202.     struct gnode g;
  203. };
  204.  
  205. typedef union node NODE;
  206. typedef NODE *NODEP;
  207.  
  208. /* defines for n_flags */
  209.  
  210. #define N_BRKPR    1    /* break printnode recursion */
  211. #define N_COPYT    2    /* tptr is a copy */
  212. #define N_ISFREE 4    /* node is on free list (error check) */
  213.  
  214. NODEP allocnode();
  215.