diff options
Diffstat (limited to 'mesalib/bin')
-rw-r--r-- | mesalib/bin/bugzilla_mesa.sh | 52 | ||||
-rw-r--r-- | mesalib/bin/get-pick-list.sh | 6 | ||||
-rw-r--r-- | mesalib/bin/perf-annotate-jit | 251 | ||||
-rw-r--r-- | mesalib/bin/shortlog_mesa.sh | 6 |
4 files changed, 315 insertions, 0 deletions
diff --git a/mesalib/bin/bugzilla_mesa.sh b/mesalib/bin/bugzilla_mesa.sh new file mode 100644 index 000000000..491ca0e7c --- /dev/null +++ b/mesalib/bin/bugzilla_mesa.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# This script is used to generate the list of fixed bugs that +# appears in the release notes files, with HTML formatting. +# +# Note: This script could take a while until all details have +# been fetched from bugzilla. +# +# Usage examples: +# +# $ bin/bugzilla_mesa.sh mesa-9.0.2..mesa-9.0.3 +# $ bin/bugzilla_mesa.sh mesa-9.0.2..mesa-9.0.3 > bugfixes +# $ bin/bugzilla_mesa.sh mesa-9.0.2..mesa-9.0.3 | tee bugfixes +# $ DRYRUN=yes bin/bugzilla_mesa.sh mesa-9.0.2..mesa-9.0.3 +# $ DRYRUN=yes bin/bugzilla_mesa.sh mesa-9.0.2..mesa-9.0.3 | wc -l + + +# regex pattern: trim before url +trim_before='s/.*\(http\)/\1/' + +# regex pattern: trim after url +trim_after='s/\(show_bug.cgi?id=[0-9]*\).*/\1/' + +# regex pattern: always use https +use_https='s/http:/https:/' + +# extract fdo urls from commit log +urls=$(git log $* | grep 'bugs.freedesktop.org/show_bug' | sed -e $trim_before -e $trim_after -e $use_https | sort | uniq) + +# if DRYRUN is set to "yes", simply print the URLs and don't fetch the +# details from fdo bugzilla. +#DRYRUN=yes + +if [ "x$DRYRUN" = xyes ]; then + for i in $urls + do + echo $i + done +else + echo "<ul>" + echo "" + + for i in $urls + do + id=$(echo $i | cut -d'=' -f2) + summary=$(wget --quiet -O - $i | grep -e '<title>.*</title>' | sed -e 's/ *<title>Bug [0-9]\+ – \(.*\)<\/title>/\1/') + echo "<li><a href=\"$i\">Bug $id</a> - $summary</li>" + echo "" + done + + echo "</ul>" +fi diff --git a/mesalib/bin/get-pick-list.sh b/mesalib/bin/get-pick-list.sh index d3ac511c1..d2b76e7e6 100644 --- a/mesalib/bin/get-pick-list.sh +++ b/mesalib/bin/get-pick-list.sh @@ -1,6 +1,12 @@ #!/bin/sh # Script for generating a list of candidates for cherry-picking to a stable branch +# +# Usage examples: +# +# $ bin/get-pick-list.sh +# $ bin/get-pick-list.sh > picklist +# $ bin/get-pick-list.sh | tee picklist # Grep for commits with "cherry picked from commit" in the commit message. git log --reverse --grep="cherry picked from commit" origin/master..HEAD |\ diff --git a/mesalib/bin/perf-annotate-jit b/mesalib/bin/perf-annotate-jit new file mode 100644 index 000000000..746434008 --- /dev/null +++ b/mesalib/bin/perf-annotate-jit @@ -0,0 +1,251 @@ +#!/usr/bin/env python +# +# Copyright 2012 VMware Inc +# Copyright 2008-2009 Jose Fonseca +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +"""Perf annotate for JIT code. + +Linux `perf annotate` does not work with JIT code. This script takes the data +produced by `perf script` command, plus the diassemblies outputed by gallivm +into /tmp/perf-XXXXX.map.asm and produces output similar to `perf annotate`. + +See docs/llvmpipe.html for usage instructions. + +The `perf script` output parser was derived from the gprof2dot.py script. +""" + + +import sys +import os.path +import re +import optparse +import subprocess + + +class Parser: + """Parser interface.""" + + def __init__(self): + pass + + def parse(self): + raise NotImplementedError + + +class LineParser(Parser): + """Base class for parsers that read line-based formats.""" + + def __init__(self, file): + Parser.__init__(self) + self._file = file + self.__line = None + self.__eof = False + self.line_no = 0 + + def readline(self): + line = self._file.readline() + if not line: + self.__line = '' + self.__eof = True + else: + self.line_no += 1 + self.__line = line.rstrip('\r\n') + + def lookahead(self): + assert self.__line is not None + return self.__line + + def consume(self): + assert self.__line is not None + line = self.__line + self.readline() + return line + + def eof(self): + assert self.__line is not None + return self.__eof + + +mapFile = None + +def lookupMap(filename, matchSymbol): + global mapFile + mapFile = filename + stream = open(filename, 'rt') + for line in stream: + start, length, symbol = line.split() + + start = int(start, 16) + length = int(length,16) + + if symbol == matchSymbol: + return start + + return None + +def lookupAsm(filename, desiredFunction): + stream = open(filename + '.asm', 'rt') + while stream.readline() != desiredFunction + ':\n': + pass + + asm = [] + line = stream.readline().strip() + while line: + addr, instr = line.split(':', 1) + addr = int(addr) + asm.append((addr, instr)) + line = stream.readline().strip() + + return asm + + + +samples = {} + + +class PerfParser(LineParser): + """Parser for linux perf callgraph output. + + It expects output generated with + + perf record -g + perf script + """ + + def __init__(self, infile, symbol): + LineParser.__init__(self, infile) + self.symbol = symbol + + def readline(self): + # Override LineParser.readline to ignore comment lines + while True: + LineParser.readline(self) + if self.eof() or not self.lookahead().startswith('#'): + break + + def parse(self): + # read lookahead + self.readline() + + while not self.eof(): + self.parse_event() + + asm = lookupAsm(mapFile, self.symbol) + + addresses = samples.keys() + addresses.sort() + total_samples = 0 + + sys.stdout.write('%s:\n' % self.symbol) + for address, instr in asm: + try: + sample = samples.pop(address) + except KeyError: + sys.stdout.write(6*' ') + else: + sys.stdout.write('%6u' % (sample)) + total_samples += sample + sys.stdout.write('%6u: %s\n' % (address, instr)) + print 'total:', total_samples + assert len(samples) == 0 + + sys.exit(0) + + def parse_event(self): + if self.eof(): + return + + line = self.consume() + assert line + + callchain = self.parse_callchain() + if not callchain: + return + + def parse_callchain(self): + callchain = [] + while self.lookahead(): + function = self.parse_call(len(callchain) == 0) + if function is None: + break + callchain.append(function) + if self.lookahead() == '': + self.consume() + return callchain + + call_re = re.compile(r'^\s+(?P<address>[0-9a-fA-F]+)\s+(?P<symbol>.*)\s+\((?P<module>[^)]*)\)$') + + def parse_call(self, first): + line = self.consume() + mo = self.call_re.match(line) + assert mo + if not mo: + return None + + if not first: + return None + + function_name = mo.group('symbol') + if not function_name: + function_name = mo.group('address') + + module = mo.group('module') + + function_id = function_name + ':' + module + + address = mo.group('address') + address = int(address, 16) + + if function_name != self.symbol: + return None + + start_address = lookupMap(module, function_name) + address -= start_address + + #print function_name, module, address + + samples[address] = samples.get(address, 0) + 1 + + return True + + +def main(): + """Main program.""" + + optparser = optparse.OptionParser( + usage="\n\t%prog [options] symbol_name") + (options, args) = optparser.parse_args(sys.argv[1:]) + if len(args) != 1: + optparser.error('wrong number of arguments') + + symbol = args[0] + + p = subprocess.Popen(['perf', 'script'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + parser = PerfParser(p.stdout, symbol) + parser.parse() + + +if __name__ == '__main__': + main() + + +# vim: set sw=4 et: diff --git a/mesalib/bin/shortlog_mesa.sh b/mesalib/bin/shortlog_mesa.sh index b20c52fdd..2ba0815de 100644 --- a/mesalib/bin/shortlog_mesa.sh +++ b/mesalib/bin/shortlog_mesa.sh @@ -2,6 +2,12 @@ # This script is used to generate the list of changes that # appears in the release notes files, with HTML formatting. +# +# Usage examples: +# +# $ bin/shortlog_mesa.sh mesa-9.0.2..mesa-9.0.3 +# $ bin/shortlog_mesa.sh mesa-9.0.2..mesa-9.0.3 > changes +# $ bin/shortlog_mesa.sh mesa-9.0.2..mesa-9.0.3 | tee changes typeset -i in_log=0 |