1*5bbb9f75SRasmus Villemoes#!/usr/bin/perl 2*5bbb9f75SRasmus Villemoes 3*5bbb9f75SRasmus Villemoes# Read two files produced by the stackusage script, and show the 4*5bbb9f75SRasmus Villemoes# delta between them. 5*5bbb9f75SRasmus Villemoes# 6*5bbb9f75SRasmus Villemoes# Currently, only shows changes for functions listed in both files. We 7*5bbb9f75SRasmus Villemoes# could add an option to show also functions which have vanished or 8*5bbb9f75SRasmus Villemoes# appeared (which would often be due to gcc making other inlining 9*5bbb9f75SRasmus Villemoes# decisions). 10*5bbb9f75SRasmus Villemoes# 11*5bbb9f75SRasmus Villemoes# Another possible option would be a minimum absolute value for the 12*5bbb9f75SRasmus Villemoes# delta. 13*5bbb9f75SRasmus Villemoes# 14*5bbb9f75SRasmus Villemoes# A third possibility is for sorting by delta, but that can be 15*5bbb9f75SRasmus Villemoes# achieved by piping to sort -k5,5g. 16*5bbb9f75SRasmus Villemoes 17*5bbb9f75SRasmus Villemoessub read_stack_usage_file { 18*5bbb9f75SRasmus Villemoes my %su; 19*5bbb9f75SRasmus Villemoes my $f = shift; 20*5bbb9f75SRasmus Villemoes open(my $fh, '<', $f) 21*5bbb9f75SRasmus Villemoes or die "cannot open $f: $!"; 22*5bbb9f75SRasmus Villemoes while (<$fh>) { 23*5bbb9f75SRasmus Villemoes chomp; 24*5bbb9f75SRasmus Villemoes my ($file, $func, $size, $type) = split; 25*5bbb9f75SRasmus Villemoes # Old versions of gcc (at least 4.7) have an annoying quirk in 26*5bbb9f75SRasmus Villemoes # that a (static) function whose name has been changed into 27*5bbb9f75SRasmus Villemoes # for example ext4_find_unwritten_pgoff.isra.11 will show up 28*5bbb9f75SRasmus Villemoes # in the .su file with a name of just "11". Since such a 29*5bbb9f75SRasmus Villemoes # numeric suffix is likely to change across different 30*5bbb9f75SRasmus Villemoes # commits/compilers/.configs or whatever else we're trying to 31*5bbb9f75SRasmus Villemoes # tweak, we can't really track those functions, so we just 32*5bbb9f75SRasmus Villemoes # silently skip them. 33*5bbb9f75SRasmus Villemoes # 34*5bbb9f75SRasmus Villemoes # Newer gcc (at least 5.0) report the full name, so again, 35*5bbb9f75SRasmus Villemoes # since the suffix is likely to change, we strip it. 36*5bbb9f75SRasmus Villemoes next if $func =~ m/^[0-9]+$/; 37*5bbb9f75SRasmus Villemoes $func =~ s/\..*$//; 38*5bbb9f75SRasmus Villemoes # Line numbers are likely to change; strip those. 39*5bbb9f75SRasmus Villemoes $file =~ s/:[0-9]+$//; 40*5bbb9f75SRasmus Villemoes $su{"${file}\t${func}"} = {size => $size, type => $type}; 41*5bbb9f75SRasmus Villemoes } 42*5bbb9f75SRasmus Villemoes close($fh); 43*5bbb9f75SRasmus Villemoes return \%su; 44*5bbb9f75SRasmus Villemoes} 45*5bbb9f75SRasmus Villemoes 46*5bbb9f75SRasmus Villemoes@ARGV == 2 47*5bbb9f75SRasmus Villemoes or die "usage: $0 <old> <new>"; 48*5bbb9f75SRasmus Villemoes 49*5bbb9f75SRasmus Villemoesmy $old = read_stack_usage_file($ARGV[0]); 50*5bbb9f75SRasmus Villemoesmy $new = read_stack_usage_file($ARGV[1]); 51*5bbb9f75SRasmus Villemoesmy @common = sort grep {exists $new->{$_}} keys %$old; 52*5bbb9f75SRasmus Villemoesfor (@common) { 53*5bbb9f75SRasmus Villemoes my $x = $old->{$_}{size}; 54*5bbb9f75SRasmus Villemoes my $y = $new->{$_}{size}; 55*5bbb9f75SRasmus Villemoes my $delta = $y - $x; 56*5bbb9f75SRasmus Villemoes if ($delta) { 57*5bbb9f75SRasmus Villemoes printf "%s\t%d\t%d\t%+d\n", $_, $x, $y, $delta; 58*5bbb9f75SRasmus Villemoes } 59*5bbb9f75SRasmus Villemoes} 60