]>
Commit | Line | Data |
---|---|---|
fe10ab54 AB |
1 | #!/usr/bin/perl |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | use Getopt::Long; | |
6 | use FindBin; | |
7 | ||
8 | my @legacy = qw(qemu_clock_ptr qemu_get_clock_ns qemu_get_clock_ms qemu_register_clock_reset_notifier qemu_unregister_clock_reset_notifier qemu_new_timer qemu_free_timer qemu_del_timer qemu_mod_timer_ns qemu_mod_timer qemu_run_timers qemu_new_timer_ns qemu_new_timer_us qemu_new_timer_ms); | |
9 | my $legacyre = '\b('.join('|', @legacy).')\b'; | |
10 | my $option_git; | |
11 | my $option_dryrun; | |
12 | my $option_quiet; | |
13 | my $option_rtc; | |
14 | my $suffix=".tmp.$$"; | |
15 | my @files; | |
16 | my $getfiles = 'git grep -l -E \'\b((host|rt|vm|rtc)_clock\b|qemu_\w*timer)\' | egrep \'\.[ch]$\' | egrep -v \'qemu-timer\.c$|include/qemu/timer\.h$\''; | |
17 | ||
18 | sub Syntax | |
19 | { | |
20 | print STDERR <<STOP; | |
21 | Usage: $FindBin::Script [options] FILE ... | |
22 | ||
a63e5e0c | 23 | Translate each FILE to the new QEMU timer API. If no files |
fe10ab54 AB |
24 | are passed, a reasonable guess is taken. |
25 | ||
26 | Options: | |
27 | -q, --quiet Do not show warnings etc | |
28 | -d, --dry-run Do a dry run | |
29 | -g, --git Generate a git commit for each change | |
30 | -r, --rtc Only fix up rtc usage | |
31 | -h, --help Print this message | |
32 | ||
33 | STOP | |
34 | return; | |
35 | } | |
36 | ||
37 | sub ParseOptions | |
38 | { | |
39 | if (!GetOptions ( | |
40 | "dry-run|d" => \$option_dryrun, | |
41 | "git|g" => \$option_git, | |
42 | "quiet|q" => \$option_quiet, | |
43 | "rtc|r" => \$option_rtc, | |
44 | "help|h" => sub { Syntax(); exit(0); } | |
45 | )) | |
46 | { | |
47 | Syntax(); | |
48 | die "Bad options"; | |
49 | } | |
50 | ||
51 | if ($#ARGV >=0) | |
52 | { | |
53 | @files = @ARGV; | |
54 | } | |
55 | else | |
56 | { | |
57 | @files = split(/\s+/, `$getfiles`); | |
58 | } | |
59 | ||
60 | foreach my $file (@files) | |
61 | { | |
62 | die "Cannot find $file" unless (-f $file && -r $file); | |
63 | } | |
64 | } | |
65 | ||
66 | sub DoWarn | |
67 | { | |
68 | my $text = shift @_; | |
69 | my $line = shift @_; | |
70 | return if ($option_quiet); | |
71 | chomp ($line); | |
72 | print STDERR "$text\n"; | |
73 | print STDERR "$line\n\n"; | |
74 | } | |
75 | ||
76 | sub Process | |
77 | { | |
78 | my $ifn = shift @_; | |
79 | my $ofn = $ifn.$suffix; | |
80 | ||
81 | my $intext; | |
82 | my $outtext; | |
83 | my $linenum = 0; | |
84 | ||
85 | open my $input, "<", $ifn || die "Cannot open $ifn for read: $!"; | |
86 | ||
87 | while (<$input>) | |
88 | { | |
89 | my $line = $_; | |
90 | $intext .= $line; | |
91 | $linenum++; | |
92 | ||
93 | # fix the specific uses | |
94 | unless ($option_rtc) | |
95 | { | |
96 | $line =~ s/\bqemu_new_timer(_[num]s)\s*\((vm_|rt_|host_)clock\b/timer_new$1(XXX_$2clock/g; | |
97 | $line =~ s/\bqemu_new_timer\s*\((vm_|rt_|host_)clock\b/timer_new(XXX_$1clock/g; | |
98 | $line =~ s/\bqemu_get_clock(_[num]s)\s*\((vm_|rt_|host_)clock\b/qemu_clock_get$1(XXX_$2clock/g; | |
99 | } | |
100 | ||
101 | # rtc is different | |
102 | $line =~ s/\bqemu_new_timer(_[num]s)\s*\(rtc_clock\b/timer_new$1(rtc_clock/g; | |
103 | $line =~ s/\bqemu_new_timer\s*\(rtc_clock\b/timer_new(rtc_clock/g; | |
104 | $line =~ s/\bqemu_get_clock(_[num]s)\s*\(rtc_clock\b/qemu_clock_get$1(rtc_clock/g; | |
105 | $line =~ s/\bqemu_register_clock_reset_notifier\s*\(rtc_clock\b/qemu_register_clock_reset_notifier(qemu_clock_ptr(rtc_clock)/g; | |
106 | ||
107 | unless ($option_rtc) | |
108 | { | |
109 | # fix up comments | |
110 | $line =~ s/\b(vm_|rt_|host_)clock\b/XXX_$1clock/g if ($line =~ m,^[/ ]+\*,); | |
111 | ||
112 | # spurious fprintf error reporting | |
113 | $line =~ s/: qemu_new_timer_ns failed/: timer_new_ns failed/g; | |
114 | ||
115 | # these have just changed name | |
116 | $line =~ s/\bqemu_mod_timer\b/timer_mod/g; | |
117 | $line =~ s/\bqemu_mod_timer_(ns|us|ms)\b/timer_mod_$1/g; | |
118 | $line =~ s/\bqemu_free_timer\b/timer_free/g; | |
119 | $line =~ s/\bqemu_del_timer\b/timer_del/g; | |
120 | } | |
121 | ||
122 | # fix up rtc_clock | |
123 | $line =~ s/QEMUClock \*rtc_clock;/QEMUClockType rtc_clock;/g; | |
124 | $line =~ s/\brtc_clock = (vm_|rt_|host_)clock\b/rtc_clock = XXX_$1clock/g; | |
125 | ||
126 | unless ($option_rtc) | |
127 | { | |
128 | # replace any more general uses | |
129 | $line =~ s/\b(vm_|rt_|host_)clock\b/qemu_clock_ptr(XXX_$1clock)/g; | |
130 | } | |
131 | ||
132 | # fix up the place holders | |
133 | $line =~ s/\bXXX_vm_clock\b/QEMU_CLOCK_VIRTUAL/g; | |
134 | $line =~ s/\bXXX_rt_clock\b/QEMU_CLOCK_REALTIME/g; | |
135 | $line =~ s/\bXXX_host_clock\b/QEMU_CLOCK_HOST/g; | |
136 | ||
137 | unless ($option_rtc) | |
138 | { | |
139 | DoWarn("$ifn:$linenum WARNING: timer $1 not fixed up", $line) if ($line =~ /\b((vm_|rt_|host_)clock)\b/); | |
140 | DoWarn("$ifn:$linenum WARNING: function $1 not fixed up", $line) if ($line =~ /\b(qemu_new_timer\w+)\b/); | |
141 | DoWarn("$ifn:$linenum WARNING: legacy function $1 remains", $line) if ($line =~ /$legacyre/o); | |
142 | } | |
143 | ||
144 | $outtext .= $line; | |
145 | } | |
146 | ||
147 | close $input; | |
148 | ||
149 | if ($intext ne $outtext) | |
150 | { | |
151 | print STDERR "Patching $ifn\n" unless ($option_quiet); | |
152 | unless ($option_dryrun) | |
153 | { | |
154 | open my $output, ">", $ofn || die "Cannot open $ofn for write: $!"; | |
155 | print $output $outtext; | |
156 | close $output; | |
157 | rename ($ofn, $ifn) || die "Cannot rename temp file to $ifn: $!"; | |
158 | return 1; | |
159 | } | |
160 | } | |
161 | return 0; | |
162 | } | |
163 | ||
164 | sub DoCommit | |
165 | { | |
166 | my $file = shift @_; | |
167 | open (my $git, "| git commit -F - $file") || die "Cannot run git commit on $file: $!"; | |
168 | print $git "timers api: use new timer api in $file\n\nConvert $file to use new timer API.\nThis is an automated commit made by scripts/switch-timer-api\n"; | |
169 | close ($git); | |
170 | } | |
171 | ||
172 | ParseOptions; | |
173 | ||
174 | foreach my $file (@files) | |
175 | { | |
176 | my $changed = Process ($file); | |
177 | DoCommit($file) if ($changed && $option_git); | |
178 | } |