|
|
1.1 ! root 1: #include <stdio.h> ! 2: ! 3: struct callsite { ! 4: char *file, *name; ! 5: union coordinate { ! 6: struct { ! 7: #if MIPSEB || mc68020 || mc68030 || NeXT || sparc ! 8: unsigned int index:6,x:10,y:16; ! 9: #endif ! 10: #if MIPSEL || vax ! 11: unsigned int y:16,x:10,index:6; ! 12: #endif ! 13: } c; ! 14: unsigned int coord; ! 15: } u; ! 16: } *_caller; ! 17: ! 18: static struct _bbdata { ! 19: struct _bbdata *link; ! 20: unsigned npoints, *counts; ! 21: union coordinate *coords; ! 22: char **files; ! 23: struct func { ! 24: struct func *link; ! 25: struct caller { ! 26: struct caller *link; ! 27: struct callsite *caller; ! 28: unsigned count; ! 29: } *callers; ! 30: char *name; ! 31: union coordinate src; ! 32: } *funcs; ! 33: } tail, *_bblist = &tail; ! 34: ! 35: _epilogue(callee) struct func *callee; { ! 36: _caller = 0; ! 37: } ! 38: ! 39: _prologue(callee, yylink) struct func *callee; struct _bbdata *yylink; { ! 40: static struct caller callers[4096]; ! 41: static int next; ! 42: struct caller *p; ! 43: ! 44: if (!yylink->link) { ! 45: yylink->link = _bblist; ! 46: _bblist = yylink; ! 47: } ! 48: for (p = callee->callers; p; p = p->link) ! 49: if (p->caller == _caller) { ! 50: p->count++; ! 51: break; ! 52: } ! 53: if (!p && next < sizeof callers/sizeof callers[0]) { ! 54: p = &callers[next++]; ! 55: p->caller = _caller; ! 56: p->count = 1; ! 57: p->link = callee->callers; ! 58: callee->callers = p; ! 59: } ! 60: _caller = 0; ! 61: } ! 62: ! 63: static void profout(p, fp) struct _bbdata *p; FILE *fp; { ! 64: int i; ! 65: struct func *f; ! 66: struct caller *q; ! 67: ! 68: for (i = 0; p->files[i]; i++) ! 69: ; ! 70: fprintf(fp, "%d\n", i); ! 71: for (i = 0; p->files[i]; i++) ! 72: fprintf(fp, "%s\n", p->files[i]); ! 73: for (i = 0, f = p->funcs; f; i++, f = f->link) ! 74: if (q = f->callers) ! 75: for (i--; q; q = q->link) ! 76: i++; ! 77: fprintf(fp, "%d\n", i); ! 78: for (f = p->funcs; f; f = f->link) { ! 79: int n = 0; ! 80: for (q = f->callers; q; n += q->count, q = q->link) { ! 81: fprintf(fp, "%s %d %d %d %d", f->name, f->src.c.index, ! 82: f->src.c.x, f->src.c.y, q->count); ! 83: if (q->caller) ! 84: fprintf(fp, " %s %s %d %d\n", q->caller->name, q->caller->file, ! 85: q->caller->u.c.x, q->caller->u.c.y); ! 86: else ! 87: fprintf(fp, " ? ? 0 0\n"); ! 88: } ! 89: if (n == 0) ! 90: fprintf(fp, "%s %d %d %d 0 ? ? 0 0\n", f->name, f->src.c.index, ! 91: f->src.c.x, f->src.c.y); ! 92: } ! 93: fprintf(fp, "%d\n", p->npoints); ! 94: for (i = 0; i < p->npoints; i++) ! 95: fprintf(fp, "%d %d %d %d\n", p->coords[i].c.index, p->coords[i].c.x, ! 96: p->coords[i].c.y, p->counts[i]); ! 97: } ! 98: ! 99: exit(code) { ! 100: FILE *fp; ! 101: ! 102: if (_bblist != &tail && (fp = fopen("prof.out", "a"))) { ! 103: for ( ; _bblist != &tail; _bblist = _bblist->link) ! 104: profout(_bblist, fp); ! 105: fclose(fp); ! 106: } ! 107: #if mips || vax || sparc ! 108: _cleanup(); ! 109: #endif ! 110: _exit(code); ! 111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.