bb.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 858 行 · 第 1/2 页
C
858 行
return; } }new = ALLOC (Subrec);new->lmem = m1;new->rmem = m2;new->sets = 1;sublist = mkchain (new, sublist);}/* * looks for record for the given memalloc value */LOCAL Subrecp lookup (mem)Addrp mem;{chainp cp;Subrecp rec;for (cp = sublist; cp; cp = cp->nextp) { rec = (Subrecp) cp->datap; if (rec->lmem == mem) return rec; }return NULL;}/* * checks to see if there is a substitute for given memalloc value */LOCAL Addrp subfor (mem)Addrp mem;{Subrecp rec,rec2;Addrp sub;rec = lookup (mem);if (rec && rec->sets == 1) { sub = rec->rmem; rec2 = lookup(sub); if (rec2 && rec2->sets == 1) return sub; }return NULL;}/* * actually propagates the information */LOCAL propagate (expr)expptr expr;{chainp t;Addrp new;if (! expr) return;switch (expr->tag) { case TEXPR: propagate (expr->exprblock.leftp); propagate (expr->exprblock.rightp); break; case TADDR: propagate (expr->addrblock.vleng); propagate (expr->addrblock.memoffset); break; case TLIST: for (t = expr->listblock.listp; t; t = t->nextp) propagate (t->datap); break; case TTEMP: new = subfor (expr->tempblock.memalloc); if (new) { expr->tempblock.memalloc = new; prop2count++; } break; default: break; }}/* * allocates ADDR blocks for each TEMP in the expression */LOCAL expptr tempalloc (expr)expptr expr;{chainp t;if (! expr) return NULL;switch (expr->tag) { case TEXPR: expr->exprblock.leftp = tempalloc (expr->exprblock.leftp); expr->exprblock.rightp = tempalloc (expr->exprblock.rightp); break; case TADDR: expr->addrblock.vleng = tempalloc (expr->addrblock.vleng); expr->addrblock.memoffset = tempalloc (expr->addrblock.memoffset); break; case TLIST: for (t = expr->listblock.listp; t; t = t->nextp) t->datap = (tagptr) tempalloc (t->datap); break; case TTEMP: return (expptr) cpexpr (altmpn (expr)); break; default: break; }return expr;}/********************* debugging routines *********************/Announce (s,q)char *s;expptr q;{fprintf (diagfile,"\nAn expression [%s]----->\n",s);showexpr(q,0);fprintf (diagfile,"\n-------------end of expr--------------\n");}/* * dump the basic block buffer, including expressions, mnemonically */showbuffer (){Slotp sl;Bblockp bb;int i;fprintf (diagfile,"Basic blocks with first and last slots ----------\n");for (i=1, bb = firstblock; bb; i++, bb = bb->next) fprintf (diagfile,"%2d. %d %d\n",i,bb->first,bb->last);fprintf (diagfile,"\n");fprintf (diagfile,"Slots and expressions ----------\n");fprintf (diagfile,"tag pointer vtype vclass vstg vleng\n");fprintf (diagfile," ADDR memno memoffset istemp ntempelt varleng\n");fprintf (diagfile," TEMP memalloc istemp ntempelt varleng\n");fprintf (diagfile," EXPR opcode leftp rightp\n");fprintf (diagfile," LIST type listp\n");fprintf (diagfile,"\n");for (i=1, sl = firstslot; sl; i++, sl = sl->next) { fprintf (diagfile,"%2d. ",i); showslt (sl); }fprintf (diagfile,"---------- End of showbuffer ----------\n");}/* * dumps a single slot in the code buffer */LOCAL charptr Zslot[] = {"NULL", "IFN","GOTO","LABEL","EQ","CALL","CMGOTO","STOP","DOHEAD", "ENDDO","ARIF","RETURN","ASGOTO","PAUSE","ASSIGN","IOIFN","FRTEMP"};showslt (sl)Slotp sl;{fprintf (diagfile,"(%2d) %d %s %d\n", sl->lineno,sl,Zslot[sl->type],sl->label);showexpr (sl->expr,0);fprintf (diagfile,"\n");}showslottype (type)int type;{fprintf (diagfile,"%s\n",Zslot[type]);}/* * displays the given expression at the given indentation, showing * its subexpressions at further indentations */LOCAL charptr Ztag[] = {"----", "NAME","CONST","EXPR","ADDR","TEMP","PRIM","LIST","IMPLDO","ERROR"};LOCAL charptr Zstg[] = {"unk", "ARG","AUTO","BSS","INIT","CONST","EXT","INTR","STFUNCT", "COMMON","EQUIV","REG","LENG","NULL","PREG"};LOCAL charptr Zclass[] = {"unk", "PARAM","VAR","ENTRY","MAIN","BLOCK","PROC","NAMELIST"};LOCAL charptr Zop[] = {"----", "PLUS","MINUS","STAR","SLASH","POWER","NEG","OR","AND","EQV", "NEQV","NOT","CONCAT","LT","EQ","GT","LE","NE","GE","CALL", "CCALL","ASSIGN","PLUSEQ","STAREQ","CONV","LSHIFT","MOD", "COMMA","QUEST","COLON","ABS","MIN","MAX","ADDR","INDIRECT", "BITOR","BITAND","BITXOR","BITNOT","RSHIFT","PAREN"};LOCAL charptr Ztype[] = {"unk", "ADDR","SHORT","LONG","REAL","DREAL","COMPLEX","DCOMPLEX", "LOGICAL","CHAR","SUBR","ERROR"};showexpr(p,indent)tagptr p;int indent;{int i;int type;chainp q;#define PRHEAD(q) fprintf(diagfile,"%s %d %s %s %s %d", \ Ztag[q->tag], q, Ztype[q->headblock.vtype], \ Zclass[q->headblock.vclass], Zstg[q->headblock.vstg], \ q->headblock.vleng);#define SHOWEXPR(p) showexpr(p,indent+2)if(p == NULL) return;for (i=0; i<indent; i++) putc(' ',diagfile);switch(p->tag) { case TCONST: PRHEAD(p); type=p->constblock.vtype; if (ISCHAR(p)) { fprintf(diagfile," ISCHAR ccp= %d\n", p->constblock.const.ccp); SHOWEXPR(p->constblock.vleng); } else if( ISINT(type) ) fprintf(diagfile," ci= %d\n",p->constblock.const.ci); else if( ISREAL(type) ) fprintf(diagfile," cd[0]= %e\n",p->constblock.const.cd[0]); else fprintf(diagfile," cd[0]= %e cd[1]= %e\n", p->constblock.const.cd[0], p->constblock.const.cd[1] ); break; case TADDR: PRHEAD(p); fprintf(diagfile, " memno= %d %d %d %d %d\n", p->addrblock.memno,p->addrblock.memoffset,p->addrblock.istemp, p->addrblock.ntempelt,p->addrblock.varleng); SHOWEXPR(p->addrblock.vleng); SHOWEXPR(p->addrblock.memoffset); break; case TTEMP: fprintf(diagfile,"%s %d %s %s %d", Ztag[p->tag], p, Ztype[p->headblock.vtype], Zclass[p->headblock.vclass], p->headblock.vleng); fprintf(diagfile, " memalloc= %d %d %d %d\n", p->tempblock.memalloc,p->tempblock.istemp, p->tempblock.ntempelt,p->tempblock.varleng); SHOWEXPR(p->tempblock.vleng); SHOWEXPR(p->tempblock.memalloc); break; case TERROR: fprintf(diagfile,"ERROR %d\n",p); break; case TNAME: fprintf(diagfile,"NAME %d\n",p); return; case TPRIM: fprintf(diagfile,"PRIM %d --- not implemented\n",p); break; case TEXPR: PRHEAD(p); fprintf(diagfile," opcode= %s %d %d\n", Zop[p->exprblock.opcode],p->exprblock.leftp, p->exprblock.rightp); SHOWEXPR(p->exprblock.leftp); if(p->exprblock.rightp) SHOWEXPR(p->exprblock.rightp); break; case TLIST: fprintf(diagfile,"LIST %d %s %d\n",p, Ztype[p->listblock.vtype],p->listblock.listp); for(q= p->listblock.listp ; q ; q = q->nextp) SHOWEXPR(q->datap); for (i=0; i<indent; i++) putc (' ',diagfile); fprintf(diagfile,"END LIST %d\n",p); break; default: fprintf(diagfile,"showexpr BAD TAG= %d at %d \n",p->tag,p); }}selective()/************************************/{int i;Slotp sl;i=0;fprintf (stderr,"SELECTIVE OUTPUT\n");for (sl=firstslot;sl;sl=sl->next) { i++; if (i>=176 && i<184) { fprintf (stderr,"%d. ",i); showslt(sl); } }}LOCAL containscall(p)expptr p;{ chainp cp; if (p == NULL) return NO; switch (p->tag) { case TADDR: if (containscall(p->addrblock.vleng) || containscall(p->addrblock.memoffset)) return YES; else return NO; case TCONST: return NO; case TERROR: return NO; case TEXPR: if (p->exprblock.opcode == OPCALL || p->exprblock.opcode == OPCCALL) return YES; if (containscall(p->exprblock.vleng) || containscall(p->exprblock.leftp) || containscall(p->exprblock.rightp)) return YES; else return NO; case TLIST: cp = p->listblock.listp; while (cp) { if (containscall(cp->datap)) return YES; cp = cp->nextp; } return NO; default: return YES; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?