oprofile-top.py revision 2665:a124942bacb8
111308Santhony.gutierrez@amd.com#! /usr/bin/env python
211308Santhony.gutierrez@amd.com
311308Santhony.gutierrez@amd.com# Copyright (c) 2005 The Regents of The University of Michigan
411308Santhony.gutierrez@amd.com# All rights reserved.
511308Santhony.gutierrez@amd.com#
611308Santhony.gutierrez@amd.com# Redistribution and use in source and binary forms, with or without
711308Santhony.gutierrez@amd.com# modification, are permitted provided that the following conditions are
811308Santhony.gutierrez@amd.com# met: redistributions of source code must retain the above copyright
911308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer;
1011308Santhony.gutierrez@amd.com# redistributions in binary form must reproduce the above copyright
1111308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer in the
1211308Santhony.gutierrez@amd.com# documentation and/or other materials provided with the distribution;
1311308Santhony.gutierrez@amd.com# neither the name of the copyright holders nor the names of its
1411308Santhony.gutierrez@amd.com# contributors may be used to endorse or promote products derived from
1511308Santhony.gutierrez@amd.com# this software without specific prior written permission.
1611308Santhony.gutierrez@amd.com#
1711308Santhony.gutierrez@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1811308Santhony.gutierrez@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1911308Santhony.gutierrez@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2011308Santhony.gutierrez@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2111308Santhony.gutierrez@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2211308Santhony.gutierrez@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2311308Santhony.gutierrez@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2411308Santhony.gutierrez@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2511308Santhony.gutierrez@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2611308Santhony.gutierrez@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2711308Santhony.gutierrez@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2811308Santhony.gutierrez@amd.com#
2911308Santhony.gutierrez@amd.com# Authors: Ali Saidi
3011308Santhony.gutierrez@amd.com#          Nathan Binkert
3111308Santhony.gutierrez@amd.com
3211308Santhony.gutierrez@amd.com# Parse sampled function profile output (quick hack).
3311308Santhony.gutierrez@amd.com
3411308Santhony.gutierrez@amd.comimport sys
3511308Santhony.gutierrez@amd.comimport re
3611308Santhony.gutierrez@amd.comimport getopt
3711308Santhony.gutierrez@amd.comfrom categories import *
3812563Sgabeblack@google.com
3912563Sgabeblack@google.comdef category(app,sym):
4011308Santhony.gutierrez@amd.com    if re.search("vmlinux-2.6", app):
4111308Santhony.gutierrez@amd.com        name = sym
4211308Santhony.gutierrez@amd.com    else:
4311308Santhony.gutierrez@amd.com        name = app
4411308Santhony.gutierrez@amd.com
4512563Sgabeblack@google.com    if categories.has_key(name):
4611308Santhony.gutierrez@amd.com        return categories[name]
4711308Santhony.gutierrez@amd.com    for regexp, cat in categories_re:
4811308Santhony.gutierrez@amd.com        if regexp.match(name):
4911308Santhony.gutierrez@amd.com            return cat
5011308Santhony.gutierrez@amd.com    print "no match for symbol %s" % name
5111308Santhony.gutierrez@amd.com    return 'other'
5211308Santhony.gutierrez@amd.com
5311308Santhony.gutierrez@amd.comtry:
5411308Santhony.gutierrez@amd.com   (opts, files) = getopt.getopt(sys.argv[1:], 'i')
5511308Santhony.gutierrez@amd.comexcept getopt.GetoptError:
5611308Santhony.gutierrez@amd.com        print "usage", sys.argv[0], "[-i] <files>"
5711308Santhony.gutierrez@amd.com        sys.exit(2)
5811308Santhony.gutierrez@amd.com
5911308Santhony.gutierrez@amd.comshowidle = True
6011308Santhony.gutierrez@amd.com
6111308Santhony.gutierrez@amd.comfor o,v in opts:
6211308Santhony.gutierrez@amd.com    if o == "-i":
6311308Santhony.gutierrez@amd.com        showidle = False
6411308Santhony.gutierrez@amd.comprint files
6511308Santhony.gutierrez@amd.comf = open(files.pop())
6611308Santhony.gutierrez@amd.comtotal = 0
6711308Santhony.gutierrez@amd.comprof = {}
6811308Santhony.gutierrez@amd.comlinenum  = 0
6911308Santhony.gutierrez@amd.comfor line in f.readlines():
7011308Santhony.gutierrez@amd.com    line = re.sub("\(no symbols\)", "nosym", line)
7111308Santhony.gutierrez@amd.com    line = re.sub("anonymous.*", "nosym", line)
7211308Santhony.gutierrez@amd.com    linenum += 1
7311308Santhony.gutierrez@amd.com    if linenum < 4:
7411308Santhony.gutierrez@amd.com        continue
7511308Santhony.gutierrez@amd.com    (count, percent, app, sym) = line.split()
7611308Santhony.gutierrez@amd.com    #total += int(count)
7711308Santhony.gutierrez@amd.com    cat = category(app,sym)
7811308Santhony.gutierrez@amd.com    if cat != 'idle' or showidle:
7911308Santhony.gutierrez@amd.com      total += int(count)
8011308Santhony.gutierrez@amd.com      prof[cat] = prof.get(cat,0) + int(count)
8111308Santhony.gutierrez@amd.com
8211308Santhony.gutierrez@amd.comcats = ['other', 'user', 'copy', 'bufmgt', 'stack', 'driver', 'interrupt', 'alignment' ]
8311308Santhony.gutierrez@amd.com
8411308Santhony.gutierrez@amd.comif showidle:
8511308Santhony.gutierrez@amd.com   cats.insert(0,'idle')
8611308Santhony.gutierrez@amd.com
8711308Santhony.gutierrez@amd.com#syms = [(i[1], i[0]) for i in prof.items()]
8811308Santhony.gutierrez@amd.com#syms.sort()
8911308Santhony.gutierrez@amd.com#for i in range(len(syms)):
9011308Santhony.gutierrez@amd.com#    print "%s -- %5.1f%% " % (prof[i][1], 100 * float(prof[i][0])/float(total))
9111308Santhony.gutierrez@amd.com
9211308Santhony.gutierrez@amd.comfor d in cats:
9311308Santhony.gutierrez@amd.com    if prof.has_key(d):
9411308Santhony.gutierrez@amd.com        print "%s -- %5.1f%% " % (d, 100 * float(prof[d])/float(total))
9511308Santhony.gutierrez@amd.com
9611308Santhony.gutierrez@amd.com