1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#!/usr/bin/env perl
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovuse warnings;
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovuse strict;
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#---------------------------------------------------------------------
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# A list of files specific to the tool at hand. Line numbers in
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# these files will be removed from backtrace entries matching these files.
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#---------------------------------------------------------------------
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy @tool_files = ( "vg_replace_strmem.c", "vg_replace_malloc.c" );
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovsub massage_backtrace_line ($$$) {
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    my ($line, $tool_files, $cmdlin_files) = @_;
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    my ($string, $qstring);
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# If LINE matches any of the file names passed on the command line
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# (i.e. in CMDLIN_FILES) return LINE unmodified.
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    foreach $string (@$cmdlin_files) {
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        $qstring = quotemeta($string);
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return $line if ($line =~ /$qstring/);
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# If LINE matches any of the file names in TOOL_FILES remove the line
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# number and return the so modified line.
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    foreach $string (@$tool_files) {
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        $qstring = quotemeta($string);
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return $line if ($line =~ s/$qstring:[0-9]+/$string:.../m);
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# Special case for functions whose line numbers have been removed in 
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# filter_stderr_basic. FIXME: filter_stderr_basic should not do that.
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        return $line if ($line =~ s/$qstring:\.\.\./$string:.../m);
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# Did not match anything
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    $line =~ s/[\w]+.*/.../m;
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    return "$line";
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#---------------------------------------------------------------------
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# Process lines. Two categories
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# (a) lines from back traces
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#     pass through those lines that contain file names we're interested in
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# (b) everything else
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#     pass through as is
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#---------------------------------------------------------------------
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovmy $prev_line = "";
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovwhile (<STDIN>) {
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    my $line = $_;
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    chomp($line);
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    if ($line =~ /^\s+(at |by )/)  {   # lines in a back trace
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        $line = massage_backtrace_line($line, \@tool_files, \@ARGV);
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if ($line =~ /\s+\.\.\./) {
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            print "$line\n" if ($prev_line !~ /\s+\.\.\./);
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        } else {
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            print "$line\n";
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        }
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    } else {
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        print "$line\n";  # everything else
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    }
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    $prev_line = $line
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovexit 0;
68