Annotation of lucent/sys/src/libmach/vobj.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * vobj.c - identify and parse a mips object file
        !             3:  */
        !             4: #include <u.h>
        !             5: #include <libc.h>
        !             6: #include <bio.h>
        !             7: #include "vc/v.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: int
        !            22: _isv(char *s)
        !            23: {
        !            24:        return  s[0] == ANAME                           /* ANAME */
        !            25:                && s[1] == D_FILE                       /* type */
        !            26:                && s[2] == 1                            /* sym */
        !            27:                && s[3] == '<';                         /* name of file */
        !            28: }
        !            29: 
        !            30: int
        !            31: _readv(Biobuf *bp, Prog *p)
        !            32: {
        !            33:        int as, n;
        !            34:        Addr a;
        !            35: 
        !            36:        as = Bgetc(bp);                 /* as */
        !            37:        if(as < 0)
        !            38:                return 0;
        !            39:        p->kind = aNone;
        !            40:        if(as == ANAME){
        !            41:                p->kind = aName;
        !            42:                p->type = type2char(Bgetc(bp));         /* type */
        !            43:                p->sym = Bgetc(bp);                     /* sym */
        !            44:                n = 0;
        !            45:                for(;;) {
        !            46:                        as = Bgetc(bp);
        !            47:                        if(as < 0)
        !            48:                                return 0;
        !            49:                        n++;
        !            50:                        if(as == 0)
        !            51:                                break;
        !            52:                }
        !            53:                p->id = malloc(n);
        !            54:                if(p->id == 0)
        !            55:                        return 0;
        !            56:                Bseek(bp, -n, 1);
        !            57:                if(Bread(bp, p->id, n) != n)
        !            58:                        return 0;
        !            59:                return 1;
        !            60:        }
        !            61:        if(as == ATEXT)
        !            62:                p->kind = aText;
        !            63:        else if(as == AGLOBL)
        !            64:                p->kind = aData;
        !            65:        skip(bp, 5);            /* reg(1), lineno(4) */
        !            66:        a = addr(bp);
        !            67:        addr(bp);
        !            68:        if(a.type != D_OREG || a.name != D_STATIC && a.name != D_EXTERN)
        !            69:                p->kind = aNone;
        !            70:        p->sym = a.sym;
        !            71:        return 1;
        !            72: }
        !            73: 
        !            74: static Addr
        !            75: addr(Biobuf *bp)
        !            76: {
        !            77:        Addr a;
        !            78:        long off;
        !            79: 
        !            80:        a.type = Bgetc(bp);     /* a.type */
        !            81:        skip(bp,1);             /* reg */
        !            82:        a.sym = Bgetc(bp);      /* sym index */
        !            83:        a.name = Bgetc(bp);     /* sym type */
        !            84:        switch(a.type){
        !            85:        default:
        !            86:        case D_NONE: case D_REG: case D_FREG: case D_MREG:
        !            87:        case D_FCREG: case D_LO: case D_HI:
        !            88:                break;
        !            89:        case D_OREG:
        !            90:        case D_CONST:
        !            91:        case D_BRANCH:
        !            92:                off = Bgetc(bp);
        !            93:                off |= Bgetc(bp) << 8;
        !            94:                off |= Bgetc(bp) << 16;
        !            95:                off |= Bgetc(bp) << 24;
        !            96:                if(off < 0)
        !            97:                        off = -off;
        !            98:                if(a.sym && (a.name==D_PARAM || a.name==D_AUTO))
        !            99:                        _offset(a.sym, off);
        !           100:                break;
        !           101:        case D_SCONST:
        !           102:                skip(bp, NSNAME);
        !           103:                break;
        !           104:        case D_FCONST:
        !           105:                skip(bp, 8);
        !           106:                break;
        !           107:        }
        !           108:        return a;
        !           109: }
        !           110: 
        !           111: static char
        !           112: type2char(int t)
        !           113: {
        !           114:        switch(t){
        !           115:        case D_EXTERN:          return 'U';
        !           116:        case D_STATIC:          return 'b';
        !           117:        case D_AUTO:            return 'a';
        !           118:        case D_PARAM:           return 'p';
        !           119:        default:                return UNKNOWN;
        !           120:        }
        !           121: }
        !           122: 
        !           123: static void
        !           124: skip(Biobuf *bp, int n)
        !           125: {
        !           126:        while (n-- > 0)
        !           127:                Bgetc(bp);
        !           128: }

unix.superglobalmegacorp.com

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