Skip to content

Commit

Permalink
Add Linux perf completion (partial)
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoulaj committed Mar 26, 2012
1 parent f6108b8 commit b877df4
Showing 1 changed file with 274 additions and 0 deletions.
274 changes: 274 additions & 0 deletions _perf
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
#compdef perf
# ------------------------------------------------------------------------------
# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the zsh-users nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# ------------------------------------------------------------------------------
# Description
# -----------
#
# Completion script for Linux performance counters 3.3 (perf.wiki.kernel.org).
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Julien Nicoulaud <julien.nicoulaud@gmail.com>
#
# ------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# ------------------------------------------------------------------------------


local context curcontext="$curcontext" state line
typeset -A opt_args

_perf() {
local ret=1

_arguments -C \
'(- : *)--version[show version number and exit]' \
'(- : *)--help[show help]: :_perf_cmds' \
'1: :_perf_cmds' \
'*::arg:->args' \
&& ret=0

case $state in
(args)
curcontext="${curcontext%:*:*}:perf-cmd-$words[1]:"
case $line[1] in
(annotate)
# TODO Complete CPU list
# TODO Complete disassembler style
_arguments \
'(- : *)'{-a,--all}'[prints all the available commands on the standard output]' \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
'(-d --dsos)'{-d,--dsos=}'[only consider symbols in these dsos]:dso list' \
'(-s --symbol)'{-s,--symbol=}'[symbol to annotate]:symbol' \
'(-f --force)'{-f,--force}'[do not complain, do it]' \
'(-v --verbose)'{-v,--verbose}'[be more verbose]' \
'(-D --dump-raw-trace)'{-D,--dump-raw-trace}'[dump raw trace in ASCII]' \
'(-k --vmlinux)'{-k,--vmlinux=}'[vmlinux pathname]: :_files' \
'(-m --modules)'{-m,--modules}'[load module symbols]' \
'(-l --print-line)'{-l,--print-line}'[print matching source lines]' \
'(-P --full-paths)'{-P,--full-paths}'[don'\''t shorten the displayed pathnames]' \
'--stdio[use the stdio interface]' \
'--tui[use the TUI interface]' \
'(-C --cpu)'{-C,--cpu}'[only report samples for the list of CPUs provided]:CPU list' \
'--asm-raw[show raw instruction encoding of assembly instructions]' \
'(--no-source)--source[interleave source code with assembly code]' \
'(--source)--no-source[don'\''t interleave source code with assembly code]' \
'--symfs=[look for files with symbols relative to this directory]: :_files -/' \
'(-M --disassembler-style)'{-M,--disassembler-style=}'[set disassembler style for objdump]:disassembler style' \
'1::symbol name' \
&& ret=0
;;
(archive)
_arguments \
'1: :_files' \
&& ret=0
;;
(bench)
# TODO Complete subsystems
# TODO Complete suites
_arguments \
'(-f --format)'{-f,--format=}'[specify format style]: :((default\:mainly\ for\ human\ reading simple\:friendly\ for\ automated\ processing\ by\ scripts))' \
'1::subsystem' \
'2::suite' \
&& ret=0
;;
(buildid-cache)
_arguments \
'(-a --add)'{-a,--add=}'[add specified file to the cache]: :_files' \
'(-r --remove)'{-r,--remove=}'[remove specified file from the cache]: :_files' \
'(-v --verbose)'{-v,--verbose}'[be more verbose]' \
&& ret=0
;;
(buildid-list)
_arguments \
'(-H --with-hits)'{-H,--with-hits}'[show only DSOs with hits]' \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
'(-f --force)'{-f,--force}'[don'\''t do ownership validation]' \
'(-k --kernel)'{-k,--kernel}'[show running kernel build id]' \
'(-v --verbose)'{-v,--verbose}'[be more verbose]' \
&& ret=0
;;
(diff)
_arguments \
'(-M --displacement)'{-M,--displacement}'[show position displacement relative to baseline]' \
'(-D --dump-raw-trace)'{-D,--dump-raw-trace}'[dump raw trace in ASCII]' \
'(-m --modules)'{-m,--modules}'[load module symbols]' \
'(-d --dsos)'{-d,--dsos=}'[only consider symbols in these dsos]:dso list' \
'(-C --comms)'{-C,--comms=}'[only consider symbols in these comms]:comm list' \
'(-S --symbols)'{-S,--symbols=}'[only consider these symbols]:symbol list' \
'(-s --sort)'{-s,--sort=}'[sort by key(s)]: :_values -s , key pid comm dso symbol' \
'(-t --field-separator)'{-t,--field-separator=}'[use a special separator character and don'\''t pad with spaces]:separator' \
'(-v --verbose)'{-v,--verbose}'[be verbose, for instance, show the raw counts in addition to the diff]' \
'(-f --force)'{-f,--force}'[don'\''t complain, do it]' \
'--symfs=[look for files with symbols relative to this directory]: :_files -/' \
'1:old file:_files' \
'2:new file:_files' \
&& ret=0
;;
(evlist)
_arguments \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
&& ret=0
;;
(inject)
_arguments \
'(-b --build-ids)'{-b,--build-ids=}'[inject build-ids into the output stream]:build-id list' \
'(-v --verbose)'{-v,--verbose}'[be more verbose]' \
&& ret=0
;;
(kmem)
# TODO Complete 'record' command
_arguments \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
'--caller[show per-callsite statistics]' \
'--alloc[show per-allocation statistics]' \
'(-s --sort)'{-s,--sort=}'[sort by output]: :_values -s , key frag hit bytes' \
'(-n --lines)'{-n,--lines}'[print n lines only]:number' \
'1:command:((record\:record\ the\ kmem\ events\ of\ an\ arbitrary\ workload stat\:report\ kernel\ memory\ statistics))' \
&& ret=0
;;
(kvm)
_arguments \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
'(-o --output)'{-o,--output=}'[output file name]: :_files' \
'--host=[collect host side performance profile]:host' \
'--guest=[collect guest side performance profile]:guest' \
'--guestmount=[guest os root file system mount directory]: :_files -/' \
'--guestkallsyms=[guest os /proc/kallsyms file copy]: :_files' \
'--guestmodules=[guest os /proc/modules file copy]: :_files' \
'--guestvmlinux=[guest os kernel vmlinux]: :_files' \
'1:command:((top record report diff buildid-list))' \
&& ret=0
;;
(list)
_arguments \
'1:event type:((hw\:hardware\ events hardware\:hardware\ events sw\:software\ events software\:software\ events cache\:cache\ events hwcache\:cache\ events tracepoint\:tracepoint\ events))' \
&& ret=0
;;
(lock)
# TODO Complete 'record' command
# TODO Complete 'report' command options
_arguments \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
'(-v --verbose)'{-v,--verbose}'[be more verbose]' \
'(-D --dump-raw-trace)'{-D,--dump-raw-trace}'[dump raw trace in ASCII]' \
'1:command:((record\:record\ lock\ events trace\:show\ raw\ lock\ events report\:report\ statistical\ data))' \
&& ret=0
;;
(probe)
# TODO not implemented
;;
(record)
# TODO not implemented
;;
(report)
# TODO not implemented
;;
(sched)
# TODO Complete 'record' command
_arguments \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
'(-v --verbose)'{-v,--verbose}'[be more verbose]' \
'(-D --dump-raw-trace)'{-D,--dump-raw-trace}'[dump raw trace in ASCII]' \
'1:command:((record\:record\ scheduling\ events script\:see\ a\ detailed\ trace replay\:simulate\ the\ workload map\:print\ a\ textual\ context-switching\ outline))' \
&& ret=0
;;
(script)
# TODO not implemented
;;
(stat)
# TODO not implemented
;;
(test)
_arguments \
'(-v --verbose)'{-v,--verbose}'[be more verbose]' \
&& ret=0
;;
(timechart)
# TODO Complete 'record' command
_arguments \
'(-i --input)'{-i,--input=}'[input file name]: :_files' \
'(-o --output)'{-o,--output=}'[output file name]: :_files' \
'(-w --width)'{-w,--width=}'[select the width of the SVG file]:width' \
'(-P --power-only)'{-P,--power-only}'[only output the CPU power section of the diagram]' \
'(-p --process)'{-p,--process}'[select the processes to display, by name or PID]:process' \
'--symfs=[look for files with symbols relative to this directory]: :_files -/' \
'1:command:((record))' \
&& ret=0
;;
(top)
# TODO not implemented
;;
(help)
_arguments \
'(- : *)'{-a,--all}'[prints all the available commands on the standard output]' \
'1: :_perf_cmds' \
&& ret=0
;;
*)
_call_function ret _perf_cmd_$words[1] && ret=0
(( ret )) && _message 'no more arguments'
;;
esac
;;
esac
}

