129 lines
1.7 KiB
Text
129 lines
1.7 KiB
Text
|
// Coverage library
|
||
|
|
||
|
defn coverage()
|
||
|
{
|
||
|
local lmap, lp, e, pc, n, l;
|
||
|
|
||
|
new();
|
||
|
|
||
|
bblock = {};
|
||
|
|
||
|
// find the first location in the text
|
||
|
e = (map()[0][1])\i;
|
||
|
|
||
|
while e < etext-4 do {
|
||
|
l = follow(e);
|
||
|
if tail l != {} then {
|
||
|
if match(l[0], bblock) < 0 then
|
||
|
bblock = append bblock, l[0];
|
||
|
if match(l[1], bblock) < 0 then
|
||
|
bblock = append bblock, l[1];
|
||
|
}
|
||
|
e++;
|
||
|
}
|
||
|
|
||
|
l = bblock;
|
||
|
while l != {} do {
|
||
|
*fmt(head l, bpfmt) = bpinst;
|
||
|
l = tail l;
|
||
|
}
|
||
|
|
||
|
while 1 do {
|
||
|
cont();
|
||
|
pc = *PC;
|
||
|
n = match(pc, bblock);
|
||
|
if n >= 0 then {
|
||
|
pc = fmt(pc, bpfmt);
|
||
|
*pc = @pc;
|
||
|
bblock = delete bblock, n;
|
||
|
}
|
||
|
else {
|
||
|
pstop(pid);
|
||
|
return {};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
defn eblock(addr)
|
||
|
{
|
||
|
addr = addr\i;
|
||
|
|
||
|
while addr < etext do {
|
||
|
if (tail follow(addr)) != {} then
|
||
|
return pcline(addr);
|
||
|
addr++;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
defn basic(stsrc, ensrc, file)
|
||
|
{
|
||
|
local src, text;
|
||
|
|
||
|
if stsrc >= ensrc then
|
||
|
return {};
|
||
|
|
||
|
print(file, ":", stsrc, ",", ensrc, "\n");
|
||
|
src = match(file, srcfiles);
|
||
|
|
||
|
if src >= 0 then
|
||
|
src = srctext[src];
|
||
|
else
|
||
|
src = findsrc(file);
|
||
|
|
||
|
if src == {} then
|
||
|
print("no source for ", file, "\n");
|
||
|
else {
|
||
|
while stsrc <= ensrc do {
|
||
|
text = src[stsrc];
|
||
|
if text != {} then
|
||
|
print("\t", stsrc, ":", text, "\n");
|
||
|
stsrc = stsrc+1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
defn analyse(fnaddr)
|
||
|
{
|
||
|
local addr, l, tfn;
|
||
|
|
||
|
new();
|
||
|
|
||
|
tfn = fnbound(fnaddr);
|
||
|
|
||
|
l = bblock;
|
||
|
while l do {
|
||
|
addr = head l;
|
||
|
|
||
|
if addr >= tfn[0] && addr < tfn[1] then
|
||
|
basic(pcline(addr), eblock(addr), pcfile(addr));
|
||
|
|
||
|
l = tail l;
|
||
|
}
|
||
|
kill(pid);
|
||
|
}
|
||
|
|
||
|
defn report()
|
||
|
{
|
||
|
local addr, l;
|
||
|
|
||
|
new();
|
||
|
|
||
|
l = bblock;
|
||
|
while l do {
|
||
|
addr = head l;
|
||
|
|
||
|
basic(pcline(addr), eblock(addr), pcfile(addr));
|
||
|
|
||
|
l = tail l;
|
||
|
}
|
||
|
kill(pid);
|
||
|
}
|
||
|
|
||
|
defn stopped(pid)
|
||
|
{
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
print("/sys/lib/acid/coverage");
|