summaryrefslogtreecommitdiff
path: root/scripts/checkstack.pl
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-05-28 20:56:36 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-05-28 20:56:36 -0700
commit3a76313bfbbd344cd4588da4314901882a609ecf (patch)
treeca2a9dedc0fc1c751ae0fe8cf4db3c76c4aa9fd8 /scripts/checkstack.pl
parent969d891190f3d95b2f7108c0e2c8c4082f4c9e1c (diff)
[PATCH] Add `make checkstack' target
Jorn Engel <joern@wohnheim.fh-wedel.de> Adds a `make checkstack' target. This disassembles and parses vmlinux and *.ko, generating a sorted list of stack hogs, eg: 0xc0100663 huft_build: 1456 0xc01022d3 huft_build: 1456 0xc0103127 inflate_dynamic: 1328 0xc0101487 inflate_dynamic: 1324 0xc010131f inflate_fixed: 1168 0xc0102fb7 inflate_fixed: 1168 0x00000003 sha512_transform: 984 0xc024aee3 Vpd: 952 0x00000003 twofish_setkey: 804 0x000060c3 isd200_action: 792 0x0000e6cb nfsd4_proc_compound: 760 0xc0249087 SkPnmiGetStruct: 712 .... Supported architectures are alleged to be arm, x86, ia64, mips, mips64, ppc, ppc64 and s390x. Signed-off-by: Jörn Engel <joern@wohnheim.fh-wedel.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'scripts/checkstack.pl')
-rw-r--r--scripts/checkstack.pl101
1 files changed, 101 insertions, 0 deletions
diff --git a/scripts/checkstack.pl b/scripts/checkstack.pl
new file mode 100644
index 000000000000..e16d5d0fb0ea
--- /dev/null
+++ b/scripts/checkstack.pl
@@ -0,0 +1,101 @@
+#!/usr/bin/perl
+
+# Check the stack usage of functions
+#
+# Copyright Joern Engel <joern@wh.fh-wedel.de>
+# Inspired by Linus Torvalds
+# Original idea maybe from Keith Owens
+# s390 port and big speedup by Arnd Bergmann <arnd@bergmann-dalldorf.de>
+# Mips port by Juan Quintela <quintela@mandrakesoft.com>
+# IA64 port via Andreas Dilger
+# Arm port by Holger Schurig
+# Random bits by Matt Mackall <mpm@selenic.com>
+#
+# Usage:
+# objdump -d vmlinux | stackcheck_ppc.pl [arch]
+#
+# TODO : Port to all architectures (one regex per arch)
+
+# check for arch
+#
+# $re is used for two matches:
+# $& (whole re) matches the complete objdump line with the stack growth
+# $1 (first bracket) matches the size of the stack growth
+#
+# use anything else and feel the pain ;)
+{
+ my $arch = shift;
+ if ($arch eq "") {
+ $arch = `uname -m`;
+ }
+
+ $x = "[0-9a-f]"; # hex character
+ $xs = "[0-9a-f ]"; # hex character or space
+ if ($arch =~ /^arm$/) {
+ #c0008ffc: e24dd064 sub sp, sp, #100 ; 0x64
+ $re = qr/.*sub.*sp, sp, #(([0-9]{2}|[3-9])[0-9]{2})/o;
+ } elsif ($arch =~ /^i[3456]86$/) {
+ #c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp
+ $re = qr/^.*sub \$(0x$x{3,5}),\%esp$/o;
+ } elsif ($arch =~ /^ia64$/) {
+ #e0000000044011fc: 01 0f fc 8c adds r12=-384,r12
+ $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o;
+ } elsif ($arch =~ /^mips64$/) {
+ #8800402c: 67bdfff0 daddiu sp,sp,-16
+ $re = qr/.*daddiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;
+ } elsif ($arch =~ /^mips$/) {
+ #88003254: 27bdffe0 addiu sp,sp,-32
+ $re = qr/.*addiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;
+ } elsif ($arch =~ /^ppc$/) {
+ #c00029f4: 94 21 ff 30 stwu r1,-208(r1)
+ $re = qr/.*stwu.*r1,-($x{3,5})\(r1\)/o;
+ } elsif ($arch =~ /^ppc64$/) {
+ #XXX
+ $re = qr/.*stdu.*r1,-($x{3,5})\(r1\)/o;
+ } elsif ($arch =~ /^s390x?$/) {
+ # 11160: a7 fb ff 60 aghi %r15,-160
+ $re = qr/.*ag?hi.*\%r15,-(([0-9]{2}|[3-9])[0-9]{2})/o;
+ } else {
+ print("wrong or unknown architecture\n");
+ exit
+ }
+}
+
+sub bysize($) {
+ ($asize = $a) =~ s/.* +(.*)$/$1/;
+ ($bsize = $b) =~ s/.* +(.*)$/$1/;
+ $bsize <=> $asize
+}
+
+#
+# main()
+#
+$funcre = qr/^$x* \<(.*)\>:$/;
+while ($line = <STDIN>) {
+ if ($line =~ m/$funcre/) {
+ $func = $1;
+ }
+ if ($line =~ m/$re/) {
+ my $size = $1;
+ $size = hex($size) if ($size =~ /^0x/);
+
+ $line =~ m/^($xs*).*/;
+ my $addr = $1;
+ $addr =~ s/ /0/g;
+ $addr = "0x$addr";
+
+ my $intro = "$addr $func:";
+ my $padlen = 56 - length($intro);
+ while ($padlen > 0) {
+ $intro .= ' ';
+ $padlen -= 8;
+ }
+ $stack[@stack] = "$intro$size\n";
+ }
+}
+
+@sortedstack = sort bysize @stack;
+
+foreach $i (@sortedstack) {
+ print("$i");
+}