xref: /plan9/sys/lib/acid/coverage (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier// Coverage library
2*219b2ee8SDavid du Colombier
3*219b2ee8SDavid du Colombierdefn coverage()
4*219b2ee8SDavid du Colombier{
5*219b2ee8SDavid du Colombier	local lmap, lp, e, pc, n;
6*219b2ee8SDavid du Colombier
7*219b2ee8SDavid du Colombier	new();
8*219b2ee8SDavid du Colombier
9*219b2ee8SDavid du Colombier	bblock = {};
10*219b2ee8SDavid du Colombier
11*219b2ee8SDavid du Colombier	// find the first location in the text
12*219b2ee8SDavid du Colombier	e = (map()[0][1])\i;
13*219b2ee8SDavid du Colombier
14*219b2ee8SDavid du Colombier	while e < etext-4 do {
15*219b2ee8SDavid du Colombier		l = follow(e);
16*219b2ee8SDavid du Colombier		if tail l != {} then {
17*219b2ee8SDavid du Colombier			plant(l[0]);
18*219b2ee8SDavid du Colombier			plant(l[1]);
19*219b2ee8SDavid du Colombier		}
20*219b2ee8SDavid du Colombier		e++;
21*219b2ee8SDavid du Colombier	}
22*219b2ee8SDavid du Colombier
23*219b2ee8SDavid du Colombier	while 1 do {
24*219b2ee8SDavid du Colombier		cont();
25*219b2ee8SDavid du Colombier		pc = *PC;
26*219b2ee8SDavid du Colombier		n = match(pc, bblock);
27*219b2ee8SDavid du Colombier		if n >= 0 then {
28*219b2ee8SDavid du Colombier			pc = fmt(pc, bpfmt);
29*219b2ee8SDavid du Colombier			*pc = @pc;
30*219b2ee8SDavid du Colombier			bblock = delete bblock, n;
31*219b2ee8SDavid du Colombier		}
32*219b2ee8SDavid du Colombier		else {
33*219b2ee8SDavid du Colombier			pstop(pid);
34*219b2ee8SDavid du Colombier			return {};
35*219b2ee8SDavid du Colombier		}
36*219b2ee8SDavid du Colombier	}
37*219b2ee8SDavid du Colombier}
38*219b2ee8SDavid du Colombier
39*219b2ee8SDavid du Colombierdefn plant(addr)
40*219b2ee8SDavid du Colombier{
41*219b2ee8SDavid du Colombier	if match(addr, bblock) < 0 then {
42*219b2ee8SDavid du Colombier		*fmt(addr, bpfmt) = bpinst;
43*219b2ee8SDavid du Colombier		bblock = append bblock, addr;
44*219b2ee8SDavid du Colombier	}
45*219b2ee8SDavid du Colombier}
46*219b2ee8SDavid du Colombier
47*219b2ee8SDavid du Colombierdefn eblock(addr)
48*219b2ee8SDavid du Colombier{
49*219b2ee8SDavid du Colombier	addr = addr\i;
50*219b2ee8SDavid du Colombier
51*219b2ee8SDavid du Colombier	while addr < etext do {
52*219b2ee8SDavid du Colombier		if (tail follow(addr)) != {} then
53*219b2ee8SDavid du Colombier			return pcline(addr);
54*219b2ee8SDavid du Colombier		addr++;
55*219b2ee8SDavid du Colombier	}
56*219b2ee8SDavid du Colombier	return 0;
57*219b2ee8SDavid du Colombier}
58*219b2ee8SDavid du Colombier
59*219b2ee8SDavid du Colombierdefn basic(stsrc, ensrc, file)
60*219b2ee8SDavid du Colombier{
61*219b2ee8SDavid du Colombier	local src, text;
62*219b2ee8SDavid du Colombier
63*219b2ee8SDavid du Colombier	if stsrc >= ensrc then
64*219b2ee8SDavid du Colombier		return {};
65*219b2ee8SDavid du Colombier
66*219b2ee8SDavid du Colombier	print(file, ":", stsrc, ",", ensrc, "\n");
67*219b2ee8SDavid du Colombier	src = match(file, srcfiles);
68*219b2ee8SDavid du Colombier
69*219b2ee8SDavid du Colombier	if src >= 0 then
70*219b2ee8SDavid du Colombier		src = srctext[src];
71*219b2ee8SDavid du Colombier	else
72*219b2ee8SDavid du Colombier		src = findsrc(file);
73*219b2ee8SDavid du Colombier
74*219b2ee8SDavid du Colombier	if src == {} then
75*219b2ee8SDavid du Colombier		print("no source for ", file, "\n");
76*219b2ee8SDavid du Colombier	else {
77*219b2ee8SDavid du Colombier		while stsrc <= ensrc do {
78*219b2ee8SDavid du Colombier			text = src[stsrc];
79*219b2ee8SDavid du Colombier			if text != {} then
80*219b2ee8SDavid du Colombier				print("\t", stsrc, ":", text, "\n");
81*219b2ee8SDavid du Colombier			stsrc = stsrc+1;
82*219b2ee8SDavid du Colombier		}
83*219b2ee8SDavid du Colombier	}
84*219b2ee8SDavid du Colombier}
85*219b2ee8SDavid du Colombier
86*219b2ee8SDavid du Colombierdefn analyse(fnaddr)
87*219b2ee8SDavid du Colombier{
88*219b2ee8SDavid du Colombier	local addr, l, tfn;
89*219b2ee8SDavid du Colombier
90*219b2ee8SDavid du Colombier	new();
91*219b2ee8SDavid du Colombier
92*219b2ee8SDavid du Colombier	tfn = fnbound(fnaddr);
93*219b2ee8SDavid du Colombier
94*219b2ee8SDavid du Colombier	l = bblock;
95*219b2ee8SDavid du Colombier	while l do {
96*219b2ee8SDavid du Colombier		addr = head l;
97*219b2ee8SDavid du Colombier
98*219b2ee8SDavid du Colombier		if addr >= tfn[0] && addr < tfn[1] then
99*219b2ee8SDavid du Colombier			basic(pcline(addr), eblock(addr), pcfile(addr));
100*219b2ee8SDavid du Colombier
101*219b2ee8SDavid du Colombier		l = tail l;
102*219b2ee8SDavid du Colombier	}
103*219b2ee8SDavid du Colombier	kill(pid);
104*219b2ee8SDavid du Colombier}
105*219b2ee8SDavid du Colombier
106*219b2ee8SDavid du Colombierdefn report()
107*219b2ee8SDavid du Colombier{
108*219b2ee8SDavid du Colombier	local addr, l;
109*219b2ee8SDavid du Colombier
110*219b2ee8SDavid du Colombier	new();
111*219b2ee8SDavid du Colombier
112*219b2ee8SDavid du Colombier	l = bblock;
113*219b2ee8SDavid du Colombier	while l do {
114*219b2ee8SDavid du Colombier		addr = head l;
115*219b2ee8SDavid du Colombier
116*219b2ee8SDavid du Colombier		basic(pcline(addr), eblock(addr), pcfile(addr));
117*219b2ee8SDavid du Colombier
118*219b2ee8SDavid du Colombier		l = tail l;
119*219b2ee8SDavid du Colombier	}
120*219b2ee8SDavid du Colombier	kill(pid);
121*219b2ee8SDavid du Colombier}
122*219b2ee8SDavid du Colombier
123*219b2ee8SDavid du Colombierdefn stopped(pid)
124*219b2ee8SDavid du Colombier{
125*219b2ee8SDavid du Colombier	return {};
126*219b2ee8SDavid du Colombier}
127*219b2ee8SDavid du Colombier
128*219b2ee8SDavid du Colombierprint("/sys/lib/acid/coverage");
129