p1_unary(struct Exprblock *e) #endif { if (e == (struct Exprblock *) NULL) return; p1putdd (P1_EXPR, (int) e -> opcode, e -> vtype); p1_expr (e -> vleng); switch (e -> opcode) { case OPNEG: case OPNEG1: case OPNOT: case OPABS: case OPBITNOT: case OPPREINC: case OPPREDEC: case OPADDR: case OPIDENTITY: case OPCHARCAST: case OPDABS: p1_expr(e -> leftp); break; default: erri ("p1_unary: bad opcode '%d'", (int) e -> opcode); break; } /* switch */ } /* p1_unary */
p1_for(expptr init, expptr test, expptr inc) #endif { p1put (P1_FOR); p1_expr (init); p1_expr (test); p1_expr (inc); } /* p1_for */
p1_binary(struct Exprblock *e) #endif { if (e == (struct Exprblock *) NULL) return; p1putdd (P1_EXPR, e -> opcode, e -> vtype); p1_expr (e -> vleng); p1_expr (e -> leftp); p1_expr (e -> rightp); } /* p1_binary */
p1_big_addr(Addrp addrp) #endif { if (addrp == (Addrp) NULL) return; p1putn (P1_ADDR, (int)sizeof(struct Addrblock), (char *) addrp); p1_expr (addrp -> vleng); p1_expr (addrp -> memoffset); if (addrp->uname_tag == UNAM_NAME) addrp->user.name->visused = 1; } /* p1_big_addr */
p1_subr_ret(expptr retexp) #endif { p1put (P1_SUBR_RET); p1_expr (cpexpr(retexp)); } /* p1_subr_ret */
putexpr(expptr p) #endif { /* Write the expression to the p1 file */ p = (expptr) putx (fixtype (p)); p1_expr (p); }
p1_list(struct Listblock *listp) #endif { chainp lis; int count = 0; if (listp == (struct Listblock *) NULL) return; /* Count the number of parameters in the list */ for (lis = listp -> listp; lis; lis = lis -> nextp) count++; p1putddd (P1_LIST, listp -> tag, listp -> vtype, count); for (lis = listp -> listp; lis; lis = lis -> nextp) p1_expr ((expptr) lis -> datap); } /* p1_list */
p1comp_goto(expptr index, int count, struct Labelblock **labels) #endif { struct Constblock c; int i; register struct Labelblock *L; p1put (P1_COMP_GOTO); p1_expr (index); /* Write out a P1_LIST directly, to avoid the overhead of allocating a list before it's needed HACK HACK HACK */ p1putddd (P1_LIST, TLIST, TYUNKNOWN, count); c.vtype = TYLONG; c.vleng = 0; for (i = 0; i < count; i++) { L = labels[i]; L->labused = 1; c.Const.ci = L->stateno; p1_const(&c); } /* for i = 0 */ } /* p1comp_goto */
p1_elif(expptr expr) #endif { p1put (P1_ELIF); p1_expr (expr); } /* p1_elif */
p1_addr(register struct Addrblock *addrp) #endif { int stg; if (addrp == (struct Addrblock *) NULL) return; stg = addrp -> vstg; if (ONEOF(stg, M(STGINIT)|M(STGREG)) || ONEOF(stg, M(STGCOMMON)|M(STGEQUIV)) && (!ISICON(addrp->memoffset) || (addrp->uname_tag == UNAM_NAME ? addrp->memoffset->constblock.Const.ci != addrp->user.name->voffset : addrp->memoffset->constblock.Const.ci)) || ONEOF(stg, M(STGBSS)|M(STGINIT)|M(STGAUTO)|M(STGARG)) && (!ISICON(addrp->memoffset) || addrp->memoffset->constblock.Const.ci) || addrp->Field || addrp->isarray || addrp->vstg == STGLENG) { p1_big_addr (addrp); return; } /* Write out a level of indirection for non-array arguments, which have addrp -> memoffset set and are handled by p1_big_addr(). Lengths are passed by value, so don't check STGLENG 28-Jun-89 (dmg) Added the check for != TYCHAR */ if (oneof_stg ( addrp -> uname_tag == UNAM_NAME ? addrp -> user.name : NULL, stg, M(STGARG)|M(STGEQUIV)) && addrp->vtype != TYCHAR) { p1putdd (P1_EXPR, OPWHATSIN, addrp -> vtype); p1_expr (ENULL); /* Put dummy vleng */ } /* if stg == STGARG */ switch (addrp -> uname_tag) { case UNAM_NAME: p1_name (addrp -> user.name); break; case UNAM_IDENT: p1putdds(P1_IDENT, addrp->vtype, addrp->vstg, addrp->user.ident); break; case UNAM_CHARP: p1putdds(P1_CHARP, addrp->vtype, addrp->vstg, addrp->user.Charp); break; case UNAM_EXTERN: p1putd (P1_EXTERN, (long) addrp -> memno); if (addrp->vclass == CLPROC) extsymtab[addrp->memno].extype = addrp->vtype; break; case UNAM_CONST: if (addrp -> memno != BAD_MEMNO) p1_literal (addrp -> memno); else p1_const((struct Constblock *)addrp); break; case UNAM_UNKNOWN: default: erri ("p1_addr: unknown uname_tag '%d'", addrp -> uname_tag); break; } /* switch */ } /* p1_addr */