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

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

unix.superglobalmegacorp.com

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