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