+select STDERR;
+
+my $a = @supps;
+print "Found $a suppressions\n";
+
+my @extra;
+for (@supps) {
+ if (/\bfun:(m|c|re)alloc\b/) {
+ my $t = $1;
+ my %call;
+ if ($t eq 'm') { # malloc can also be called by calloc or realloc
+ $call{$_} = 1 for qw/calloc realloc/;
+ } elsif ($t eq 're') { # realloc can also call malloc or free
+ $call{$_} = 0 for qw/malloc free/;
+ } elsif ($t eq 'c') { # calloc can also call malloc
+ $call{$_} = 0 for qw/malloc/;
+ }
+ my $c = $_;
+ for (keys %call) {
+ my $d = $c;
+ $d =~ s/\b(fun:${t}alloc)\b/$call{$_} ? "$1\nfun:$_" : "fun:$_\n$1"/e;
+ # Remove one line for each line added or valgrind will hate us
+ $d =~ s/\n(.+?)\s*$/\n/;
+ push @extra, $d;
+ }
+ }
+}
+my $e = @extra;
+print "Generated $e extra suppressions\n";
+
+my %dupes;
+@dupes{@supps, @extra} = ();
+@supps = keys %dupes;
+my $b = @supps;
+print "Removed " . (($a + $e) - $b) . " duplicates\n";
+
+my ($name, $num) = ('perlTestValgrind', 0);
+