275 lines
12 KiB
Plaintext
275 lines
12 KiB
Plaintext
#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
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
_perf() {
|
|
local context curcontext="$curcontext" state line
|
|
typeset -A opt_args
|
|
|
|
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 "$@"
|