From patchwork Thu Jun 25 08:21:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rasmus Villemoes X-Patchwork-Id: 6672551 Return-Path: X-Original-To: patchwork-linux-kbuild@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id CE80F9F39B for ; Thu, 25 Jun 2015 08:22:42 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D8370206E4 for ; Thu, 25 Jun 2015 08:22:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5EF64206E3 for ; Thu, 25 Jun 2015 08:22:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752185AbbFYIWj (ORCPT ); Thu, 25 Jun 2015 04:22:39 -0400 Received: from mail-la0-f42.google.com ([209.85.215.42]:35658 "EHLO mail-la0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751984AbbFYIVy (ORCPT ); Thu, 25 Jun 2015 04:21:54 -0400 Received: by lagi2 with SMTP id i2so40335621lag.2 for ; Thu, 25 Jun 2015 01:21:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rasmusvillemoes.dk; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=pWhyAYTbpAR0rx6Ehu7bn7IwoL8fAoNkxHem6dXulz0=; b=fY/GCA0/p6tU7SMnxw+UI70zf0GvxzEGldKIqc0RoQ2UOYDlFsKJBr48pErEtA9nQP NkR5hE6Rmv+hq1noe4mVut70R79p5r2iSfRapKrl2o1LSc2yCfmngFT1pA2kjTbWQiFb L3IDE8vWn96HBVrliRSDdHicaSrEjvOrgmdLc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=pWhyAYTbpAR0rx6Ehu7bn7IwoL8fAoNkxHem6dXulz0=; b=mD+FTbEq8Mcy5PHROsuzbWJ5ac6JfCgAAElJAPDzt1HnYf7Rv7QZklCcuGtOi29noL 1xB2uTv/8v6dKeI8/OGx9rFoMO3gJozXL2v9egl787VLQCAl240sP7GTlUzLTtIgTuHX BiRO0ASiF04gDx8FqoFyREkkqcdl72DZN5w0zl4JmWAM+isfraN3VWGdCj8F6So+ySNH d+ILDrIByanHhfhv4kkdejO8fPctWMTdu9zCK8cJXXnFsb4V1iT7GEpavsNIOxm1MHdp tZIIEzvmZJgLSnoHbqUP3qKB2yHle9gsrzj+L6T4hF7svHtrjzcns9LNWIxqVC6LLEfS xMSQ== X-Gm-Message-State: ALoCoQnIbTfxrZtXA4/FYZ5f9asxO0IGv1S/Jcp7sfsBFJsZroUBjqQvb4fYn/XLPuPyGezykgYm X-Received: by 10.112.25.39 with SMTP id z7mr44657982lbf.102.1435220513571; Thu, 25 Jun 2015 01:21:53 -0700 (PDT) Received: from spencer.imf.au.dk ([130.225.20.51]) by mx.google.com with ESMTPSA id j1sm7021891lbc.15.2015.06.25.01.21.53 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 25 Jun 2015 01:21:53 -0700 (PDT) From: Rasmus Villemoes To: Michal Marek Cc: linux-kbuild@vger.kernel.org, Rasmus Villemoes , linux-kernel@vger.kernel.org Subject: [RFC v2 4/4] scripts: add stackdelta script Date: Thu, 25 Jun 2015 10:21:32 +0200 Message-Id: <1435220492-15868-5-git-send-email-linux@rasmusvillemoes.dk> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1435220492-15868-1-git-send-email-linux@rasmusvillemoes.dk> References: <1434849046-19920-1-git-send-email-linux@rasmusvillemoes.dk> <1435220492-15868-1-git-send-email-linux@rasmusvillemoes.dk> Sender: linux-kbuild-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org X-Spam-Status: No, score=-8.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This adds a simple perl script for reading two files as produced by the stackusage script and computing the changes in stack usage. For example: $ scripts/stackusage -o /tmp/old.su CC=gcc-4.7 -j8 fs/ext4/ $ scripts/stackusage -o /tmp/new.su CC=gcc-5.0 -j8 fs/ext4/ $ scripts/stackdelta /tmp/{old,new}.su | sort -k5,5g shows that gcc 5.0 generally produces less stack-hungry code than gcc 4.7. Obviously, the script can also be used for measuring the effect of commits, .config tweaks or whatnot. Signed-off-by: Rasmus Villemoes --- scripts/stackdelta | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 scripts/stackdelta diff --git a/scripts/stackdelta b/scripts/stackdelta new file mode 100755 index 000000000000..4730dfa7780f --- /dev/null +++ b/scripts/stackdelta @@ -0,0 +1,59 @@ +#!/usr/bin/perl + +# Read two files producesd by the stackusage script, and show the +# delta between them. +# +# Currently, only shows changes for functions listed in both files. We +# could add an option to show also functions which have vanished or +# appeared (which would often be due to gcc making other inlining +# decisions). +# +# Another possible option would be a minimum absolute value for the +# delta. +# +# A third possibility is for sorting by delta, but that can be +# achieved by piping to sort -k5,5g. + +sub read_stack_usage_file { + my %su; + my $f = shift; + open(my $fh, '<', $f) + or die "cannot open $f: $!"; + while (<$fh>) { + chomp; + my ($file, $func, $size, $type) = split; + # Old versions of gcc (at least 4.7) have an annoying quirk in + # that a (static) function whose name has been changed into + # for example ext4_find_unwritten_pgoff.isra.11 will show up + # in the .su file with a name of just "11". Since such a + # numeric suffix is likely to change across different + # commits/compilers/.configs or whatever else we're trying to + # tweak, we can't really track those functions, so we just + # silently skip them. + # + # Newer gcc (at least 5.0) report the full name, so again, + # since the suffix is likely to change, we strip it. + next if $func =~ m/^[0-9]+$/; + $func =~ s/\..*$//; + # Line numbers are likely to change; strip those. + $file =~ s/:[0-9]+$//; + $su{"${file}\t${func}"} = {size => $size, type => $type}; + } + close($fh); + return \%su; +} + +@ARGV == 2 + or die "usage: $0 "; + +my $old = read_stack_usage_file($ARGV[0]); +my $new = read_stack_usage_file($ARGV[1]); +my @common = sort grep {exists $new->{$_}} keys %$old; +for (@common) { + my $x = $old->{$_}{size}; + my $y = $new->{$_}{size}; + my $delta = $y - $x; + if ($delta) { + printf "%s\t%d\t%d\t%+d\n", $_, $x, $y, $delta; + } +}