Annotation of coherent/b/bin/c/n1/snap0.c, revision 1.1.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.