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