Annotation of researchv10dc/cmd/lcomp/prof.mail, revision 1.1

1.1     ! root        1: From rabbit!groucho!dcb Tue Sep  4 15:59 EDT 1984
        !             2: #define unsafe 1       /* pretend killing all but C is as good as killing
        !             3:                         * all condition codes */
        !             4: #ifdef unsafe
        !             5: #define E      (C|K)
        !             6: #else
        !             7: #define E      K
        !             8: #endif
        !             9: #include "stdio.h"
        !            10: #include "instr.c"
        !            11: #include "ctype.h"
        !            12: struct inst *index[128];
        !            13: 
        !            14: #define SBBLK  1       /* looking for the start of a basic block */
        !            15: #define SINST  2       /* thinking about generating a tally */
        !            16: #define SPRO   3       /* thinking about generating prolog code */
        !            17: #define SMAYBE 4       /* seen _, thinking about SPRO */
        !            18: 
        !            19: #define MAXLA  5       /* max no. of lines that can be read for lookahead */
        !            20: 
        !            21: FILE *outs, *fd, *outl;        /* outs goes to assembler, outl is for listing */
        !            22: extern FILE *popen();
        !            23: char line[256], fname[256];    /* file names must fit in fname */
        !            24: 
        !            25: char labuf[5][256];            /* look ahead needed for 5.0 stab entries */
        !            26: int lastla, lookahead;
        !            27: char begfcn[] = "      .def    .bf";   /* 5.0 stab entry */
        !            28: 
        !            29: int lineno, lastline;
        !            30: int base=0;
        !            31: 
        !            32: int cnt;
        !            33: int state = SBBLK;
        !            34: char *ptr, *curarg;
        !            35: char curdir[256];
        !            36: 
        !            37: main(argc, argv)
        !            38: char **argv;
        !            39: {      int i;
        !            40:        if(argc <= 1) {
        !            41:                fprintf(stderr, "no files given\n");
        !            42:                exit(1);
        !            43:        }
        !            44:        for(i = 0; insts[i].iname; i++)
        !            45:                ;
        !            46:        for(; i >= 0; i--)
        !            47:                index[insts[i].iname[0]] = insts + i;
        !            48:        fd = popen("pwd", "r");
        !            49:        for(i = 0; i < sizeof(curdir) && !feof(fd); i++)
        !            50:                curdir[i] = getc(fd);
        !            51:        curdir[i-2] = 0;        /* thisdir\n */
        !            52:        fclose(fd);
        !            53:        for(i = 1; i < argc; i++) {
        !            54:                if(setfd(argv[i]))      /* fix fd, outs, outl */
        !            55:                        doarg();        /* do the work */
        !            56:        }
        !            57:        exit(0);
        !            58: }
        !            59: 
        !            60: setfd(s)
        !            61: char *s;
        !            62: {      char outnams[24], outnaml[24];
        !            63:        fname[0] = 0;
        !            64:        cnt = 3;
        !            65:        if(fd != NULL)
        !            66:                fclose(fd);
        !            67:        if(outs != NULL)
        !            68:                fclose(outs);
        !            69:        if(outl != NULL)
        !            70:                fclose(outl);
        !            71:        sprintf(outnams, "X%s", s);
        !            72:        sprintf(outnaml, "%sL", s);
        !            73:        lastline = lineno = 0;
        !            74:        fd = fopen(s, "r");
        !            75:        if(fd == NULL) {
        !            76:                perror(s);
        !            77:                return(0);
        !            78:        }
        !            79:        outs = fopen(outnams, "w");
        !            80:        if(outs == NULL) {
        !            81:                perror(outnams);
        !            82:                return(0);
        !            83:        }
        !            84:        outl = fopen(outnaml, "w");
        !            85:        if(outl == NULL) {
        !            86:                perror(outnaml);
        !            87:                return(0);
        !            88:        }
        !            89:        curarg = s;
        !            90:        return(1);
        !            91: }
        !            92: 
        !            93: doarg()
        !            94: {      struct inst *x, *firstword();
        !            95: 
        !            96:        state = SBBLK;
        !            97:        lookahead = 0;          /* empty buffer */
        !            98:        lastla = 0;
        !            99:        for(;;) {
        !           100:                if (lookahead != lastla){
        !           101:                        strcpy(line,labuf[ (lookahead++) % MAXLA ] );
        !           102:                        if (lookahead == lastla) lookahead = lastla = 0;
        !           103:                }
        !           104:                else
        !           105:                        (void) fgets(line, sizeof(line), fd);
        !           106:                if(feof(fd))
        !           107:                        break;
        !           108:                for(ptr = line; isspace(*ptr); *ptr++)
        !           109:                        ;
        !           110:                if(*ptr == 0 || *ptr == '#')
        !           111:                        continue;
        !           112:                testlabel();
        !           113:                /* deal with symbol table info */
        !           114:                if(*ptr == '.') {
        !           115:                        stab();
        !           116:                        fprintf(outs, " %s", ptr);
        !           117:                        continue;
        !           118:                }
        !           119:                if(*ptr == 0 || *ptr == '\n')
        !           120:                        continue;
        !           121:                x = firstword();
        !           122:                if(x == 0){
        !           123:                        printf("unknown inst: %s\n",ptr);
        !           124:                        continue;
        !           125:                }
        !           126: #ifdef u3b
        !           127:                if ((state == SMAYBE) && !strncmp(ptr,"save",4)){
        !           128:                        state = SPRO;
        !           129:                        getlnum();      /* 5.0 true line # */
        !           130:                }
        !           131: #endif
        !           132:                if(state == SPRO)
        !           133:                        prolog(x);
        !           134:                if(state == SINST)
        !           135:                        tally(x);
        !           136:                if(state == SBBLK && (x->type & JUMP))
        !           137:                        state = SINST;
        !           138:                outinstr();
        !           139:                if(x->type & BYTE)
        !           140:                        fixinstr(x);
        !           141:                fprintf(outs, " %s", ptr);
        !           142:        }
        !           143:        finish();
        !           144: }
        !           145: 
        !           146: 
        !           147: getlnum(){     /* get true line number from 5.0 sdb info */
        !           148:        char *la;
        !           149:        int l;
        !           150: 
        !           151:        /* get true line number by looking ahead */
        !           152:        /* this is necessary for 5.0 sdb output  */
        !           153:        do
        !           154:                (void) fgets(labuf[l = ((lastla++)%MAXLA)], sizeof(line), fd);
        !           155:        while (!feof(fd) && strncmp(begfcn, labuf[l],
        !           156:                        9) && (lookahead != (lastla)%MAXLA ));
        !           157:        if ( strncmp(begfcn, labuf[l], 9) ) 
        !           158:                return;         /* bad input  or not 5.0 */
        !           159:        la = labuf[l];
        !           160:        while ( *la != '\0' ){
        !           161:                while ( *la != ';' && *la != '\0') la++;
        !           162:                if ( *la == ';' ) la++;
        !           163:                while ( isspace(*la) ) la++;
        !           164:                if ( !strncmp(la, ".line" , 5) ){
        !           165:                        lineno = base = atoi( la + 5 );
        !           166:                        return;
        !           167:                }
        !           168:        }
        !           169: }
        !           170: 
        !           171: 
        !           172: /* unbelievable variability in sdb info */
        !           173: stab()
        !           174: {      char buf[128];
        !           175:        int i, j, k;
        !           176: 
        !           177: #ifndef u3b
        !           178:        if(state == SMAYBE && strncmp(ptr, ".word", 5) == 0) {
        !           179:                state = SPRO;
        !           180:                getlnum();
        !           181:                return;
        !           182:        }
        !           183: #endif
        !           184: 
        !           185:        if((i = *(ptr + 1)) != 's' && i != 'f' && i != 'l')
        !           186:                return;
        !           187:        /* real compiler output */
        !           188:        if(sscanf(ptr, ".stabs \"%[^\"]\", %o", buf, &i) == 2 && i == 0144)
        !           189:                strcat(fname, buf);
        !           190:        else if(sscanf(ptr, ".stabd %o,%o,%o", &i, &j, &k) == 3 && i == 0104)
        !           191:                lineno = k;
        !           192:        /* pwb 3.0 */
        !           193:        else if(sscanf(ptr, ".stab %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d",
        !           194:                buf, buf+2, buf+4, buf+6, buf+8, buf+10, buf+12, buf+14, &i)
        !           195:                == 9 && i == 144) {
        !           196:                        for(i = k = 0; buf[i] ; i++)
        !           197:                                if(buf[i] == '\'')
        !           198:                                        buf[k++] = buf[++i];
        !           199:                        buf[k] = 0;
        !           200:                        strcat(fname, buf);
        !           201:                }
        !           202:        else if(sscanf(ptr, ".stab %[0,]%d,%d,%d", buf,&i, &j, &k) == 4
        !           203:                && i == 104)
        !           204:                lineno = k;
        !           205:        /* pwb 5.0 */
        !           206:        else if(sscanf(ptr," .file \"%[^\"]\"", buf) == 1)
        !           207:                strcat(fname, buf);
        !           208:        else if(sscanf(ptr, " .ln %d",&k) == 1)
        !           209:                lineno = k + base - 1;
        !           210: }
        !           211: 
        !           212: testlabel()
        !           213: {      char *p;
        !           214:        int i;
        !           215: 
        !           216: for(;;){
        !           217:        for(p = ptr; *p; p++) {
        !           218:                if(*p == ':')
        !           219:                        break;
        !           220:                if(!isalnum(*p) && *p != '_' && *p != '.')
        !           221:                        return;
        !           222:        }
        !           223:        if(*p == 0)
        !           224:                return;
        !           225:        *p++ = 0;       /* that is overwriting the : */
        !           226:        fprintf(outs, "%s:\n", ptr);
        !           227:        if (lineno != lastline){
        !           228:                for (i=lastline+1; i < lineno ; i++)    /* allign label with right inst */
        !           229:                        fprintf(outl, "%d %s: %d\n", 4*(cnt-1), fname, i);
        !           230:                lastline = lineno - 1;
        !           231:        }
        !           232:        fprintf(outl, "%d %s:\n", 4*(cnt - 1), ptr);
        !           233: #ifdef u3b
        !           234:        if(*ptr != '.')
        !           235: #else
        !           236:        if(*ptr == '_' )
        !           237: #endif
        !           238:                state = SMAYBE;
        !           239:        else
        !           240:                if(state != SPRO)
        !           241:                        state = SINST;
        !           242:        for(ptr = p; isspace(*ptr); ptr++)
        !           243:                ;
        !           244:        }       /* L68:L70: ... */
        !           245: }
        !           246: 
        !           247: struct inst *
        !           248: firstword()
        !           249: {      char buf[sizeof(line)], *p, *q;
        !           250:        struct inst *x;
        !           251:        for(p = buf, q = ptr; isalnum(*q); )
        !           252:                *p++ = *q++;
        !           253:        if(p == buf)
        !           254:                return((struct inst *)0);
        !           255:        *p = 0;
        !           256:        for(x = index[buf[0]]; x && x->iname[0] == buf[0]; x++)
        !           257:                if(strcmp(buf, x->iname) == 0)
        !           258:                        return(x);
        !           259:        return(0);
        !           260: }
        !           261: 
        !           262: outinstr()
        !           263: {      int i;
        !           264:        for(i = lastline + 1; i < lineno; i++)
        !           265:                fprintf(outl, "%d %s: %d\n", 4*(cnt - 1), fname, i);
        !           266:        if (lastline != lineno){
        !           267:                fprintf(outl, "%d %s: %d\n", 4*(cnt - 1), fname, lineno);
        !           268:                lastline = lineno;
        !           269:        }
        !           270:        fprintf(outl, "%d       %s", 4*(cnt - 1), ptr);
        !           271: }
        !           272: 
        !           273: #ifdef u3b
        !           274: 
        !           275: /* 3b code  ***********************************/
        !           276: tally(x)
        !           277: struct inst *x;
        !           278: {
        !           279:        if(x->type & E)
        !           280:                fprintf(outs, " addw2 &1,locprof+%d\n", 4*cnt++);
        !           281:        else {
        !           282:                fprintf(outs, " stsm &1,savecc\n");
        !           283:                fprintf(outs, " gcc %%r0\n");
        !           284:                fprintf(outs, " addw2 &1,locprof+%d\n", 4*cnt++);
        !           285:                fprintf(outs, " scc %%r0\n");
        !           286:                fprintf(outs, " lsm &1,savecc\n");
        !           287:        }
        !           288:        state = SBBLK;
        !           289: }
        !           290: 
        !           291: prolog(x)      /* no liveness test, presumes can't get here by jump */
        !           292: struct inst *x;
        !           293: {      int i;
        !           294:        fprintf(outs, " .data\n");
        !           295:        fprintf(outs, " .globl proFptr\n");     /* the global chain */
        !           296:        fprintf(outs, " .globl savecc\n");
        !           297:        fprintf(outs, " .text\n");
        !           298:        fprintf(outs, " cmpw &0,locprof+4\n");
        !           299:        fprintf(outs, " jne .L%da\n", i = cnt);
        !           300:        fprintf(outs, " movw proFptr,locprof+4\n");
        !           301:        fprintf(outs, " movaw locprof,proFptr\n");
        !           302:        fprintf(outs, ".L%da: addw2 &1,locprof+%d\n", i, 4*cnt++);
        !           303:        state = SBBLK;
        !           304: }
        !           305: 
        !           306: finish()
        !           307: {      int i;
        !           308:        fprintf(outs, " .data\n");
        !           309:        fprintf(outs, " .align  4\n");
        !           310:        fprintf(outs, "locprof:\n");
        !           311:        fprintf(outs, " .word   %d\n", cnt);
        !           312:        fprintf(outs, " .word 0\n");
        !           313:        fprintf(outs, " .word .L%db\n", cnt);
        !           314:        fprintf(outs, " .zero %d\n", 4 * cnt);
        !           315:        fprintf(outs, ".L%db: .byte ", cnt);
        !           316:        for(i = 0; curdir[i]; i++)
        !           317:                fprintf(outs, " 0x%x,", curdir[i]);
        !           318:        fprintf(outs, " 0x%x\n", '/');
        !           319:        fprintf(outs, " .byte ");
        !           320:        if(fname[0])
        !           321:                for(i = 0; fname[i]; i++)
        !           322:                        fprintf(outs, " 0x%x,", fname[i]);
        !           323:        else
        !           324:                for(i = 0; curarg[i]; i++)
        !           325:                        fprintf(outs, " 0x%x,", curarg[i]);
        !           326:        fprintf(outs, "0\n");
        !           327: }
        !           328: 
        !           329: #else
        !           330: 
        !           331: /*  Vax code  **************************/
        !           332: tally(x)
        !           333: struct inst *x;
        !           334: {
        !           335:        if(x->type & E)
        !           336:                fprintf(outs, " incl locprof+%d\n", 4*cnt++);
        !           337:        else {
        !           338:                fprintf(outs, " movpsl -(sp)\n");
        !           339:                fprintf(outs, " incl locprof+%d\n", 4*cnt++);
        !           340:                fprintf(outs, " movw (sp)+,(sp)\n");
        !           341:                fprintf(outs, " bicpsw $0xff\n");
        !           342:                fprintf(outs, " bispsw (sp)+\n");
        !           343:                /* thanks to kirk mckusick */
        !           344:        }
        !           345:        state = SBBLK;
        !           346: }
        !           347: 
        !           348: 
        !           349: prolog(x)      /* no liveness test, presumes can't get here by jump */
        !           350: struct inst *x;
        !           351: {      int i;
        !           352:        fprintf(outs, " .data\n");
        !           353:        fprintf(outs, " .comm _proFptr,4\n");   /* the global chain */
        !           354:        fprintf(outs, " .text\n");
        !           355:        /*if(!(x->type & E))
        !           356:                fprintf(outs, " movpsl -(sp)\n");*/
        !           357:        fprintf(outs, " tstl locprof+4\n");
        !           358:        fprintf(outs, " bneq .L%da\n", i = cnt);
        !           359:        fprintf(outs, " movl _proFptr,locprof+4\n");
        !           360:        fprintf(outs, " moval locprof,_proFptr\n");
        !           361:        fprintf(outs, ".L%da: incl locprof+%d\n", i, 4*cnt++);
        !           362:        /*if(!(x->type & E)) {
        !           363:                fprintf(outs, " movw (sp)+,(sp)\n");
        !           364:                fprintf(outs, " bicpsw $0xff\n");
        !           365:                fprintf(outs, " bispsw (sp)+\n");
        !           366:        }*/
        !           367:        state = SBBLK;
        !           368: }
        !           369: 
        !           370: finish()
        !           371: {      int i;
        !           372:        fprintf(outs, " .data\n");
        !           373:        fprintf(outs, "locprof: .long %d\n", cnt);
        !           374:        fprintf(outs, " .long 0\n");
        !           375:        fprintf(outs, " .long .L%db\n", cnt);
        !           376:        fprintf(outs, " .space %d\n", 4 * cnt);
        !           377:        fprintf(outs, ".L%db: .byte ", cnt);
        !           378:        for(i = 0; curdir[i]; i++)
        !           379:                fprintf(outs, "0x%x,", curdir[i]);
        !           380:        fprintf(outs, "0x%x\n", '/');
        !           381:        fprintf(outs, " .byte ");
        !           382:        if(fname[0])
        !           383:                for(i = 0; fname[i]; i++)
        !           384:                        fprintf(outs, "0x%x,", fname[i]);
        !           385:        else
        !           386:                for(i = 0; curarg[i]; i++)
        !           387:                        fprintf(outs, "0x%x,", curarg[i]);
        !           388:        fprintf(outs, "0\n");
        !           389: }
        !           390: 
        !           391: #endif
        !           392: 
        !           393: 
        !           394: fixinstr(x)
        !           395: struct inst *x;
        !           396: {
        !           397: #ifndef u3b
        !           398:        if(x->iname[0] == 'b')
        !           399:                *ptr = 'j';     /* let assembler worry about branches */
        !           400:        /* this is where the code for aob and sob goes */
        !           401: #endif
        !           402: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.