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