more changes on original files
[linux-2.4.git] / arch / ia64 / scripts / unwcheck.sh
1 #!/bin/sh
2 #   Usage: unwcheck.sh <executable_file_name>
3 #   Pre-requisite: readelf [from Gnu binutils package]
4 #   Purpose: Check the following invariant
5 #       For each code range in the input binary:
6 #          Sum[ lengths of unwind regions] = Number of slots in code range.
7 #   Author : Harish Patil
8 #   First version: January 2002
9 #   Modified : 2/13/2002
10 #   Modified : 3/15/2002: duplicate detection
11 readelf -u $1 | gawk '\
12  function todec(hexstr){
13     dec = 0;
14     l = length(hexstr);
15     for (i = 1; i <= l; i++)
16     {
17         c = substr(hexstr, i, 1);
18         if (c == "A")
19             dec = dec*16 + 10;
20         else if (c == "B")
21             dec = dec*16 + 11;
22         else if (c == "C")
23             dec = dec*16 + 12;
24         else if (c == "D")
25             dec = dec*16 + 13;
26         else if (c == "E")
27             dec = dec*16 + 14;
28         else if (c == "F")
29             dec = dec*16 + 15;
30         else
31             dec = dec*16 + c;
32     }
33     return dec;
34  }
35  BEGIN { first = 1; sum_rlen = 0; no_slots = 0; errors=0; no_code_ranges=0; }
36  {
37    if (NF==5 && $3=="info")
38    {
39       no_code_ranges += 1;
40       if (first == 0)
41       {
42          if (sum_rlen != no_slots)
43          {
44             print full_code_range;
45             print "       ", "lo = ", lo, " hi =", hi;
46             print "       ", "sum_rlen = ", sum_rlen, "no_slots = " no_slots;
47             print "       ","   ", "*******ERROR ***********";
48             print "       ","   ", "sum_rlen:", sum_rlen, " != no_slots:" no_slots;
49             errors += 1;
50          }
51          sum_rlen = 0;
52       }
53       full_code_range =  $0;
54       code_range =  $2;
55       gsub("..$", "", code_range);
56       gsub("^.", "", code_range);
57       split(code_range, addr, "-");
58       lo = toupper(addr[1]);
59
60       code_range_lo[no_code_ranges] = addr[1];
61       occurs[addr[1]] += 1;
62       full_range[addr[1]] = $0;
63
64       gsub("0X.[0]*", "", lo);
65       hi = toupper(addr[2]);
66       gsub("0X.[0]*", "", hi);
67       no_slots = (todec(hi) - todec(lo))/ 16*3
68       first = 0;
69    }
70    if (index($0,"rlen") > 0 )
71    {
72     rlen_str =  substr($0, index($0,"rlen"));
73     rlen = rlen_str;
74     gsub("rlen=", "", rlen);
75     gsub(")", "", rlen);
76     sum_rlen = sum_rlen +  rlen;
77    }
78   }
79   END {
80       if (first == 0)
81       {
82          if (sum_rlen != no_slots)
83          {
84             print "code_range=", code_range;
85             print "       ", "lo = ", lo, " hi =", hi;
86             print "       ", "sum_rlen = ", sum_rlen, "no_slots = " no_slots;
87             print "       ","   ", "*******ERROR ***********";
88             print "       ","   ", "sum_rlen:", sum_rlen, " != no_slots:" no_slots;
89             errors += 1;
90          }
91       }
92     no_duplicates = 0;
93     for (i=1; i<=no_code_ranges; i++)
94     {
95         cr = code_range_lo[i];
96         if (reported_cr[cr]==1) continue;
97         if ( occurs[cr] > 1)
98         {
99             reported_cr[cr] = 1;
100             print "Code range low ", code_range_lo[i], ":", full_range[cr], " occurs: ", occurs[cr], " times.";
101             print " ";
102             no_duplicates++;
103         }
104     }
105     print "======================================"
106     print "Total errors:", errors, "/", no_code_ranges, " duplicates:", no_duplicates;
107     print "======================================"
108   }
109   '