1*3e12c5d1SDavid du Colombier /* 2*3e12c5d1SDavid du Colombier * vnm -- print symbols in a .v file or archive 3*3e12c5d1SDavid du Colombier */ 4*3e12c5d1SDavid du Colombier #include <u.h> 5*3e12c5d1SDavid du Colombier #include <libc.h> 6*3e12c5d1SDavid du Colombier #include <bio.h> 7*3e12c5d1SDavid du Colombier #include "vc/v.out.h" 8*3e12c5d1SDavid du Colombier #include "obj.h" 9*3e12c5d1SDavid du Colombier 10*3e12c5d1SDavid du Colombier typedef struct Addr Addr; 11*3e12c5d1SDavid du Colombier struct Addr 12*3e12c5d1SDavid du Colombier { 13*3e12c5d1SDavid du Colombier char type; 14*3e12c5d1SDavid du Colombier char sym; 15*3e12c5d1SDavid du Colombier char name; 16*3e12c5d1SDavid du Colombier }; 17*3e12c5d1SDavid du Colombier static Addr addr(void); 18*3e12c5d1SDavid du Colombier static char type2char(int); 19*3e12c5d1SDavid du Colombier 20*3e12c5d1SDavid du Colombier int 21*3e12c5d1SDavid du Colombier _isv(char *s) 22*3e12c5d1SDavid du Colombier { 23*3e12c5d1SDavid du Colombier return s[0] == ANAME /* ANAME */ 24*3e12c5d1SDavid du Colombier && s[1] == D_FILE /* type */ 25*3e12c5d1SDavid du Colombier && s[2] == 1 /* sym */ 26*3e12c5d1SDavid du Colombier && s[3] == '<'; /* name of file */ 27*3e12c5d1SDavid du Colombier } 28*3e12c5d1SDavid du Colombier 29*3e12c5d1SDavid du Colombier Prog * 30*3e12c5d1SDavid du Colombier _readv(Prog *p) 31*3e12c5d1SDavid du Colombier { 32*3e12c5d1SDavid du Colombier int i, as, c; 33*3e12c5d1SDavid du Colombier Addr a; 34*3e12c5d1SDavid du Colombier 35*3e12c5d1SDavid du Colombier as = Bgetc(_bin); /* as */ 36*3e12c5d1SDavid du Colombier if(as < 0) 37*3e12c5d1SDavid du Colombier return 0; 38*3e12c5d1SDavid du Colombier p->kind = aNone; 39*3e12c5d1SDavid du Colombier if(as == ANAME){ 40*3e12c5d1SDavid du Colombier p->kind = aName; 41*3e12c5d1SDavid du Colombier p->type = type2char(Bgetc(_bin)); /* type */ 42*3e12c5d1SDavid du Colombier p->sym = Bgetc(_bin); /* sym */ 43*3e12c5d1SDavid du Colombier c = Bgetc(_bin); 44*3e12c5d1SDavid du Colombier for(i=0; i < NNAME && c > 0; i++){ 45*3e12c5d1SDavid du Colombier p->id[i] = c; 46*3e12c5d1SDavid du Colombier c = Bgetc(_bin); 47*3e12c5d1SDavid du Colombier } 48*3e12c5d1SDavid du Colombier if(i < NNAME) 49*3e12c5d1SDavid du Colombier p->id[i] = c; 50*3e12c5d1SDavid du Colombier return p; 51*3e12c5d1SDavid du Colombier } 52*3e12c5d1SDavid du Colombier if(as == ATEXT) 53*3e12c5d1SDavid du Colombier p->kind = aText; 54*3e12c5d1SDavid du Colombier else if(as == AGLOBL) 55*3e12c5d1SDavid du Colombier p->kind = aData; 56*3e12c5d1SDavid du Colombier Bgetc(_bin); /* reg */ 57*3e12c5d1SDavid du Colombier Bgetc(_bin); /* lineno(low) */ 58*3e12c5d1SDavid du Colombier Bgetc(_bin); /* lineno(high) */ 59*3e12c5d1SDavid du Colombier Bgetc(_bin); /* lineno(lowhigh) */ 60*3e12c5d1SDavid du Colombier Bgetc(_bin); /* lineno(highhigh) */ 61*3e12c5d1SDavid du Colombier a = addr(); 62*3e12c5d1SDavid du Colombier addr(); 63*3e12c5d1SDavid du Colombier if(a.type != D_OREG 64*3e12c5d1SDavid du Colombier || a.name != D_STATIC && a.name != D_EXTERN) 65*3e12c5d1SDavid du Colombier p->kind = aNone; 66*3e12c5d1SDavid du Colombier p->sym = a.sym; 67*3e12c5d1SDavid du Colombier return p; 68*3e12c5d1SDavid du Colombier } 69*3e12c5d1SDavid du Colombier 70*3e12c5d1SDavid du Colombier static Addr 71*3e12c5d1SDavid du Colombier addr(void) 72*3e12c5d1SDavid du Colombier { 73*3e12c5d1SDavid du Colombier Addr a; 74*3e12c5d1SDavid du Colombier int i; 75*3e12c5d1SDavid du Colombier long off = 0; 76*3e12c5d1SDavid du Colombier 77*3e12c5d1SDavid du Colombier a.type = Bgetc(_bin); /* a.type */ 78*3e12c5d1SDavid du Colombier Bgetc(_bin); /* reg */ 79*3e12c5d1SDavid du Colombier a.sym = Bgetc(_bin); /* sym index */ 80*3e12c5d1SDavid du Colombier a.name = Bgetc(_bin); /* sym type */ 81*3e12c5d1SDavid du Colombier switch(a.type){ 82*3e12c5d1SDavid du Colombier default: 83*3e12c5d1SDavid du Colombier fprint(2, "%s: unknown type in addr %d\n", argv0, a.type); 84*3e12c5d1SDavid du Colombier exits("type"); 85*3e12c5d1SDavid du Colombier 86*3e12c5d1SDavid du Colombier case D_NONE: case D_REG: case D_FREG: case D_MREG: 87*3e12c5d1SDavid du Colombier case D_FCREG: case D_LO: case D_HI: 88*3e12c5d1SDavid du Colombier break; 89*3e12c5d1SDavid du Colombier case D_OREG: 90*3e12c5d1SDavid du Colombier case D_CONST: 91*3e12c5d1SDavid du Colombier case D_BRANCH: 92*3e12c5d1SDavid du Colombier off = Bgetc(_bin); 93*3e12c5d1SDavid du Colombier off |= Bgetc(_bin) << 8; 94*3e12c5d1SDavid du Colombier off |= Bgetc(_bin) << 16; 95*3e12c5d1SDavid du Colombier off |= Bgetc(_bin) << 24; 96*3e12c5d1SDavid du Colombier off = off<0 ? -off : off; 97*3e12c5d1SDavid du Colombier break; 98*3e12c5d1SDavid du Colombier case D_SCONST: 99*3e12c5d1SDavid du Colombier for(i=0; i<NSNAME; i++) 100*3e12c5d1SDavid du Colombier Bgetc(_bin); 101*3e12c5d1SDavid du Colombier break; 102*3e12c5d1SDavid du Colombier case D_FCONST: 103*3e12c5d1SDavid du Colombier for(i=0; i<8; i++) 104*3e12c5d1SDavid du Colombier Bgetc(_bin); 105*3e12c5d1SDavid du Colombier break; 106*3e12c5d1SDavid du Colombier } 107*3e12c5d1SDavid du Colombier if(a.sym!=0 && (a.name==D_PARAM || a.name==D_AUTO)) 108*3e12c5d1SDavid du Colombier _offset(a.sym, type2char(a.name), off); 109*3e12c5d1SDavid du Colombier return a; 110*3e12c5d1SDavid du Colombier } 111*3e12c5d1SDavid du Colombier 112*3e12c5d1SDavid du Colombier static char 113*3e12c5d1SDavid du Colombier type2char(int t) 114*3e12c5d1SDavid du Colombier { 115*3e12c5d1SDavid du Colombier switch(t){ 116*3e12c5d1SDavid du Colombier case D_EXTERN: return 'U'; 117*3e12c5d1SDavid du Colombier case D_STATIC: return 'b'; 118*3e12c5d1SDavid du Colombier case D_AUTO: return 'a'; 119*3e12c5d1SDavid du Colombier case D_PARAM: return 'p'; 120*3e12c5d1SDavid du Colombier default: return UNKNOWN; 121*3e12c5d1SDavid du Colombier } 122*3e12c5d1SDavid du Colombier } 123