xref: /plan9/sys/src/libmach/vobj.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
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