|
|
1.1 ! root 1: #include "stdio.h" ! 2: #include "ctype.h" ! 3: typedef unsigned long ul; ! 4: typedef struct { ! 5: char *fname; ! 6: int len; /* how many counts have been seen */ ! 7: int quot; /* how much has been allocated for cnt */ ! 8: unsigned long *cnt; ! 9: } stab; ! 10: stab *tab; ! 11: int ntab, ltab; ! 12: unsigned long N, B, L, V; /* for summary */ ! 13: double A, U; ! 14: FILE *fd, *sfd, *cfd; ! 15: extern FILE *popen(); ! 16: char fname[512] = "/"; /* not checked for overflow */ ! 17: char buf[256]; ! 18: char curfunc[256]; ! 19: extern char *malloc(); ! 20: char flg[128]; ! 21: unsigned long val; ! 22: ! 23: main(argc, argv) ! 24: char **argv; ! 25: { int i, j; ! 26: for(i = 1; i < argc; i++) ! 27: if(argv[i][0] != '-') ! 28: fprintf(stderr, "unknown arg %s\n", argv[i]); ! 29: else for(j = 1; argv[i][j]; j++) ! 30: switch(argv[i][j]) { ! 31: default: ! 32: fprintf(stderr, "unk option %c\n", argv[i][j]); ! 33: break; ! 34: case 'b': /* each bb */ ! 35: flg['b']++; ! 36: break; ! 37: case 'a': /* intermediate everything */ ! 38: flg['a']++; ! 39: break; ! 40: case 'i': /* count machine instrs */ ! 41: flg['i']++; ! 42: break; ! 43: case 'f': /* counts by function */ ! 44: flg['f']++; ! 45: flg['s']++; ! 46: break; ! 47: case 'p': /* print, in addition */ ! 48: flg['p']++; ! 49: break; ! 50: case 's': /* bb summary */ ! 51: flg['s']++; ! 52: break; ! 53: case 'c': /* compress prof.out */ ! 54: flg['c']++; ! 55: break; ! 56: } ! 57: if(argc <= 1) ! 58: flg['p']++; ! 59: if((fd = fopen("prof.out", "r")) == 0) { ! 60: perror("prof.out"); ! 61: exit(1); ! 62: } ! 63: readall(); ! 64: fclose(fd); ! 65: if(flg['f']) { ! 66: for(i = 0; i < ntab; i++) ! 67: fsum(tab + i); ! 68: } ! 69: if(flg['s']) { ! 70: for(i = 0; i < ntab; i++) ! 71: summary(tab + i); ! 72: if(ntab > 1) ! 73: printf("%.0fie %ui %uin %.0fbbe %ubb %ubbne total\n", ! 74: A, N, B, U, L, V); ! 75: } ! 76: if(flg['c']) { ! 77: fd = fopen("prof.out", "w"); ! 78: if(fd == 0) { ! 79: perror("rewriting prof.out"); ! 80: exit(1); ! 81: } ! 82: for(i = 0; i < ntab; i++) { ! 83: fprintf(fd, "%s\n", tab[i].fname); ! 84: for(j = 0; j < tab[i].len; j++) ! 85: fprintf(fd, "%u\n", tab[i].cnt[j]); ! 86: } ! 87: fclose(fd); ! 88: } ! 89: if(flg['p'] || flg['i'] || flg['a'] || flg['b']) ! 90: giantprint(); ! 91: exit(0); ! 92: } ! 93: ! 94: readall() ! 95: { int c, i, index; ! 96: stab *curtab = 0; ! 97: sawnl: ! 98: if((c = getc(fd)) == EOF) ! 99: return; ! 100: if(c == '\n') ! 101: goto sawnl; ! 102: if(c == '/') { ! 103: fscanf(fd, "%s", fname+1); ! 104: for(i = 0; i < ntab; i++) ! 105: if(strcmp(fname, tab[i].fname) == 0) ! 106: break; ! 107: if(i >= ntab) { /* new file */ ! 108: if(ltab == 0) { ! 109: tab = (stab *)malloc(20 * sizeof(stab)); ! 110: ltab = 20; ! 111: } ! 112: else if(ntab >= ltab) ! 113: tab = (stab *)realloc((char *)tab, ! 114: (ltab += 20) * sizeof(stab)); ! 115: tab[ntab].fname = malloc(sizeof(fname) + 1); ! 116: strcpy(tab[ntab].fname, fname); ! 117: tab[ntab].len = tab[ntab].quot = 0; ! 118: ntab++; ! 119: } ! 120: curtab = tab + i; ! 121: index = 0; ! 122: } ! 123: else if(c < '0' || c > '9') { ! 124: fprintf(stderr, "prof.out has weird format\n"); ! 125: abort(); ! 126: } ! 127: else { ! 128: ungetc(c, fd); ! 129: fscanf(fd, "%d", &val); ! 130: if(curtab->len <= index) { ! 131: if(curtab->quot == 0) { ! 132: curtab->cnt = (ul *)malloc(100*sizeof(long)); ! 133: curtab->quot = 100; ! 134: for(i = 0; i < 100; i++) ! 135: curtab->cnt[i] = 0; ! 136: } ! 137: else if(curtab->len >= curtab->quot) { ! 138: curtab->cnt = (ul *)realloc(curtab->cnt, ! 139: (curtab->quot += 200) * sizeof(long)); ! 140: for(i = curtab->quot-200; i < curtab->quot; i++) ! 141: curtab->cnt[i] = 0; ! 142: } ! 143: curtab->len++; ! 144: } ! 145: curtab->cnt[index++] += val; ! 146: } ! 147: goto sawnl; ! 148: } ! 149: ! 150: summary(x) ! 151: stab *x; ! 152: { unsigned long i, v, n, b; ! 153: double a, u; ! 154: for(i = u = v = 0; i < x->len; i++) ! 155: if(x->cnt[i]) ! 156: u += x->cnt[i]; ! 157: else ! 158: v++; ! 159: n = strlen(x->fname); ! 160: strcpy(buf, x->fname); ! 161: strcpy(buf + n - 2, ".sL"); ! 162: if((fd = fopen(buf, "r")) == 0) { ! 163: perror(buf); ! 164: printf("%s %u bbs %.0f execs %u untouched\n", ! 165: x->fname, x->len, u, v); ! 166: return; ! 167: } ! 168: for(n = a = b = 0; ;) { ! 169: (void) fgets(buf, sizeof(buf), fd); ! 170: if(feof(fd)) ! 171: break; ! 172: if(hascolon(buf)) ! 173: continue; ! 174: n++; ! 175: i = atoi(buf)/4 - 3; ! 176: if(x->cnt[i]) ! 177: a += x->cnt[i]; ! 178: else ! 179: b++; ! 180: } ! 181: printf("%.0fie %ui %uine %.0fbbe %ubb %ubbne %s\n", a, n, b, u, x->len, ! 182: v, x->fname); ! 183: fclose(fd); ! 184: A += a; N += n; B += b; U += u; L += x->len; V += v; ! 185: } ! 186: ! 187: fsum(x) ! 188: stab *x; ! 189: { unsigned i, v, n, b, cnt; ! 190: double a, u; ! 191: char *p; ! 192: strcpy(buf, x->fname); ! 193: n = strlen(x->fname); ! 194: strcpy(buf + n - 2, ".sL"); ! 195: if((fd = fopen(buf, "r")) == 0) { ! 196: perror(buf); ! 197: return; ! 198: } ! 199: curfunc[0] = 0; ! 200: for(cnt = v = n = b = a = u = 0;;) { ! 201: (void) fgets(buf, sizeof(buf), fd); ! 202: if(feof(fd)) ! 203: break; ! 204: if(hascolon(buf)) { ! 205: /* 24 foo.c: 456 or ! 206: * 24 foo.c: _funcjunk */ ! 207: for(p = buf; *p != ':'; p++) ! 208: ; ! 209: while(isspace(*++p)) ! 210: ; ! 211: if(isdigit(*p)) ! 212: continue; ! 213: if(curfunc[0] != 0) ! 214: printf("%.0fie %dcalls %ui %uine %s\n", ! 215: a, v, n, b, curfunc); ! 216: for(i = 0; *p && *p != '\n'; i++) ! 217: curfunc[i] = *p++; ! 218: curfunc[i] = 0; ! 219: a = n = b = 0; ! 220: i = atoi(buf)/4 - 3; ! 221: v = x->cnt[i]; ! 222: continue; ! 223: } ! 224: n++; ! 225: i = atoi(buf)/4 - 3; ! 226: if(x->cnt[i]) ! 227: a += x->cnt[i]; ! 228: else ! 229: b++; ! 230: } ! 231: if(n > 0) ! 232: printf("%.0fie %dcalls %ui %uine %s\n", a, v, n, b, curfunc); ! 233: fclose(fd); ! 234: } ! 235: ! 236: giantprint() ! 237: { int i, n; ! 238: for(i = 0; i < ntab; i++) { ! 239: /* the fname file is the source, there should be a corresponding ! 240: * .sL file for correlation between basic blocks and source. ! 241: * If fname is a .s file, the .sL file is all there is */ ! 242: n = strlen(tab[i].fname); ! 243: if(strcmp(".s", tab[i].fname + n - 2) == 0) { ! 244: sfile(tab + i); ! 245: continue; ! 246: } ! 247: sfd = fopen(tab[i].fname, "r"); ! 248: if(sfd == 0 && !flg['a']) { ! 249: perror(tab[i].fname); ! 250: return; ! 251: } ! 252: strcpy(buf, tab[i].fname); ! 253: strcpy(buf + n - 1, "sL"); ! 254: if((cfd = fopen(buf, "r")) == 0) { ! 255: fprintf(stderr, "no intermediate listing file "); ! 256: perror(buf); ! 257: fclose(sfd); ! 258: return; ! 259: } ! 260: sprintf(buf, "pr -h %s", tab[i].fname); ! 261: if(!flg['a']) ! 262: fd = popen(buf, "w"); ! 263: if(flg['b']) ! 264: xlistit(tab + i); ! 265: else ! 266: listit(tab + i); ! 267: if(fd) ! 268: pclose(fd); ! 269: if(sfd) ! 270: fclose(sfd); ! 271: fclose(cfd); ! 272: } ! 273: } ! 274: ! 275: sfile(x) ! 276: stab *x; ! 277: { int i; ! 278: char *p; ! 279: strcpy(buf, x->fname); ! 280: strcat(buf, "L"); ! 281: sfd = fopen(buf, "r"); ! 282: if(sfd == 0) { ! 283: perror(buf); ! 284: return; ! 285: } ! 286: sprintf(buf, "pr -h %s", x->fname); ! 287: fd = popen(buf, "w"); ! 288: if(fd == 0) { ! 289: perror(buf); ! 290: fclose(sfd); ! 291: return; ! 292: } ! 293: for(;;) { ! 294: (void) fgets(buf, sizeof(buf), sfd); ! 295: if(feof(sfd)) { ! 296: pclose(fd); ! 297: fclose(sfd); ! 298: return; ! 299: } ! 300: for(i = 0, p = buf; *p >= '0' && *p <= '9'; p++) ! 301: i = 10 * i + *p - '0'; ! 302: i = i/4 - 3; ! 303: fprintf(fd, "%u\t%s", x->cnt[i], p); ! 304: } ! 305: } ! 306: ! 307: char * ! 308: stripnum(s) ! 309: char *s; ! 310: { ! 311: while(*s && (isdigit(*s) || isspace(*s))) ! 312: s++; ! 313: return(s); ! 314: } ! 315: ! 316: listit(x) ! 317: stab *x; ! 318: { int bb, lnum, done, i; ! 319: unsigned long count; ! 320: char *p; ! 321: count = done = 0; ! 322: for(;;) { ! 323: (void) fgets(buf, sizeof(buf), cfd); ! 324: if(feof(cfd)) ! 325: break; ! 326: for(p = buf; *p && *p != ':' ; p++) ! 327: ; ! 328: if(*p++ != ':') { ! 329: count += i = x->cnt[atoi(buf)/4 - 3]; ! 330: if(flg['a']) ! 331: printf("%d\t%s", i, stripnum(buf)); ! 332: continue; ! 333: } ! 334: else if(flg['a']) { ! 335: printf("%s", stripnum(buf)); ! 336: continue; ! 337: } ! 338: lnum = atoi(p); /* atoi("_...") == 0 */ ! 339: i = atoi(buf); ! 340: for(; done < lnum - 1; done++) { ! 341: (void) fgets(buf, sizeof(buf), sfd); ! 342: if(flg['i']) ! 343: fprintf(fd, "%ui\t", count); ! 344: if(flg['p']) ! 345: fprintf(fd, "%u\t", x->cnt[bb]); ! 346: fprintf(fd, "%s", buf); ! 347: count = 0; ! 348: } ! 349: bb = i/4 - 3; ! 350: } ! 351: if(flg['a']) ! 352: return; ! 353: (void) fgets(buf, sizeof(buf), sfd); ! 354: if(feof(sfd)) ! 355: strcpy(buf, "unexpected eof\n"); ! 356: if(flg['i']) ! 357: fprintf(fd, "%ui\t", count); ! 358: if(flg['p']) ! 359: fprintf(fd, "%u\t", x->cnt[bb]); ! 360: fprintf(fd, "%s", buf); ! 361: } ! 362: ! 363: xlistit(x) ! 364: stab *x; ! 365: { int bb, lnum, i, j; ! 366: char *p; ! 367: bb = 0; ! 368: loop: ! 369: if(feof(cfd)) ! 370: return; ! 371: (void) fgets(buf, sizeof(buf), cfd); ! 372: for(p = buf; *p && *p != ':'; p++) ! 373: ; ! 374: if(*p++ != ':') ! 375: goto loop; ! 376: lnum = atoi(p); /* hmm */ ! 377: if(lnum <= 0) ! 378: goto loop; ! 379: i = atoi(buf)/4 - 3; ! 380: (void) fgets(buf, sizeof(buf), sfd); ! 381: buf[strlen(buf) - 1] = 0; ! 382: fprintf(fd, "%s", buf); ! 383: if(bb > i) ! 384: fprintf(fd, " %d:%u", i, x->cnt[i]); ! 385: for(j = bb; j <= i; j++) ! 386: fprintf(fd, " %d:%u", j, x->cnt[j]); ! 387: putc('\n', fd); ! 388: bb = j; ! 389: goto loop; ! 390: } ! 391: ! 392: hascolon(s) ! 393: register char *s; ! 394: { ! 395: for(; *s && *s != ':'; s++) ! 396: ; ! 397: if(*s == ':') ! 398: return(1); ! 399: else ! 400: return(0); ! 401: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.