|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.