# FIXME Parse 'perf --help' instead of hard-coding.
(( $+functions[_perf_cmds] )) ||
_perf_cmds() {
local commands; commands=(
'annotate:read perf.data (created by perf record) and display annotated code'
'archive:create archive with object files with build-ids found in perf.data file'
'bench:general framework for benchmark suites'
'buildid-cache:manage build-id cache'
'buildid-list:list the buildids in a perf.data file'
'diff:read two perf.data files and display the differential profile'
'evlist:list the event names in a perf.data file'
'inject:filter to augment the events stream with additional information'
'kmem:tool to trace/measure kernel memory(slab) properties'
'kvm:tool to trace/measure kvm guest os'
'list:list all symbolic event types'
'lock:analyze lock events'
'probe:define new dynamic tracepoints'
'record:run a command and record its profile into perf.data'
'report:read perf.data (created by perf record) and display the profile'
'sched:tool to trace/measure scheduler properties (latencies)'
'script:read perf.data (created by perf record) and display trace output'
'stat:run a command and gather performance counter statistics'
'test:runs sanity tests'
'timechart:tool to visualize total system behavior during a workload'
'top:system profiling tool'
'help:show command usage information'
)
_describe -t commands 'command' commands "$@"
}

_perf "$@"

0 comments on commit b877df4

Please sign in to comment.