Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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