OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [ia64/] [scripts/] [unwcheck.sh] - Blame information for rev 1275

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
#!/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
  '

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.