xref: /plan9-contrib/sys/src/cmd/ld/sub.c (revision 40d015479ed36701ae6dcfd8814f849fc6285e8d)
1*40d01547SDavid du Colombier #include	"l.h"
2*40d01547SDavid du Colombier 
3*40d01547SDavid du Colombier static	usize	nhunk;
4*40d01547SDavid du Colombier static	usize	tothunk;
5*40d01547SDavid du Colombier static	char*	hunk;
6*40d01547SDavid du Colombier 
7*40d01547SDavid du Colombier void
diag(char * fmt,...)8*40d01547SDavid du Colombier diag(char *fmt, ...)
9*40d01547SDavid du Colombier {
10*40d01547SDavid du Colombier 	char buf[STRINGSZ], *tn;
11*40d01547SDavid du Colombier 	va_list arg;
12*40d01547SDavid du Colombier 
13*40d01547SDavid du Colombier 	tn = "??none??";
14*40d01547SDavid du Colombier 	if(curtext != P && curtext->from.sym != S)
15*40d01547SDavid du Colombier 		tn = curtext->from.sym->name;
16*40d01547SDavid du Colombier 	va_start(arg, fmt);
17*40d01547SDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
18*40d01547SDavid du Colombier 	va_end(arg);
19*40d01547SDavid du Colombier 	print("%s: %s\n", tn, buf);
20*40d01547SDavid du Colombier 
21*40d01547SDavid du Colombier 	nerrors++;
22*40d01547SDavid du Colombier 	if(nerrors > 10) {
23*40d01547SDavid du Colombier 		print("too many errors\n");
24*40d01547SDavid du Colombier 		errorexit();
25*40d01547SDavid du Colombier 	}
26*40d01547SDavid du Colombier }
27*40d01547SDavid du Colombier 
28*40d01547SDavid du Colombier void
errorexit(void)29*40d01547SDavid du Colombier errorexit(void)
30*40d01547SDavid du Colombier {
31*40d01547SDavid du Colombier 
32*40d01547SDavid du Colombier 	if(nerrors) {
33*40d01547SDavid du Colombier 		if(cout >= 0)
34*40d01547SDavid du Colombier 			remove(outfile);
35*40d01547SDavid du Colombier 		exits("error");
36*40d01547SDavid du Colombier 	}
37*40d01547SDavid du Colombier 	exits(0);
38*40d01547SDavid du Colombier }
39*40d01547SDavid du Colombier 
40*40d01547SDavid du Colombier void
prasm(Prog * p)41*40d01547SDavid du Colombier prasm(Prog *p)
42*40d01547SDavid du Colombier {
43*40d01547SDavid du Colombier 	print("%P\n", p);
44*40d01547SDavid du Colombier }
45*40d01547SDavid du Colombier 
46*40d01547SDavid du Colombier int
Sconv(Fmt * fp)47*40d01547SDavid du Colombier Sconv(Fmt *fp)
48*40d01547SDavid du Colombier {
49*40d01547SDavid du Colombier 	int i, c;
50*40d01547SDavid du Colombier 	char str[STRINGSZ], *p, *a;
51*40d01547SDavid du Colombier 
52*40d01547SDavid du Colombier 	a = va_arg(fp->args, char*);
53*40d01547SDavid du Colombier 	p = str;
54*40d01547SDavid du Colombier 	for(i=0; i<sizeof(long); i++) {
55*40d01547SDavid du Colombier 		c = a[i] & 0xff;
56*40d01547SDavid du Colombier 		if(c >= 'a' && c <= 'z' ||
57*40d01547SDavid du Colombier 		   c >= 'A' && c <= 'Z' ||
58*40d01547SDavid du Colombier 		   c >= '0' && c <= '9' ||
59*40d01547SDavid du Colombier 		   c == ' ' || c == '%') {
60*40d01547SDavid du Colombier 			*p++ = c;
61*40d01547SDavid du Colombier 			continue;
62*40d01547SDavid du Colombier 		}
63*40d01547SDavid du Colombier 		*p++ = '\\';
64*40d01547SDavid du Colombier 		switch(c) {
65*40d01547SDavid du Colombier 		case 0:
66*40d01547SDavid du Colombier 			*p++ = 'z';
67*40d01547SDavid du Colombier 			continue;
68*40d01547SDavid du Colombier 		case '\\':
69*40d01547SDavid du Colombier 		case '"':
70*40d01547SDavid du Colombier 			*p++ = c;
71*40d01547SDavid du Colombier 			continue;
72*40d01547SDavid du Colombier 		case '\n':
73*40d01547SDavid du Colombier 			*p++ = 'n';
74*40d01547SDavid du Colombier 			continue;
75*40d01547SDavid du Colombier 		case '\t':
76*40d01547SDavid du Colombier 			*p++ = 't';
77*40d01547SDavid du Colombier 			continue;
78*40d01547SDavid du Colombier 		}
79*40d01547SDavid du Colombier 		*p++ = (c>>6) + '0';
80*40d01547SDavid du Colombier 		*p++ = ((c>>3) & 7) + '0';
81*40d01547SDavid du Colombier 		*p++ = (c & 7) + '0';
82*40d01547SDavid du Colombier 	}
83*40d01547SDavid du Colombier 	*p = 0;
84*40d01547SDavid du Colombier 	return fmtstrcpy(fp, str);
85*40d01547SDavid du Colombier }
86*40d01547SDavid du Colombier 
87*40d01547SDavid du Colombier void
nopstat(char * f,Count * c)88*40d01547SDavid du Colombier nopstat(char *f, Count *c)
89*40d01547SDavid du Colombier {
90*40d01547SDavid du Colombier 	if(c->outof)
91*40d01547SDavid du Colombier 	Bprint(&bso, "%s delay %ld/%ld (%.2f)\n", f,
92*40d01547SDavid du Colombier 		c->outof - c->count, c->outof,
93*40d01547SDavid du Colombier 		(double)(c->outof - c->count)/c->outof);
94*40d01547SDavid du Colombier }
95*40d01547SDavid du Colombier 
96*40d01547SDavid du Colombier void
xdefine(char * p,int t,vlong v)97*40d01547SDavid du Colombier xdefine(char *p, int t, vlong v)
98*40d01547SDavid du Colombier {
99*40d01547SDavid du Colombier 	Sym *s;
100*40d01547SDavid du Colombier 
101*40d01547SDavid du Colombier 	s = lookup(p, 0);
102*40d01547SDavid du Colombier 	if(s->type == 0 || s->type == SXREF) {
103*40d01547SDavid du Colombier 		s->type = t;
104*40d01547SDavid du Colombier 		s->value = v;
105*40d01547SDavid du Colombier 	}
106*40d01547SDavid du Colombier }
107*40d01547SDavid du Colombier 
108*40d01547SDavid du Colombier void
undef(void)109*40d01547SDavid du Colombier undef(void)
110*40d01547SDavid du Colombier {
111*40d01547SDavid du Colombier 	int i;
112*40d01547SDavid du Colombier 	Sym *s;
113*40d01547SDavid du Colombier 
114*40d01547SDavid du Colombier 	for(i=0; i<NHASH; i++)
115*40d01547SDavid du Colombier 	for(s = hash[i]; s != S; s = s->link)
116*40d01547SDavid du Colombier 		if(s->type == SXREF)
117*40d01547SDavid du Colombier 			diag("%s: not defined", s->name);
118*40d01547SDavid du Colombier }
119*40d01547SDavid du Colombier 
120*40d01547SDavid du Colombier vlong
atolwhex(char * s)121*40d01547SDavid du Colombier atolwhex(char *s)
122*40d01547SDavid du Colombier {
123*40d01547SDavid du Colombier 	vlong n;
124*40d01547SDavid du Colombier 	int f;
125*40d01547SDavid du Colombier 
126*40d01547SDavid du Colombier 	n = 0;
127*40d01547SDavid du Colombier 	f = 0;
128*40d01547SDavid du Colombier 	while(*s == ' ' || *s == '\t')
129*40d01547SDavid du Colombier 		s++;
130*40d01547SDavid du Colombier 	if(*s == '-' || *s == '+') {
131*40d01547SDavid du Colombier 		if(*s++ == '-')
132*40d01547SDavid du Colombier 			f = 1;
133*40d01547SDavid du Colombier 		while(*s == ' ' || *s == '\t')
134*40d01547SDavid du Colombier 			s++;
135*40d01547SDavid du Colombier 	}
136*40d01547SDavid du Colombier 	if(s[0]=='0' && s[1]){
137*40d01547SDavid du Colombier 		if(s[1]=='x' || s[1]=='X'){
138*40d01547SDavid du Colombier 			s += 2;
139*40d01547SDavid du Colombier 			for(;;){
140*40d01547SDavid du Colombier 				if(*s >= '0' && *s <= '9')
141*40d01547SDavid du Colombier 					n = n*16 + *s++ - '0';
142*40d01547SDavid du Colombier 				else if(*s >= 'a' && *s <= 'f')
143*40d01547SDavid du Colombier 					n = n*16 + *s++ - 'a' + 10;
144*40d01547SDavid du Colombier 				else if(*s >= 'A' && *s <= 'F')
145*40d01547SDavid du Colombier 					n = n*16 + *s++ - 'A' + 10;
146*40d01547SDavid du Colombier 				else
147*40d01547SDavid du Colombier 					break;
148*40d01547SDavid du Colombier 			}
149*40d01547SDavid du Colombier 		} else
150*40d01547SDavid du Colombier 			while(*s >= '0' && *s <= '7')
151*40d01547SDavid du Colombier 				n = n*8 + *s++ - '0';
152*40d01547SDavid du Colombier 	} else
153*40d01547SDavid du Colombier 		while(*s >= '0' && *s <= '9')
154*40d01547SDavid du Colombier 			n = n*10 + *s++ - '0';
155*40d01547SDavid du Colombier 	if(f)
156*40d01547SDavid du Colombier 		n = -n;
157*40d01547SDavid du Colombier 	return n;
158*40d01547SDavid du Colombier }
159*40d01547SDavid du Colombier 
160*40d01547SDavid du Colombier vlong
rnd(vlong v,long r)161*40d01547SDavid du Colombier rnd(vlong v, long r)
162*40d01547SDavid du Colombier {
163*40d01547SDavid du Colombier 	long c;
164*40d01547SDavid du Colombier 
165*40d01547SDavid du Colombier 	if(r <= 0)
166*40d01547SDavid du Colombier 		return v;
167*40d01547SDavid du Colombier 	v += r - 1;
168*40d01547SDavid du Colombier 	c = v % r;
169*40d01547SDavid du Colombier 	if(c < 0)
170*40d01547SDavid du Colombier 		c += r;
171*40d01547SDavid du Colombier 	v -= c;
172*40d01547SDavid du Colombier 	return v;
173*40d01547SDavid du Colombier }
174*40d01547SDavid du Colombier 
175*40d01547SDavid du Colombier Prog*
prg(void)176*40d01547SDavid du Colombier prg(void)
177*40d01547SDavid du Colombier {
178*40d01547SDavid du Colombier 	Prog *p;
179*40d01547SDavid du Colombier 
180*40d01547SDavid du Colombier 	while(nhunk < sizeof(Prog))
181*40d01547SDavid du Colombier 		gethunk();
182*40d01547SDavid du Colombier 	p = (Prog*)hunk;
183*40d01547SDavid du Colombier 	nhunk -= sizeof(Prog);
184*40d01547SDavid du Colombier 	hunk += sizeof(Prog);
185*40d01547SDavid du Colombier 
186*40d01547SDavid du Colombier 	*p = zprg;
187*40d01547SDavid du Colombier 	return p;
188*40d01547SDavid du Colombier }
189*40d01547SDavid du Colombier 
190*40d01547SDavid du Colombier void*
halloc(usize n)191*40d01547SDavid du Colombier halloc(usize n)
192*40d01547SDavid du Colombier {
193*40d01547SDavid du Colombier 	void *p;
194*40d01547SDavid du Colombier 
195*40d01547SDavid du Colombier 	n = (n+7)&~7;
196*40d01547SDavid du Colombier 	while(nhunk < n)
197*40d01547SDavid du Colombier 		gethunk();
198*40d01547SDavid du Colombier 	p = hunk;
199*40d01547SDavid du Colombier 	nhunk -= n;
200*40d01547SDavid du Colombier 	hunk += n;
201*40d01547SDavid du Colombier 	return p;
202*40d01547SDavid du Colombier }
203*40d01547SDavid du Colombier 
204*40d01547SDavid du Colombier void
gethunk(void)205*40d01547SDavid du Colombier gethunk(void)
206*40d01547SDavid du Colombier {
207*40d01547SDavid du Colombier 	char *h;
208*40d01547SDavid du Colombier 	long nh;
209*40d01547SDavid du Colombier 
210*40d01547SDavid du Colombier 	nh = NHUNK;
211*40d01547SDavid du Colombier 	if(tothunk >= 5L*NHUNK) {
212*40d01547SDavid du Colombier 		nh = 5L*NHUNK;
213*40d01547SDavid du Colombier 		if(tothunk >= 25L*NHUNK)
214*40d01547SDavid du Colombier 			nh = 25L*NHUNK;
215*40d01547SDavid du Colombier 	}
216*40d01547SDavid du Colombier 	h = mysbrk(nh);
217*40d01547SDavid du Colombier 	if(h == (void*)-1) {
218*40d01547SDavid du Colombier 		diag("out of memory");
219*40d01547SDavid du Colombier 		errorexit();
220*40d01547SDavid du Colombier 	}
221*40d01547SDavid du Colombier 
222*40d01547SDavid du Colombier 	hunk = h;
223*40d01547SDavid du Colombier 	nhunk = nh;
224*40d01547SDavid du Colombier 	tothunk += nh;
225*40d01547SDavid du Colombier }
226*40d01547SDavid du Colombier 
227*40d01547SDavid du Colombier long
hunkspace(void)228*40d01547SDavid du Colombier hunkspace(void)
229*40d01547SDavid du Colombier {
230*40d01547SDavid du Colombier 	return tothunk;
231*40d01547SDavid du Colombier }
232*40d01547SDavid du Colombier 
233*40d01547SDavid du Colombier void
strnput(char * s,int n)234*40d01547SDavid du Colombier strnput(char *s, int n)
235*40d01547SDavid du Colombier {
236*40d01547SDavid du Colombier 	for(; *s; s++){
237*40d01547SDavid du Colombier 		cput(*s);
238*40d01547SDavid du Colombier 		n--;
239*40d01547SDavid du Colombier 	}
240*40d01547SDavid du Colombier 	for(; n > 0; n--)
241*40d01547SDavid du Colombier 		cput(0);
242*40d01547SDavid du Colombier }
243*40d01547SDavid du Colombier 
244*40d01547SDavid du Colombier void
cput(int c)245*40d01547SDavid du Colombier cput(int c)
246*40d01547SDavid du Colombier {
247*40d01547SDavid du Colombier 	cbp[0] = c;
248*40d01547SDavid du Colombier 	cbp++;
249*40d01547SDavid du Colombier 	cbc--;
250*40d01547SDavid du Colombier 	if(cbc <= 0)
251*40d01547SDavid du Colombier 		cflush();
252*40d01547SDavid du Colombier }
253*40d01547SDavid du Colombier 
254*40d01547SDavid du Colombier void
cflush(void)255*40d01547SDavid du Colombier cflush(void)
256*40d01547SDavid du Colombier {
257*40d01547SDavid du Colombier 	int n;
258*40d01547SDavid du Colombier 
259*40d01547SDavid du Colombier 	n = sizeof(buf.cbuf) - cbc;
260*40d01547SDavid du Colombier 	if(n)
261*40d01547SDavid du Colombier 		write(cout, buf.cbuf, n);
262*40d01547SDavid du Colombier 	cbp = buf.cbuf;
263*40d01547SDavid du Colombier 	cbc = sizeof(buf.cbuf);
264*40d01547SDavid du Colombier }
265