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 = @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");
|