From patchwork Thu Aug 20 09:53:30 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rasmus Villemoes X-Patchwork-Id: 7043081 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 814FF9F373 for ; Thu, 20 Aug 2015 09:54:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 99173204EB for ; Thu, 20 Aug 2015 09:54:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A2D36204E7 for ; Thu, 20 Aug 2015 09:54:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751635AbbHTJyf (ORCPT ); Thu, 20 Aug 2015 05:54:35 -0400 Received: from mail-lb0-f177.google.com ([209.85.217.177]:34592 "EHLO mail-lb0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751863AbbHTJx4 (ORCPT ); Thu, 20 Aug 2015 05:53:56 -0400 Received: by lbbtg9 with SMTP id tg9so20391537lbb.1 for ; Thu, 20 Aug 2015 02:53:54 -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=gGSyQqCA8yoS033aJLUu3sDkUL5tXfAPsGbfCSV1OKg=; b=DrBBwic5I3jxKGcOSl2cBYQebb6aCkYiQW5JUuL0wJ9/Q+3iTSJNJoYyr0O5FQuoRs qbZcuWEH+IbjLn89fRmAzRu/A1QVwP3UUB+UMutr6dLmu46tWS2eg2z7iF4iMWDXgtNi AdbmkUNdYitFWPiDCUJ2Ta6NY5IU9MaLMMmFg= 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=gGSyQqCA8yoS033aJLUu3sDkUL5tXfAPsGbfCSV1OKg=; b=EZ+fmK7dQ3yV51beQZFuWyPfR66W2e901FbVI8XdnZvmwjIY8ecB631ZHaNfaCTtDG qt/bMjgcrIAHvE2gB0KKiboDWMIFMvAERjFxTPnHLngilUx4C+GzDearIJuFvYqZYNM0 TmTFTJBYNZG3gEeHlVS21VvTmrq3/h6hqYf81TQv94yFtWeEds3+/AFYDn56cafeR0eP z+EW8yaxG96JTLOjSiTPZfOkXRL05L+CG8Qu36amwCpnxZw2EM7VCKDDOqJL0n0721V+ Mvep7JAG3xgT29PR3UpiBRPDrESBRCWxxSCCw1lk50JdI83o2flyPShdnWhZ1jpirLMZ h5gw== X-Gm-Message-State: ALoCoQl9LeNluJ/1jb0UJCAejUHFyJHXfc/JZgNeFywSRvFdYCkhMXuOdWcZPsDQkmXafko5AJ7q X-Received: by 10.112.126.69 with SMTP id mw5mr2067266lbb.111.1440064434549; Thu, 20 Aug 2015 02:53:54 -0700 (PDT) Received: from spencer.imf.au.dk ([130.225.20.51]) by smtp.gmail.com with ESMTPSA id n10sm1049208lbc.37.2015.08.20.02.53.53 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Aug 2015 02:53:54 -0700 (PDT) From: Rasmus Villemoes To: Michal Marek Cc: linux-kernel@vger.kernel.org, linux-kbuild@vger.kernel.org, Rasmus Villemoes Subject: [PATCH v3 4/4] scripts: add stackdelta script Date: Thu, 20 Aug 2015 11:53:30 +0200 Message-Id: <1440064410-13515-5-git-send-email-linux@rasmusvillemoes.dk> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1440064410-13515-1-git-send-email-linux@rasmusvillemoes.dk> References: <55D48FB9.50605@suse.cz> <1440064410-13515-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=-7.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable 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..48eabf2f48f8 --- /dev/null +++ b/scripts/stackdelta @@ -0,0 +1,59 @@ +#!/usr/bin/perl + +# Read two files produced 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; + } +}