*new* add smatch_data/kernel.silenced_functions to silence common noise
[smatch.git] / smatch_data / db / fill_db_type_value.pl
blob3acc38e25dbea9d63e6d51fcbbb5f031b471c7ac
1 #!/usr/bin/perl -w
3 use strict;
4 use warnings;
5 use bigint;
6 use DBI;
7 use Data::Dumper;
9 my $db = DBI->connect("dbi:SQLite:smatch_db.sqlite", "", "", {AutoCommit => 0});
11 my $raw_line;
13 sub text_to_int($)
15 my $text = shift;
17 if ($text =~ /s64min/) {
18 return -(2**63);
19 } elsif ($text =~/s32min/) {
20 return -(2**31);
21 } elsif ($text =~ /s16min/) {
22 return -(2**15);
23 } elsif ($text =~ /s64max/) {
24 return 2**63 - 1;
25 } elsif ($text =~ /s32max/) {
26 return 2**31 - 1;
27 } elsif ($text =~ /s16max/) {
28 return 2**15 - 1;
29 } elsif ($text =~ /u64max/) {
30 return 2**62 - 1;
31 } elsif ($text =~ /u32max/) {
32 return 2**32 - 1;
33 } elsif ($text =~ /u16max/) {
34 return 2**16 - 1;
36 if ($text =~ /\((.*?)\)/) {
37 $text = $1;
39 if (!($text =~ /^[-0123456789]/)) {
40 return "NaN";
43 return int($text);
46 sub add_range($$$)
48 my $union = shift;
49 my $min = shift;
50 my $max = shift;
51 my %range;
52 my @return_union;
53 my $added = 0;
54 my $check_next = 0;
56 $range{min} = $min;
57 $range{max} = $max;
59 foreach my $tmp (@$union) {
60 if ($added) {
61 push @return_union, $tmp;
62 next;
65 if ($range{max} < $tmp->{min}) {
66 push @return_union, \%range;
67 push @return_union, $tmp;
68 $added = 1;
69 } elsif ($range{min} <= $tmp->{min}) {
70 if ($range{max} <= $tmp->{max}) {
71 $range{max} = $tmp->{max};
72 push @return_union, \%range;
73 $added = 1;
75 } elsif ($range{min} <= $tmp->{max}) {
76 if ($range{max} <= $tmp->{max}) {
77 push @return_union, $tmp;
78 $added = 1;
79 } else {
80 $range{min} = $tmp->{min};
82 } else {
83 push @return_union, $tmp;
87 if (!$added) {
88 push @return_union, \%range;
91 return \@return_union;
94 sub print_num($)
96 my $num = shift;
98 if ($num < 0) {
99 return "(" . $num . ")";
100 } else {
101 return $num;
105 sub print_range($)
107 my $range = shift;
109 if ($range->{min} == $range->{max}) {
110 return print_num($range->{min});
111 } else {
112 return print_num($range->{min}) . "-" . print_num($range->{max});
116 sub print_info($$)
118 my $type = shift;
119 my $union = shift;
120 my $printed_range = "";
121 my $i = 0;
123 foreach my $range (@$union) {
124 if ($i) {
125 $printed_range = $printed_range . ",";
127 $i++;
128 $printed_range = $printed_range . print_range($range);
130 my $sql = "insert into type_value values ('$type', '$printed_range');";
131 $db->do($sql);
135 $db->do("PRAGMA synchronous = OFF");
136 $db->do("PRAGMA cache_size = 800000");
137 $db->do("PRAGMA journal_mode = OFF");
138 $db->do("PRAGMA count_changes = OFF");
139 $db->do("PRAGMA temp_store = MEMORY");
140 $db->do("PRAGMA locking = EXCLUSIVE");
142 my ($sth, @row, $cur_type, $type, @ranges, $range_txt, %range, $min, $max, $union_array, $skip);
144 $sth = $db->prepare('select * from function_type_value order by type');
145 $sth->execute();
147 $skip = 0;
148 $cur_type = "";
149 while (@row = $sth->fetchrow_array()) {
150 $raw_line = join ',', @row;
152 $type = $row[2];
154 if ($cur_type ne "$type") {
155 if ($cur_type ne "" && $skip == 0) {
156 print_info($cur_type, $union_array);
158 $cur_type = $type;
159 $union_array = ();
160 $skip = 0;
163 @ranges = split(/,/, $row[3]);
164 foreach $range_txt (@ranges) {
165 if ($range_txt =~ /(.*[^(])-(.*)/) {
166 $min = text_to_int($1);
167 $max = text_to_int($2);
168 } else {
169 $min = text_to_int($range_txt);
170 $max = $min;
172 if ($min =~ /NaN/ || $max =~ /NaN/) {
173 $skip = 1;
175 $union_array = add_range($union_array, $min, $max);
178 if ($skip == 0) {
179 print_info($cur_type, $union_array);
182 $db->commit();
183 $db->disconnect();