// 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");
|