Annotation of lucent/sys/src/libmach/xobj.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * xobj.c - identify and parse a 3210 object file
                      3:  */
                      4: #include <u.h>
                      5: #include <libc.h>
                      6: #include <bio.h>
                      7: #include "xc/x.out.h"
                      8: #include "obj.h"
                      9: 
                     10: typedef struct Addr    Addr;
                     11: struct Addr
                     12: {
                     13:        char    type;
                     14:        char    sym;
                     15:        char    name;
                     16: };
                     17: static Addr addr(Biobuf*);
                     18: static char type2char(int);
                     19: static void    skip(Biobuf*, int);
                     20: 
                     21: 
                     22: int
                     23: _isx(char *s)
                     24: {
                     25:        return  s[0] == ANAME                           /* ANAME */
                     26:                && s[1] == D_FILE                       /* type */
                     27:                && s[2] == 1                            /* sym */
                     28:                && s[3] == '<';                         /* name of file */
                     29: }
                     30: 
                     31: 
                     32: int
                     33: _readx(Biobuf *bp, Prog *p)
                     34: {
                     35:        int as, n, isf;
                     36:        Addr a;
                     37: 
                     38:        as = Bgetc(bp);                 /* as */
                     39:        if(as < 0)
                     40:                return 0;
                     41:        p->kind = aNone;
                     42:        if(as == ANAME){
                     43:                p->kind = aName;
                     44:                p->type = type2char(Bgetc(bp));         /* type */
                     45:                p->sym = Bgetc(bp);                     /* sym */
                     46:                n = 0;
                     47:                for(;;) {
                     48:                        as = Bgetc(bp);
                     49:                        if(as < 0)
                     50:                                return 0;
                     51:                        n++;
                     52:                        if(as == 0)
                     53:                                break;
                     54:                }
                     55:                p->id = malloc(n);
                     56:                if(p->id == 0)
                     57:                        return 0;
                     58:                Bseek(bp, -n, 1);
                     59:                if(Bread(bp, p->id, n) != n)
                     60:                        return 0;
                     61:                return 1;
                     62:        }
                     63:        if(as == ATEXT)
                     64:                p->kind = aText;
                     65:        else if(as == AGLOBL)
                     66:                p->kind = aData;
                     67:        Bgetc(bp);              /* reg */
                     68:        isf = Bgetc(bp) >> 6;   /* cc & flt */
                     69:        skip(bp, 4);            /* lineno */
                     70:        a = addr(bp);
                     71:        addr(bp);
                     72:        if(isf > 1)
                     73:                addr(bp);
                     74:        if(isf > 2)
                     75:                addr(bp);
                     76:        if(a.type != D_NAME || a.name != D_STATIC && a.name != D_EXTERN)
                     77:                p->kind = aNone;
                     78:        p->sym = a.sym;
                     79:        return 1;
                     80: }
                     81: 
                     82: static Addr
                     83: addr(Biobuf *bp)
                     84: {
                     85:        Addr a;
                     86:        long off;
                     87: 
                     88:        a.type = Bgetc(bp);     /* a.type */
                     89:        skip(bp, 1);            /* reg */
                     90:        a.sym = Bgetc(bp);      /* sym index */
                     91:        a.name = Bgetc(bp);     /* sym type */
                     92:        switch(a.type) {
                     93:        default:
                     94:        case D_NONE: case D_REG: case D_FREG: case D_CREG:
                     95:        case D_INDREG: case D_INC: case D_DEC:
                     96:                break;
                     97:        case D_INCREG:
                     98:                Bgetc(bp);
                     99:                break;
                    100:        case D_BRANCH:
                    101:        case D_OREG:
                    102:        case D_NAME:
                    103:        case D_CONST:
                    104:                off = Bgetc(bp);
                    105:                off |= Bgetc(bp) << 8;
                    106:                off |= Bgetc(bp) << 16;
                    107:                off |= Bgetc(bp) << 24;
                    108:                if(off < 0)
                    109:                        off = -off;
                    110:                if(a.sym!=0 && (a.name==D_PARAM || a.name==D_AUTO))
                    111:                        _offset(a.sym, off);
                    112:                break;
                    113:        case D_SCONST:
                    114:                skip(bp, NSNAME);
                    115:                break;
                    116:        case D_FCONST:
                    117:        case D_AFCONST:
                    118:                skip(bp, 4);
                    119:                break;
                    120:        }
                    121:        return a;
                    122: }
                    123: 
                    124: 
                    125: static char
                    126: type2char(int t)
                    127: {
                    128:        switch(t){
                    129:        case D_EXTERN:          return 'U';
                    130:        case D_STATIC:          return 'b';
                    131:        case D_AUTO:            return 'a';
                    132:        case D_PARAM:           return 'p';
                    133:        default:                return UNKNOWN;
                    134:        }
                    135: }
                    136: 
                    137: static void
                    138: skip(Biobuf *bp, int n)
                    139: {
                    140:        while (n-- > 0)
                    141:                Bgetc(bp);
                    142: }

unix.superglobalmegacorp.com

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