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