void do_var(FILE *ofd, int dowhat, char *s, Symbol *sp, char *pre, char *sep, char *ter) { int i; switch(dowhat) { case PUTV: if (sp->hidden&1) break; typ2c(sp); break; case LOGV: case INIV: if (sp->type == STRUCT) { /* struct may contain a chan */ walk_struct(ofd, dowhat, s, sp, pre, sep, ter); break; } if (!sp->ini && dowhat != LOGV) /* it defaults to 0 */ break; if (sp->nel == 1) { fprintf(ofd, "\t\t%s%s%s%s", pre, s, sp->name, sep); if (dowhat == LOGV) fprintf(ofd, "%s%s", s, sp->name); else do_init(ofd, sp); fprintf(ofd, "%s", ter); } else { if (sp->ini && sp->ini->ntyp == CHAN) { for (i = 0; i < sp->nel; i++) { fprintf(ofd, "\t\t%s%s%s[%d]%s", pre, s, sp->name, i, sep); if (dowhat == LOGV) fprintf(ofd, "%s%s[%d]", s, sp->name, i); else do_init(ofd, sp); fprintf(ofd, "%s", ter); } } else { fprintf(ofd, "\t{\tint l_in;\n"); fprintf(ofd, "\t\tfor (l_in = 0; l_in < %d; l_in++)\n", sp->nel); fprintf(ofd, "\t\t{\n"); fprintf(ofd, "\t\t\t%s%s%s[l_in]%s", pre, s, sp->name, sep); if (dowhat == LOGV) fprintf(ofd, "%s%s[l_in]", s, sp->name); else putstmnt(ofd, sp->ini, 0); fprintf(ofd, "%s", ter); fprintf(ofd, "\t\t}\n"); fprintf(ofd, "\t}\n"); } } break; } }
static void do_init(FILE *ofd, Symbol *sp) { int i; extern Queue *ltab[]; if (sp->ini && sp->type == CHAN && ((i = qmake(sp)) > 0)) { if (sp->ini->ntyp == CHAN) fprintf(ofd, "addqueue(%d, %d)", i, ltab[i-1]->nslots == 0); else fprintf(ofd, "%d", i); } else putstmnt(ofd, sp->ini, 0); }
static void comwork(FILE *fd, Lextok *now, int m) { Lextok *v; int i, j; if (!now) { fprintf(fd, "0"); return; } switch (now->ntyp) { case CONST: sr_mesg(fd, now->val, now->ismtyp); break; case '!': Cat3("!(", now->lft, ")"); break; case UMIN: Cat3("-(", now->lft, ")"); break; case '~': Cat3("~(", now->lft, ")"); break; case '/': Cat1("/"); break; case '*': Cat1("*"); break; case '-': Cat1("-"); break; case '+': Cat1("+"); break; case '%': Cat1("%%"); break; case '&': Cat1("&"); break; case '^': Cat1("^"); break; case '|': Cat1("|"); break; case LE: Cat1("<="); break; case GE: Cat1(">="); break; case GT: Cat1(">"); break; case LT: Cat1("<"); break; case NE: Cat1("!="); break; case EQ: if (ltl_mode && now->lft->ntyp == 'p' && now->rgt->ntyp == 'q') /* remote ref */ { Lextok *p = now->lft->lft; fprintf(fd, "("); fprintf(fd, "%s", p->sym->name); if (p->lft) { fprintf(fd, "["); putstmnt(fd, p->lft, 0); /* pid */ fprintf(fd, "]"); } fprintf(fd, "@"); fprintf(fd, "%s", now->rgt->sym->name); fprintf(fd, ")"); break; } Cat1("=="); break; case OR: Cat1("||"); break; case AND: Cat1("&&"); break; case LSHIFT: Cat1("<<"); break; case RSHIFT: Cat1(">>"); break; case RUN: fprintf(fd, "run %s(", now->sym->name); for (v = now->lft; v; v = v->rgt) if (v == now->lft) { comwork(fd, v->lft, m); } else { Cat2(",", v->lft); } fprintf(fd, ")"); break; case LEN: putname(fd, "len(", now->lft, m, ")"); break; case FULL: putname(fd, "full(", now->lft, m, ")"); break; case EMPTY: putname(fd, "empty(", now->lft, m, ")"); break; case NFULL: putname(fd, "nfull(", now->lft, m, ")"); break; case NEMPTY: putname(fd, "nempty(", now->lft, m, ")"); break; case 's': putname(fd, "", now->lft, m, now->val?"!!":"!"); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v != now->rgt) fprintf(fd,","); if (!symbolic(fd, v->lft)) comwork(fd,v->lft,m); } break; case 'r': putname(fd, "", now->lft, m, "?"); switch (now->val) { case 0: break; case 1: fprintf(fd, "?"); break; case 2: fprintf(fd, "<"); break; case 3: fprintf(fd, "?<"); break; } for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v != now->rgt) fprintf(fd,","); if (!symbolic(fd, v->lft)) comwork(fd,v->lft,m); } if (now->val >= 2) fprintf(fd, ">"); break; case 'R': putname(fd, "", now->lft, m, now->val?"??[":"?["); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v != now->rgt) fprintf(fd,","); if (!symbolic(fd, v->lft)) comwork(fd,v->lft,m); } fprintf(fd, "]"); break; case ENABLED: Cat3("enabled(", now->lft, ")"); break; case EVAL: Cat3("eval(", now->lft, ")"); break; case NONPROGRESS: fprintf(fd, "np_"); break; case PC_VAL: Cat3("pc_value(", now->lft, ")"); break; case 'c': Cat3("(", now->lft, ")"); break; case '?': if (now->lft) { Cat3("( (", now->lft, ") -> "); } if (now->rgt) { Cat3("(", now->rgt->lft, ") : "); Cat3("(", now->rgt->rgt, ") )"); } break; case ASGN: comwork(fd,now->lft,m); fprintf(fd," = "); comwork(fd,now->rgt,m); break; case PRINT: { char c, buf[512]; strncpy(buf, now->sym->name, 510); for (i = j = 0; i < 510; i++, j++) { c = now->sym->name[i]; buf[j] = c; if (c == '\\') buf[++j] = c; if (c == '\"') buf[j] = '\''; if (c == '\0') break; } if (now->ntyp == PRINT) fprintf(fd, "printf"); else fprintf(fd, "annotate"); fprintf(fd, "(%s", buf); } for (v = now->lft; v; v = v->rgt) { Cat2(",", v->lft); } fprintf(fd, ")"); break; case PRINTM: fprintf(fd, "printm("); comwork(fd, now->lft, m); fprintf(fd, ")"); break; case NAME: putname(fd, "", now, m, ""); break; case 'p': if (ltl_mode) { fprintf(fd, "%s", now->lft->sym->name); /* proctype */ if (now->lft->lft) { fprintf(fd, "["); putstmnt(fd, now->lft->lft, 0); /* pid */ fprintf(fd, "]"); } fprintf(fd, ":"); /* remote varref */ fprintf(fd, "%s", now->sym->name); /* varname */ break; } putremote(fd, now, m); break; case 'q': fprintf(fd, "%s", now->sym->name); break; case C_EXPR: case C_CODE: fprintf(fd, "{%s}", now->sym->name); break; case ASSERT: Cat3("assert(", now->lft, ")"); break; case '.': fprintf(fd, ".(goto)"); break; case GOTO: fprintf(fd, "goto %s", now->sym->name); break; case BREAK: fprintf(fd, "break"); break; case ELSE: fprintf(fd, "else"); break; case '@': fprintf(fd, "-end-"); break; case D_STEP: fprintf(fd, "D_STEP"); break; case ATOMIC: fprintf(fd, "ATOMIC"); break; case NON_ATOMIC: fprintf(fd, "sub-sequence"); break; case IF: fprintf(fd, "IF"); break; case DO: fprintf(fd, "DO"); break; case UNLESS: fprintf(fd, "unless"); break; case TIMEOUT: fprintf(fd, "timeout"); break; default: if (isprint(now->ntyp)) fprintf(fd, "'%c'", now->ntyp); else fprintf(fd, "%d", now->ntyp); break; } }
static void put_pinit(ProcList *P) { Lextok *fp, *fpt, *t; Element *e = P->s->frst; Symbol *s = P->n; Lextok *p = P->p; int i = P->tn; int ini, j, k; if (i == claimnr && separate == 1) { fprintf(tc, "\tcase %d: /* %s */\n", i, s->name); fprintf(tc, "\t\tini_claim(%d, h);\n", i); fprintf(tc, "\t\tbreak;\n"); return; } if (i != claimnr && separate == 2) return; ini = huntele(e, e->status, -1)->seqno; fprintf(th, "#define start%d %d\n", i, ini); if (i == claimnr) fprintf(th, "#define start_claim %d\n", ini); if (i == eventmapnr) fprintf(th, "#define start_event %d\n", ini); fprintf(tc, "\tcase %d: /* %s */\n", i, s->name); fprintf(tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", i, i); fprintf(tc, "\t\t((P%d *)pptr(h))->_p = %d;", i, ini); fprintf(tc, " reached%d[%d]=1;\n", i, ini); if (has_provided) { fprintf(tt, "\tcase %d: /* %s */\n\t\t", i, s->name); if (P->prov) { fprintf(tt, "if ("); putstmnt(tt, P->prov, 0); fprintf(tt, ")\n\t\t\t"); } fprintf(tt, "return 1;\n"); if (P->prov) fprintf(tt, "\t\tbreak;\n"); } fprintf(tc, "\t\t/* params: */\n"); for (fp = p, j=0; fp; fp = fp->rgt) for (fpt = fp->lft; fpt; fpt = fpt->rgt, j++) { t = (fpt->ntyp == ',') ? fpt->lft : fpt; if (t->sym->nel != 1) { lineno = t->ln; Fname = t->fn; fatal("array in parameter list, %s", t->sym->name); } fprintf(tc, "\t\t((P%d *)pptr(h))->", i); if (t->sym->type == STRUCT) { if (full_name(tc, t, t->sym, 1)) { lineno = t->ln; Fname = t->fn; fatal("hidden array in parameter %s", t->sym->name); } } else fprintf(tc, "%s", t->sym->name); fprintf(tc, " = par%d;\n", j); } fprintf(tc, "\t\t/* locals: */\n"); k = dolocal(tc, "", INIV, i, s->name); if (k > 0) { fprintf(tc, "#ifdef VAR_RANGES\n"); (void) dolocal(tc, "logval(\"", LOGV, i, s->name); fprintf(tc, "#endif\n"); } fprintf(tc, "#ifdef HAS_CODE\n"); fprintf(tc, "\t\tlocinit%d(h);\n", i); fprintf(tc, "#endif\n"); dumpclaims(tc, i, s->name); fprintf(tc, "\t break;\n"); }
void undostmnt(Lextok *now, int m) { Lextok *v; int i, j; if (!now) { fprintf(tb, "0"); return; } lineno = now->ln; Fname = now->fn; switch (now->ntyp) { case CONST: case '!': case UMIN: case '~': case '/': case '*': case '-': case '+': case '%': case LT: case GT: case '&': case '|': case LE: case GE: case NE: case EQ: case OR: case AND: case LSHIFT: case RSHIFT: case TIMEOUT: case LEN: case NAME: case FULL: case EMPTY: case 'R': case NFULL: case NEMPTY: case ENABLED: case '?': case PC_VAL: case '^': case C_EXPR: case GET_P: case NONPROGRESS: putstmnt(tb, now, m); break; case RUN: fprintf(tb, "delproc(0, now._nr_pr-1)"); break; case 's': if (Pid == eventmapnr) break; if (m_loss) fprintf(tb, "if (_m == 2) "); putname(tb, "_m = unsend(", now->lft, m, ")"); break; case 'r': if (Pid == eventmapnr) break; for (v = now->rgt, i=j=0; v; v = v->rgt, i++) if (v->lft->ntyp != CONST && v->lft->ntyp != EVAL) j++; if (j == 0 && now->val >= 2) break; /* poll without side-effect */ { int ii = 0, jj; for (v = now->rgt; v; v = v->rgt) if ((v->lft->ntyp != CONST && v->lft->ntyp != EVAL)) ii++; /* nr of things bupped */ if (now->val == 1) { ii++; jj = multi_oval - ii - 1; fprintf(tb, "XX = trpt->bup.oval"); if (multi_oval > 0) { fprintf(tb, "s[%d]", jj); jj++; } fprintf(tb, ";\n\t\t"); } else { fprintf(tb, "XX = 1;\n\t\t"); jj = multi_oval - ii - 1; } if (now->val < 2) /* not for channel poll */ for (v = now->rgt, i = 0; v; v = v->rgt, i++) { switch(v->lft->ntyp) { case CONST: case EVAL: fprintf(tb, "unrecv"); putname(tb, "(", now->lft, m, ", XX-1, "); fprintf(tb, "%d, ", i); if (v->lft->ntyp == EVAL) undostmnt(v->lft->lft, m); else undostmnt(v->lft, m); fprintf(tb, ", %d);\n\t\t", (i==0)?1:0); break; default: fprintf(tb, "unrecv"); putname(tb, "(", now->lft, m, ", XX-1, "); fprintf(tb, "%d, ", i); if (v->lft->sym && !strcmp(v->lft->sym->name, "_")) { fprintf(tb, "trpt->bup.oval"); if (multi_oval > 0) fprintf(tb, "s[%d]", jj); } else putstmnt(tb, v->lft, m); fprintf(tb, ", %d);\n\t\t", (i==0)?1:0); if (multi_oval > 0) jj++; break; } } jj = multi_oval - ii - 1; if (now->val == 1 && multi_oval > 0) jj++; /* new 3.4.0 */ for (v = now->rgt, i = 0; v; v = v->rgt, i++) { switch(v->lft->ntyp) { case CONST: case EVAL: break; default: if (!v->lft->sym || strcmp(v->lft->sym->name, "_") != 0) { nocast=1; putstmnt(tb,v->lft,m); nocast=0; fprintf(tb, " = trpt->bup.oval"); if (multi_oval > 0) fprintf(tb, "s[%d]", jj); fprintf(tb, ";\n\t\t"); } if (multi_oval > 0) jj++; break; } } multi_oval -= ii; } break; case '@': fprintf(tb, "p_restor(II);\n\t\t"); break; case SET_P: fprintf(tb, "((P0 *)pptr((trpt->o_priority >> 8)))"); fprintf(tb, "->_priority = trpt->o_priority & 255"); break; case ASGN: if (check_track(now) == STRUCT) { break; } nocast=1; putstmnt(tb,now->lft,m); nocast=0; fprintf(tb, " = trpt->bup.oval"); if (multi_oval > 0) { multi_oval--; fprintf(tb, "s[%d]", multi_oval-1); } check_proc(now->rgt, m); break; case 'c': check_proc(now->lft, m); break; case '.': case GOTO: case ELSE: case BREAK: break; case C_CODE: fprintf(tb, "sv_restor();\n"); break; case ASSERT: case PRINT: check_proc(now, m); break; case PRINTM: break; default: printf("spin: bad node type %d (.b)\n", now->ntyp); alldone(1); } }