static int requate(Node q) { Symbol src = q->x.kids[0]->syms[RX]; Symbol tmp = q->syms[RX]; Node p; int n = 0; debug(fprint(stderr, "(requate(%x): tmp=%s src=%s)\n", q, tmp->x.name, src->x.name)); for (p = q->x.next; p; p = p->x.next) if (p->x.copy && p->syms[RX] == src && p->x.kids[0]->syms[RX] == tmp) debug(fprint(stderr, "(requate arm 0 at %x)\n", p)), p->syms[RX] = tmp; else if (setsrc(p->syms[RX]) && !moveself(p) && !readsreg(p)) return 0; else if (p->x.spills) return 0; else if (generic(p->op) == CALL && p->x.next) return 0; else if (p->op == LABEL+V && p->x.next) return 0; else if (p->syms[RX] == tmp && readsreg(p)) debug(fprint(stderr, "(requate arm 5 at %x)\n", p)), n++; else if (p->syms[RX] == tmp) break; debug(fprint(stderr, "(requate arm 7 at %x)\n", p)); assert(n > 0); for (p = q->x.next; p; p = p->x.next) if (p->syms[RX] == tmp && readsreg(p)) { p->syms[RX] = src; if (--n <= 0) break; } return 1; }
void readfile(const char *name) { FILE *inp; size_t len; const char *cp; char *line, *eptr, rt = '\0'; int cline, isrc, iline; pos_t pos; if (inpfns == NULL) if ((inpfns = calloc(ninpfns = 128, sizeof (short))) == NULL) nomem(); if (fnames == NULL) if ((fnames = calloc(nfnames = 256, sizeof (char *))) == NULL) nomem(); if (tlstlen == 0) if ((tlst = calloc(tlstlen = 256, sizeof (type_t *))) == NULL) nomem(); if (thtab == NULL) if ((thtab = calloc(THSHSIZ2, sizeof (thtab_t))) == NULL) nomem(); _inithash(&renametab); srcfile = getfnidx(name); if ((inp = fopen(name, "r")) == NULL) err(1, "cannot open %s", name); while ((line = fgetln(inp, &len)) != NULL) { if (len == 0 || line[len - 1] != '\n') inperr(); line[len - 1] = '\0'; cp = line; /* line number in csrcfile */ cline = (int)strtol(cp, &eptr, 10); if (cp == eptr) { cline = -1; } else { cp = eptr; } /* record type */ if (*cp != '\0') { rt = *cp++; } else { inperr(); } if (rt == 'S') { setsrc(cp); continue; } else if (rt == 's') { setfnid(cline, cp); continue; } /* * Index of (included) source file. If this index is * different from csrcfile, it refers to an included * file. */ isrc = (int)strtol(cp, &eptr, 10); if (cp == eptr) inperr(); cp = eptr; isrc = inpfns[isrc]; /* line number in isrc */ if (*cp++ != '.') inperr(); iline = (int)strtol(cp, &eptr, 10); if (cp == eptr) inperr(); cp = eptr; pos.p_src = (u_short)csrcfile; pos.p_line = (u_short)cline; pos.p_isrc = (u_short)isrc; pos.p_iline = (u_short)iline; /* process rest of this record */ switch (rt) { case 'c': funccall(&pos, cp); break; case 'd': decldef(&pos, cp); break; case 'u': usedsym(&pos, cp); break; default: inperr(); } } _destroyhash(renametab); if (ferror(inp)) err(1, "read error on %s", name); (void)fclose(inp); }