Annotation of coherent/b/bin/c/n1/snap0.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Routines to print out the
        !             3:  * internal data structures in a
        !             4:  * human being readable form.
        !             5:  * All machines.
        !             6:  */
        !             7: 
        !             8: #ifdef   vax
        !             9: #include "INC$LIB:cc1.h"
        !            10: #else
        !            11: #include "cc1.h"
        !            12: #endif
        !            13: 
        !            14: /*
        !            15:  * None of this applies in TINY mode.
        !            16:  */
        !            17: #if !TINY
        !            18: #define        WIDTH   72
        !            19: 
        !            20: extern char    *milnames[];
        !            21: extern char    *mionames[];
        !            22: extern char    *mdlnames[];
        !            23: extern char    *mdonames[];
        !            24: extern char    *segnames[];
        !            25: extern char    *regnames[];
        !            26: extern char    *tynames[];
        !            27: static char    *cxnames[] = {
        !            28:        "Effect",
        !            29:        "Lvalue",
        !            30:        "Rvalue",
        !            31:        "Fnarg",
        !            32:        "Laddr",
        !            33:        "Raddr",
        !            34:        "Return",
        !            35:        "Switch",
        !            36:        "Init",
        !            37:        "Flow",
        !            38:        "Passed",
        !            39:        "Junk",
        !            40:        "Hard",
        !            41:        "Eq",   "Ne",
        !            42:        "Gt",   "Ge",   "Le",   "Lt",
        !            43:        "Ugt",  "Uge",  "Ule", "Ult"
        !            44: };
        !            45: 
        !            46: /*
        !            47:  * Snap a format string, the usual sort of mapping:
        !            48:  *     %P - print a pointer.
        !            49:  *     %R - print a register string.
        !            50:  *     %M - print a register mask.
        !            51:  *     %C - print a context string.
        !            52:  *     %W - snap a wall with embedded string.
        !            53:  *     %A - snap an operator name.
        !            54:  *     %E - snap an entire tree.
        !            55:  *     %d - decimal integer.
        !            56:  *     %D - long decimal integer.
        !            57:  *     %I - Identify a pattern by file and linenumber
        !            58:  */
        !            59: snapf(fp, ap)
        !            60: register char *fp;
        !            61: int ap;
        !            62: {
        !            63:        register int *app;
        !            64:        register int c;
        !            65:        static  char *string = "%s";
        !            66:        PREGSET m;
        !            67:        char *p;
        !            68:        PAT *patp;
        !            69: 
        !            70:        app = ≈
        !            71:        while (c = *fp++) {
        !            72:                if (c != '%') {
        !            73:                        putchar(c);
        !            74:                        continue;
        !            75:                }
        !            76:                switch (c = *fp++) {
        !            77:                case 'A':
        !            78:                        c = *app++;
        !            79:                        if (c < MDLBASE)
        !            80:                                p = milnames[c];
        !            81:                        else if (c < MIOBASE)
        !            82:                                p = mdlnames[c-MDLBASE];
        !            83:                        else if (c < MDOBASE)
        !            84:                                p = mionames[c-MIOBASE];
        !            85:                        else
        !            86:                                p = mdonames[c-MDOBASE];
        !            87:                        printf(string, p);
        !            88:                        continue;
        !            89:                case 'C':
        !            90:                        printf(string, cxnames[*app++]);
        !            91:                        continue;
        !            92:                case 'd':
        !            93:                        printf("%d", *app++);
        !            94:                        continue;
        !            95:                case 'D':
        !            96:                        printf("%ld", *((long *)app)++);
        !            97:                        continue;
        !            98:                case 'E':
        !            99:                        snaptree(*((TREE **)app)++, 0);
        !           100:                        continue;
        !           101:                case 'P':
        !           102:                        psnap(*((char **)app)++);
        !           103:                        continue;
        !           104:                case 'I':
        !           105:                        patp = *((PAT **)app)++;
        !           106:                        if (patp != NULL)
        !           107:                                printf("%8s:%3d", namecache[patp->p_fname],
        !           108:                                        patp->p_fline);
        !           109:                        else
        !           110:                                printf("------------");
        !           111:                        continue;
        !           112:                case 'R':
        !           113:                        if ((c = *app++) >= 0 && c < NREG) {
        !           114:                                p = regnames[c];
        !           115:                                printf(string, p);
        !           116:                        } else
        !           117:                                printf("Reg %d", c);
        !           118:                        continue;
        !           119:                case 'M':
        !           120:                        m = *((PREGSET *)app)++;
        !           121:                        m &= ~NOFREE;   /* Forget the default busy set */
        !           122:                        printf("(");
        !           123:                        for (c = 0; c < NRREG; c += 1) {
        !           124:                                if ((reg[c].r_phys&m) == 0)
        !           125:                                        continue;
        !           126:                                m &= ~reg[c].r_phys;
        !           127:                                printf("%s", regnames[c]);
        !           128:                                if (m != 0)
        !           129:                                        putchar('|');
        !           130:                                else
        !           131:                                        break;
        !           132:                        }
        !           133:                        printf(")");
        !           134:                        continue;
        !           135:                case 'W':
        !           136:                        snapwall(*((char **)app)++);
        !           137:                        continue;
        !           138:                default:
        !           139:                        cbotch("unknown snapf %c", c);
        !           140:                        continue;
        !           141:                }
        !           142:        }
        !           143: }
        !           144: 
        !           145: /*
        !           146:  * Snap a tree.
        !           147:  * The argument 'n' is the
        !           148:  * number of spaces to put out
        !           149:  * before the node; it is used
        !           150:  * to help format the tree in
        !           151:  * a tasteful fashon.
        !           152:  * Trees are printed in the same format
        !           153:  * used in the codetables and the intermediate file printer::
        !           154:  *     NODE
        !           155:  *             LEFT
        !           156:  *             RIGHT
        !           157:  */
        !           158: snaptree(tp, n)
        !           159: register TREE *tp;
        !           160: {
        !           161:        register i, op;
        !           162: 
        !           163:        if (tp == NULL)
        !           164:                return;
        !           165:        op = tp->t_op;
        !           166:        snapf("%P %I ", tp, tp->t_patp);
        !           167:        i = n;
        !           168:        while (i--)
        !           169:                putchar(' ');
        !           170:        snapnode(tp);
        !           171:        if (!isleaf(op)) {
        !           172:                snaptree(tp->t_lp, n+2);
        !           173:                if (op!=FIELD)
        !           174:                        snaptree(tp->t_rp, n+2);
        !           175:        }
        !           176: }
        !           177: 
        !           178: /*
        !           179:  * Snap a node.
        !           180:  * The required tabbing has
        !           181:  * been already put out.
        !           182:  */
        !           183: snapnode(tp)
        !           184: register TREE *tp;
        !           185: {
        !           186:        register int op;
        !           187:        register char *p;
        !           188:        register sizeof_t offs;
        !           189: 
        !           190:        op = tp->t_op;
        !           191:        if (op < MDLBASE) {
        !           192:                snaptype(tp, milnames[op]);
        !           193:                switch(op) {
        !           194: 
        !           195:                case ICON:
        !           196:                        isnap(tp->t_ival);
        !           197:                        break;
        !           198: 
        !           199:                case LCON:
        !           200:                        lsnap(tp->t_lval);
        !           201:                        break;
        !           202: 
        !           203:                case AID:
        !           204:                case PID:
        !           205:                        printf(" at %ld", (long)tp->t_offs);
        !           206:                        break;
        !           207: 
        !           208:                case LID:
        !           209:                        printf(" %s L%d", segnames[tp->t_seg], tp->t_label);
        !           210:                        goto snapoffs;
        !           211: 
        !           212:                case GID:
        !           213:                        printf(" %s %s", segnames[tp->t_seg], tp->t_sp->s_id);
        !           214:                snapoffs:
        !           215:                        if ((offs=tp->t_offs) != 0) {
        !           216:                                if (offs >= 0)
        !           217:                                        putchar('+');
        !           218:                                printf("%ld", (long)offs);
        !           219:                        }
        !           220:                        break;
        !           221: 
        !           222:                case DCON:
        !           223:                        dsnap(tp->t_dval);
        !           224:                        break;
        !           225: 
        !           226:                case REG:
        !           227:                        snapf(" %R", tp->t_reg);
        !           228:                        break;
        !           229: 
        !           230:                }
        !           231:        } else if (op < MIOBASE) {
        !           232:                snaptype(tp, mdlnames[op-MDLBASE]);
        !           233:                mdlsnap(tp);
        !           234:        } else if (op < MDOBASE) {
        !           235:                snaptype(tp, mionames[op-MIOBASE]);
        !           236:                if (op == FIELD)
        !           237:                        printf(" base=%d width=%d", tp->t_base, tp->t_width);
        !           238:        } else if (op < ETCBASE) {
        !           239:                snaptype(tp, mdonames[op-MDOBASE]);
        !           240:                mdosnap(tp);
        !           241:        } else 
        !           242:                cbotch("bad tree operator: %d", op);
        !           243:        printf("\n");
        !           244: }
        !           245: 
        !           246: /*
        !           247:  * Put out a name.
        !           248:  * Tag it with a type.
        !           249:  * Used all over.
        !           250:  */
        !           251: snaptype(tp, p)
        !           252: register TREE *tp;
        !           253: char *p;
        !           254: {
        !           255:        register t;
        !           256: 
        !           257:        t = tp->t_type;
        !           258:        printf("%s %s", p, tynames[t]);
        !           259:        if (issized(t))
        !           260:                printf(" (%d bytes)", tp->t_size);
        !           261:        csnap(tp->t_cost);
        !           262:        if (tp->t_treg != NONE)
        !           263:                snapf(" nr=%R", tp->t_treg);
        !           264:        if (tp->t_rreg != NONE)
        !           265:                snapf(" rr=%R", tp->t_rreg);
        !           266:        if (tp->t_used != 0)
        !           267:                snapf(" used=%M", tp->t_used);
        !           268:        fsnap(tp->t_flag);
        !           269: }
        !           270: 
        !           271: /*
        !           272:  * Put out a titled wall.
        !           273:  * If the title is NULL there is no title
        !           274:  * at all.
        !           275:  */
        !           276: snapwall(s)
        !           277: char *s;
        !           278: {
        !           279:        register n, u;
        !           280: 
        !           281:        if (s == NULL) {
        !           282:                snapdash(WIDTH);
        !           283:                putchar('\n');
        !           284:                return;
        !           285:        }
        !           286:        u = strlen(s) + 2;
        !           287:        n = (WIDTH - u) / 2;
        !           288:        u += n;
        !           289:        snapdash(n);
        !           290:        printf(" %s ", s);
        !           291:        snapdash(WIDTH - u);
        !           292:        putchar('\n');
        !           293: }
        !           294: 
        !           295: /*
        !           296:  * Put out `n' dashes.
        !           297:  */
        !           298: snapdash(n)
        !           299: register n;
        !           300: {
        !           301:        if (n != 0) {
        !           302:                do {
        !           303:                        putchar('-');
        !           304:                } while (--n);
        !           305:        }
        !           306: }
        !           307: 
        !           308: /*
        !           309:  * Fill in automatic nodes so they don't print garbage.
        !           310:  */
        !           311: snapfix(tp) register TREE *tp;
        !           312: {
        !           313:        tp->t_patp = tp->t_lp = tp->t_rp = NULL;
        !           314:        tp->t_flag = 0;
        !           315:        tp->t_cost = 0;
        !           316:        tp->t_rreg = NONE;
        !           317:        tp->t_treg = NONE;
        !           318:        tp->t_used = 0;
        !           319: }
        !           320: 
        !           321: #endif

unix.superglobalmegacorp.com

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