2 # -----------------------------------------------------------------------------
4 my $srcfile = $ARGV[0];
7 open (IN
, "<$srcfile") || die "Cannot open $srcfile for reading: $!\n";
10 if (/^Call ([A-Za-z0-9]+\.[0-9]+): .*\)/) {
12 if (/ ret=(........)$/ ||
13 / ret=(....:....) ds=....$/) {
15 push @callstack, [$func,$retaddr];
18 # Assume a line got cut by a line feed in a string.
26 if (/^Ret ([A-Za-z0-9]+\.[0-9]+): .* ret=(........)$/ ||
27 /^Ret ([A-Za-z0-9]+\.[0-9]+): .* ret=(....:....) ds=....$/) {
30 my ($topfunc,$topaddr);
34 if ($#callstack == -1) {
35 print "Error: Return from $func to $retaddr with empty stack.\n";
39 ($topfunc,$topaddr) = @
{pop @callstack};
41 if ($topfunc ne $func) {
42 print "Error: Return from $topfunc, but call from $func.\n";
48 if ($topaddr eq $retaddr) {
49 print "OK: $func from $retaddr.\n";
51 print "Error: Return from $func is to $retaddr, not $topaddr.\n";
56 while ($#callstack != -1) {
57 my ($topfunc,$topaddr) = @
{pop @callstack};
58 print "Error: leftover call to $topfunc from $topaddr.\n";