URI:
       tcoverage - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tcoverage (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);