From 0a61c07d591273b76da21fb8386b669989da3707 Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 19 Apr 2004 18:18:37 +0000 Subject: acid files --- acid/coverage | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 acid/coverage (limited to 'acid/coverage') diff --git a/acid/coverage b/acid/coverage new file mode 100644 index 00000000..3436bd1c --- /dev/null +++ b/acid/coverage @@ -0,0 +1,128 @@ +// 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(acidfile); -- cgit v1.2.3