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 + -
显示快捷键?