From dacc64724fda95d62b8b72b8c8b0010a7d6eda8b Mon Sep 17 00:00:00 2001 From: Joshua Oreman Date: Tue, 29 Dec 2009 20:33:25 -0500 Subject: [PATCH] [util] Add diffsize.pl utility for generating diffs of object sizes This is useful when comparing size optimizations. Signed-off-by: Marty Connor --- src/util/diffsize.pl | 101 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 src/util/diffsize.pl diff --git a/src/util/diffsize.pl b/src/util/diffsize.pl new file mode 100755 index 00000000..d4978c2a --- /dev/null +++ b/src/util/diffsize.pl @@ -0,0 +1,101 @@ +#!/usr/bin/perl -w +# usage: +# [somebody@somewhere ~/gpxe/src]$ ./util/diffsize.pl [ []] +# by default is HEAD and is the working tree + +use strict; + +-d "bin" or die "Please run me in the gPXE src directory\n"; +mkdir ".sizes"; + +my($oldrev, $newrev); +my($oldname, $newname); + +if (@ARGV) { + $oldname = shift; +} else { + $oldname = "HEAD"; +} + +if (@ARGV) { + $newname = shift; +} else { + $newrev = "tree" . time(); +} + +$oldrev = `git rev-parse $oldname`; +chomp $oldrev; + +unless (defined $newrev) { + $newrev = `git rev-parse $newname`; + chomp $newrev; +} + +sub calc_sizes($$) { + my($name, $rev) = @_; + my $output; + my $lastrev; + my $stashed = 0; + my $res = 0; + + return if -e ".sizes/$rev.sizes"; + + if (defined $name) { + $output = `git stash`; + $stashed = 1 unless $output =~ /No local changes to save/; + $lastrev = `git name-rev --name-only HEAD`; + system("git checkout $name >/dev/null"); $res ||= $?; + } + + system("make -j4 bin/gpxe.lkrn >/dev/null"); $res ||= $?; + system("make bin/gpxe.lkrn.sizes > .sizes/$rev.sizes"); $res ||= $?; + + if (defined $name) { + system("git checkout $lastrev >/dev/null"); $res ||= $?; + system("git stash pop >/dev/null") if $stashed; $res ||= $?; + } + + if ($res) { + unlink(".sizes/$rev.sizes"); + die "Error making sizes file\n"; + } +} + +our %Sizes; + +sub save_sizes($$) { + my($id, $rev) = @_; + my $file = ".sizes/$rev.sizes"; + + open SIZES, $file or die "opening $file: $!\n"; + while () { + my($text, $data, $bss, $total, $hex, $name) = split; + $name =~ s|bin/||; $name =~ s|\.o$||; + + # Skip the header and totals lines + next if $total =~ /[a-z]/ or $name =~ /TOTALS/; + + # Skip files named with dash, due to old Makefile bug + next if $name =~ /-/; + + $Sizes{$name} = {old => 0, new => 0} unless exists $Sizes{$name}; + $Sizes{$name}{$id} = $total; + } +} + +calc_sizes($oldname, $oldrev); +calc_sizes($newname, $newrev); + +save_sizes('old', $oldrev); +save_sizes('new', $newrev); + +my $total = 0; + +for (sort keys %Sizes) { + my $diff = $Sizes{$_}{new} - $Sizes{$_}{old}; + if (abs($diff) >= 16) { + printf "%12s %+d\n", substr($_, 0, 12), $Sizes{$_}{new} - $Sizes{$_}{old}; + } + $total += $diff; +} +printf " TOTAL: %+d\n", $total;