plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

coverage (1730B)


      1 // Coverage library
      2 
      3 defn coverage()
      4 {
      5 	local lmap, lp, e, pc, n, l;
      6 
      7 	new();
      8 
      9 	bblock = {};
     10 
     11 	// find the first location in the text
     12 	e = (map()[0][1])\i;
     13 
     14 	while e < etext-4 do {
     15 		l = follow(e);
     16 		if tail l != {} then {
     17 			if match(l[0], bblock) < 0 then
     18 				bblock = append bblock, l[0];
     19 			if match(l[1], bblock) < 0 then
     20 				bblock = append bblock, l[1];
     21 		}
     22 		e++;
     23 	}
     24 
     25 	l = bblock;
     26 	while l != {} do {
     27 		*fmt(head l, bpfmt) = bpinst;
     28 		l = tail l;
     29 	}
     30 
     31 	while 1 do {
     32 		cont();
     33 		pc = *PC;
     34 		n = match(pc, bblock);
     35 		if n >= 0 then {
     36 			pc = fmt(pc, bpfmt);
     37 			*pc = @pc;
     38 			bblock = delete bblock, n;
     39 		}
     40 		else {
     41 			pstop(pid);
     42 			return {};
     43 		}
     44 	}
     45 }
     46 
     47 defn eblock(addr)
     48 {
     49 	addr = addr\i;
     50 
     51 	while addr < etext do {
     52 		if (tail follow(addr)) != {} then
     53 			return pcline(addr);
     54 		addr++;
     55 	}
     56 	return 0;
     57 }
     58 
     59 defn basic(stsrc, ensrc, file)
     60 {
     61 	local src, text;
     62 
     63 	if stsrc >= ensrc then
     64 		return {};
     65 
     66 	print(file, ":", stsrc, ",", ensrc, "\n");
     67 	src = match(file, srcfiles);
     68 
     69 	if src >= 0 then
     70 		src = srctext[src];
     71 	else
     72 		src = findsrc(file);
     73 
     74 	if src == {} then
     75 		print("no source for ", file, "\n");
     76 	else {
     77 		while stsrc <= ensrc do {
     78 			text = src[stsrc];
     79 			if text != {} then
     80 				print("\t", stsrc, ":", text, "\n");
     81 			stsrc = stsrc+1;
     82 		}
     83 	}
     84 }
     85 
     86 defn analyse(fnaddr)
     87 {
     88 	local addr, l, tfn;
     89 
     90 	new();
     91 
     92 	tfn = fnbound(fnaddr);
     93 
     94 	l = bblock;
     95 	while l do {
     96 		addr = head l;
     97 
     98 		if addr >= tfn[0] && addr < tfn[1] then
     99 			basic(pcline(addr), eblock(addr), pcfile(addr));
    100 		
    101 		l = tail l;
    102 	}
    103 	kill(pid);
    104 }
    105 
    106 defn report()
    107 {
    108 	local addr, l;
    109 
    110 	new();
    111 
    112 	l = bblock;
    113 	while l do {
    114 		addr = head l;
    115 
    116 		basic(pcline(addr), eblock(addr), pcfile(addr));
    117 		
    118 		l = tail l;
    119 	}
    120 	kill(pid);
    121 }
    122 
    123 defn stopped(pid)
    124 {
    125 	return {};
    126 }
    127 
    128 print(acidfile);