Add original unix v6
This commit is contained in:
@@ -0,0 +1,350 @@
|
||||
/*
|
||||
* Print execution profile
|
||||
*/
|
||||
|
||||
struct nl {
|
||||
char name[8];
|
||||
int value;
|
||||
float time;
|
||||
int ncall[2];
|
||||
};
|
||||
|
||||
struct nl nl[600];
|
||||
|
||||
struct fnl {
|
||||
char fname[8];
|
||||
int flag;
|
||||
int fvalue;
|
||||
};
|
||||
|
||||
struct cnt {
|
||||
int cvalue;
|
||||
int cncall[2];
|
||||
} cbuf[200];
|
||||
|
||||
struct inode {
|
||||
int idev;
|
||||
int inum;
|
||||
int flags;
|
||||
char nlink;
|
||||
char uid;
|
||||
char gid;
|
||||
char size0;
|
||||
int size;
|
||||
int ptr[8];
|
||||
int ctime[2];
|
||||
int mtime[2];
|
||||
int fill;
|
||||
};
|
||||
|
||||
int ibuf[259];
|
||||
int obuf[259];
|
||||
int buf[17];
|
||||
int i;
|
||||
int j;
|
||||
int highpc;
|
||||
int lowpc;
|
||||
int ccnt;
|
||||
int pcl;
|
||||
int pch;
|
||||
int bufs;
|
||||
int nname;
|
||||
double time;
|
||||
double totime;
|
||||
double maxtime;
|
||||
double scale;
|
||||
double lastx;
|
||||
double lasty;
|
||||
struct nl *np;
|
||||
struct nl *npe;
|
||||
int aflg;
|
||||
int vflg;
|
||||
int lflg;
|
||||
int symoff;
|
||||
int symsiz;
|
||||
int vf;
|
||||
int etext;
|
||||
int ncount;
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
char *namfil;
|
||||
int timcmp(), valcmp();
|
||||
int nf, pf, overlap;
|
||||
double fnc, ltod(), lastsx;
|
||||
struct cnt *cp;
|
||||
|
||||
obuf[0] = 1;
|
||||
argv++;
|
||||
namfil = "a.out";
|
||||
while (argc>1) {
|
||||
if (**argv == '-') {
|
||||
if (*++*argv == 'l')
|
||||
lflg++;
|
||||
if (**argv == 'a')
|
||||
aflg = 040;
|
||||
if(**argv == 'v')
|
||||
vflg++;
|
||||
} else
|
||||
namfil = *argv;
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
if ((nf = open(namfil, 0)) < 0) {
|
||||
printf("Can't find %s\n", namfil);
|
||||
done();
|
||||
}
|
||||
read(nf, buf, 020);
|
||||
if (buf[0] != 0407 && buf[0] != 0410 && buf[0] != 0411) { /* a.out magic */
|
||||
printf("Bad format: %s\n", namfil);
|
||||
done();
|
||||
}
|
||||
symsiz = buf[4];
|
||||
symoff = buf[1] + buf[2];
|
||||
if (buf[7] != 1)
|
||||
symoff =<< 1;
|
||||
seek(nf, symoff+020, 0);
|
||||
if ((pf = open("mon.out", 0)) < 0) {
|
||||
printf("No mon.out\n");
|
||||
done();
|
||||
}
|
||||
fstat(pf, buf);
|
||||
read(pf, &lowpc, 2);
|
||||
read(pf, &highpc, 2);
|
||||
read(pf, &ncount, 2);
|
||||
bufs = buf->size/2 - 3*(ncount+1);
|
||||
read(pf, cbuf, ncount*6);
|
||||
lowpc = (lowpc>>1) & 077777;
|
||||
highpc = (highpc>>1) & 077777;
|
||||
npe = nl;
|
||||
initf(nf);
|
||||
for (nname = 0; symsiz > 0; symsiz =- 12) {
|
||||
for(i=0; i<12; i++)
|
||||
buf->fname[i] = getc(ibuf);
|
||||
if ((buf->flag | aflg) != 042)
|
||||
continue;
|
||||
buf->fvalue = (buf->fvalue>>1) & 077777;
|
||||
npe->value = buf->fvalue;
|
||||
for (i=0; i<8; i++)
|
||||
npe->name[i] = buf->fname[i];
|
||||
npe++;
|
||||
nname++;
|
||||
}
|
||||
if (nname == 0) {
|
||||
printf("No symbols: %s\n", namfil);
|
||||
done();
|
||||
}
|
||||
npe->value = 077777;
|
||||
npe++;
|
||||
for (cp = cbuf; cp < &cbuf[ncount]; cp++)
|
||||
for (np = nl; np < npe; np++)
|
||||
if (cp->cvalue-8 == np->value<<1) {
|
||||
np->ncall[0] = cp->cncall[0];
|
||||
np->ncall[1] = cp->cncall[1];
|
||||
break;
|
||||
}
|
||||
qsort(nl, nname, 18, &valcmp);
|
||||
scale = (highpc-lowpc)/(bufs+0.0);
|
||||
initf(pf);
|
||||
for (i=0; (j = getc(ibuf)) != -1; i++) {
|
||||
ccnt.fname[0] = j;
|
||||
ccnt.fname[1] = getc(ibuf);
|
||||
if (ccnt == 0)
|
||||
continue;
|
||||
time = ccnt;
|
||||
if (ccnt<0)
|
||||
time =+ 65536.;
|
||||
totime =+ time;
|
||||
if(time > maxtime)
|
||||
maxtime = time;
|
||||
pcl = lowpc + scale*i - 1;
|
||||
pch = lowpc + scale*(i+1) - 1;
|
||||
for (j=0; j<nname; j++) {
|
||||
if (pch < nl[j].value)
|
||||
break;
|
||||
if (pcl >= nl[j+1].value)
|
||||
continue;
|
||||
overlap=(min(pch,nl[j+1].value)-max(pcl,nl[j].value));
|
||||
nl[j].time =+ overlap*time/scale;
|
||||
}
|
||||
}
|
||||
if (totime==0.0) {
|
||||
printf("No time accumulated\n");
|
||||
done();
|
||||
}
|
||||
if(!vflg)
|
||||
goto print;
|
||||
vf = open("/dev/vt0", 1);
|
||||
if(vf < 0) {
|
||||
printf("Cannot open vt\n");
|
||||
done();
|
||||
}
|
||||
obuf[0] = vf;
|
||||
vtch(1);
|
||||
vtch(1);
|
||||
vtch(3);
|
||||
point(-2048., -2048.);
|
||||
point(-2048., 2048.);
|
||||
vtch(3);
|
||||
point(0., -2048.);
|
||||
point(0., 2048.);
|
||||
for(j=0; j<9; j++) {
|
||||
vtch(3);
|
||||
point(-2048., 2048. - j*512.);
|
||||
point(0., 2048. - j*512.);
|
||||
}
|
||||
lastx = 0.;
|
||||
lasty = 2048.;
|
||||
scale = 4096./(i+2);
|
||||
seek(pf, 6*(ncount+1), 0);
|
||||
initf(pf);
|
||||
lastsx = 0.0;
|
||||
while((j = getc(ibuf)) != -1) {
|
||||
ccnt.fname[0] = j;
|
||||
ccnt.fname[1] = getc(ibuf);
|
||||
time = ccnt;
|
||||
if(ccnt < 0)
|
||||
time =+ 65536.;
|
||||
vtch(3);
|
||||
point(lastsx, lasty);
|
||||
lastsx =- 2000.*time/totime;
|
||||
point(lastsx, lasty-scale);
|
||||
if (ccnt!=0 || lastx!=0.0) {
|
||||
vtch(3);
|
||||
point(lastx, lasty);
|
||||
lastx = -time*2000./maxtime;
|
||||
point(lastx, lasty);
|
||||
}
|
||||
lasty =- scale;
|
||||
}
|
||||
scale = 4096./(highpc-lowpc);
|
||||
lastx = 50.;
|
||||
for(np = nl; np<npe; np++) {
|
||||
if(np->value < lowpc)
|
||||
continue;
|
||||
if(np->value >= highpc)
|
||||
continue;
|
||||
time = np->time/totime;
|
||||
lasty = 2048. - (np->value - lowpc)*scale;
|
||||
vtch(3);
|
||||
point(0., lasty);
|
||||
point(50., lasty);
|
||||
vtch(3);
|
||||
point(lastx-50., lasty);
|
||||
point(lastx, lasty);
|
||||
vtch(9);
|
||||
point(lastx+10., lasty+60.);
|
||||
vtch(1);
|
||||
vtch(3);
|
||||
for(j=0; j<8; j++)
|
||||
if(np->name[j] != '_')
|
||||
vtch(np->name[j]);
|
||||
vtch(0);
|
||||
lastx =+ 500.;
|
||||
if(lastx > 2000.)
|
||||
lastx = 50.;
|
||||
}
|
||||
done();
|
||||
|
||||
print:
|
||||
printf(" name %%time #call ms/call\n");
|
||||
if (!lflg)
|
||||
qsort(nl, nname, 18, &timcmp);
|
||||
for (np = nl; np<npe-1; np++) {
|
||||
time = np->time/totime;
|
||||
printf("%8.8s%6.1f", np->name, 100*time);
|
||||
fnc = ltod(np->ncall);
|
||||
if (fnc != 0.0) {
|
||||
printf("%6s", locv(np->ncall[0], np->ncall[1]));
|
||||
printf(" %7.2f\n", np->time/(fnc*.06));
|
||||
} else
|
||||
printf("\n");
|
||||
}
|
||||
done();
|
||||
}
|
||||
|
||||
min(a, b)
|
||||
{
|
||||
if (a<b)
|
||||
return(a);
|
||||
return(b);
|
||||
}
|
||||
|
||||
max(a, b)
|
||||
{
|
||||
if (a>b)
|
||||
return(a);
|
||||
return(b);
|
||||
}
|
||||
|
||||
valcmp(p1, p2)
|
||||
struct nl *p1, *p2;
|
||||
{
|
||||
return(p1->value - p2->value);
|
||||
}
|
||||
|
||||
timcmp(p1, p2)
|
||||
struct nl *p1, *p2;
|
||||
{
|
||||
float d;
|
||||
|
||||
d = p2->time - p1->time;
|
||||
if (d > 0.0)
|
||||
return(1);
|
||||
if (d < 0.0)
|
||||
return(-1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
vtch(c)
|
||||
int c;
|
||||
{
|
||||
|
||||
putchar(c&0377);
|
||||
}
|
||||
|
||||
point(x, y)
|
||||
float x, y;
|
||||
{
|
||||
|
||||
point1(x);
|
||||
point1(y);
|
||||
}
|
||||
|
||||
putchar(c)
|
||||
{
|
||||
|
||||
putc(c, obuf);
|
||||
}
|
||||
|
||||
point1(xy)
|
||||
float xy;
|
||||
{
|
||||
int ixy;
|
||||
struct { char b1; char b2;};
|
||||
|
||||
if(xy > 2047.)
|
||||
xy = 2047.;
|
||||
if(xy < -2048.)
|
||||
xy = -2048.;
|
||||
ixy = xy;
|
||||
vtch(ixy.b1);
|
||||
vtch(ixy.b2);
|
||||
}
|
||||
|
||||
done()
|
||||
{
|
||||
|
||||
fflush(obuf);
|
||||
exit();
|
||||
}
|
||||
|
||||
initf(f)
|
||||
{
|
||||
|
||||
ibuf[0] = f;
|
||||
ibuf[1] = 0;
|
||||
ibuf[2] = 0;
|
||||
ibuf[3] = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user