File modversions of Package kernel-kdump
1
#! /usr/bin/perl -w
2
3
use File::Basename;
4
use File::Path;
5
use File::Find;
6
use Getopt::Long;
7
use strict;
8
9
my %symbol_type_name = (
10
n => 'normal', t => 'typedef', e => 'enum', s => 'struct', u => 'union'
11
);
12
13
my %definitions;
14
my %override;
15
my %override_locally;
16
my %locally_unknown;
17
my %locally_defined;
18
19
sub expand_types($);
20
sub expand_types($) {
21
my ($definition) = @_;
22
local ($_, $1, $2);
23
24
my @defn = split ' ', $definition;
25
for (@defn[1..$#defn]) {
26
if (/^(.)#(.*)/) {
27
#print "<<$defn[0] : $_>>\n";
28
next if exists $locally_defined{$_};
29
$locally_defined{$_} = 1;
30
31
if ($locally_unknown{$_}) {
32
print "$_ $symbol_type_name{$1} $2 { UNKNOWN } \n";
33
} else {
34
if (!exists $definitions{$_}) {
35
die "Missing definition of $symbol_type_name{$1} $2\n";
36
}
37
expand_types("$_ $definitions{$_}");
38
}
39
}
40
}
41
print "override " if $override_locally{$defn[0]};
42
print "$definition\n";
43
}
44
45
sub pack_dump($$) {
46
my ($dir, $ext) = @_;
47
my @files;
48
49
$ext = ".symtypes" unless defined $ext;
50
51
find(sub ($) { /\Q$ext\E$/ && push @files, $File::Find::name}, $dir);
52
map { s/^\Q$dir\E\/(.*)\Q$ext\E$/$1/ } @files;
53
54
foreach my $file (sort @files) {
55
print "/* $file.o */\n";
56
57
local *FD;
58
open FD, "< $dir/$file$ext"
59
or die "$dir/$file$ext: $!\n";
60
while (<FD>) {
61
chomp;
62
63
my $override = "";
64
if (s/^override //) {
65
$override = $&;
66
}
67
68
if (/^(\S)#(\S+)\s*(.*)/) {
69
my $sym = "$1#$2";
70
my $definition = $3;
71
72
if (/^$sym\s+$symbol_type_name{$1}\s+$2\s+{\s+UNKNOWN\s+}\s*$/) {
73
$_ = $override . substr($sym, 0, 1) . "##" . substr($sym, 2);
74
} else {
75
if (exists $definitions{$sym} && $definitions{$sym} eq $definition) {
76
if (($override ne "") == (exists $override{$sym})) {
77
next;
78
}
79
$_ = "$override$sym";
80
} else {
81
$definitions{$sym} = $definition;
82
if ($override eq "") {
83
delete $override{$sym};
84
} else {
85
$override{$sym} = 1;
86
}
87
}
88
}
89
}
90
print "$_\n";
91
}
92
close FD;
93
print "\n";
94
}
95
}
96
97
sub unpack_dump($$) {
98
my ($dir, $ext) = @_;
99
100
$ext = ".symref" unless defined $ext;
101
102
while (<STDIN>) {
103
next if /^$/;
104
chomp;
105
106
if (/^\/\* (.*)\.o \*\//) {
107
close STDOUT;
108
mkpath(dirname("$dir/$1$ext"));
109
open STDOUT, "> $dir/$1$ext"
110
or die "$dir/$1$ext: $!\n";
111
%locally_defined = ();
112
%locally_unknown = ();
113
%override_locally = %override;
114
next;
115
}
116
117
my $override = /^override\s/;
118
119
if (/^([^ ])#(#?)([^ ]+) *(.*)$/) {
120
my $sym = "$1#$3";
121
122
if ($4 ne "") {
123
if (/\s+{\s+UNKNOWN\s+}\s*$/) {
124
$locally_unknown{$sym} = 1;
125
$override_locally{$sym} = $override;
126
} else {
127
$definitions{$sym} = $4;
128
$locally_unknown{$sym} = 0;
129
$override{$sym} = $override;
130
$override_locally{$sym} = $override;
131
}
132
} else {
133
$locally_unknown{$sym} = ($2 ne "");
134
$override_locally{$sym} = $override;
135
}
136
next;
137
}
138
expand_types($_);
139
}
140
}
141
142
my ($pack, $unpack, $ext);
143
GetOptions("pack" => \$pack, "unpack" => \$unpack, "ext:s" => \$ext)
144
&& ($pack || $unpack) && @ARGV == 1
145
or die "USAGE:\t$0 [--ext extension] --pack {dir} > file\n" .
146
"\t$0 [--ext extension] --unpack {dir} < file\n";
147
148
pack_dump($ARGV[0], $ext) if $pack;
149
unpack_dump($ARGV[0], $ext) if $unpack;
150