123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // 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 =
- 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")
|