blob: d73596fe1134e9f5138d2635904950449ae5b039 [file] [log] [blame]
#!/usr/bin/env perl
use warnings;
use strict;
#---------------------------------------------------------------------
# A list of files specific to the tool at hand. Line numbers in
# these files will be removed from backtrace entries matching these files.
#---------------------------------------------------------------------
my @tool_files = ( "vg_replace_strmem.c", "vg_replace_malloc.c" );
sub massage_backtrace_line ($$$) {
my ($line, $tool_files, $cmdlin_files) = @_;
my ($string, $qstring);
# If LINE matches any of the file names passed on the command line
# (i.e. in CMDLIN_FILES) return LINE unmodified.
foreach $string (@$cmdlin_files) {
$qstring = quotemeta($string);
return $line if ($line =~ /$qstring/);
}
# If LINE matches any of the file names in TOOL_FILES remove the line
# number and return the so modified line.
foreach $string (@$tool_files) {
$qstring = quotemeta($string);
return $line if ($line =~ s/$qstring:[0-9]+/$string:.../m);
# Special case for functions whose line numbers have been removed in
# filter_stderr_basic. FIXME: filter_stderr_basic should not do that.
return $line if ($line =~ s/$qstring:\.\.\./$string:.../m);
}
# Did not match anything
$line =~ s/[\w]+.*/.../m;
return "$line";
}
#---------------------------------------------------------------------
# Process lines. Two categories
# (a) lines from back traces
# pass through those lines that contain file names we're interested in
# (b) everything else
# pass through as is
#---------------------------------------------------------------------
my $prev_line = "";
while (<STDIN>) {
my $line = $_;
chomp($line);
if ($line =~ /^\s+(at |by )/) { # lines in a back trace
$line = massage_backtrace_line($line, \@tool_files, \@ARGV);
if ($line =~ /\s+\.\.\./) {
print "$line\n" if ($prev_line !~ /\s+\.\.\./);
} else {
print "$line\n";
}
} else {
print "$line\n"; # everything else
}
$prev_line = $line
}
exit 0;