From b877df4e7090c9a45da6a4c5f25d8ad172ed2639 Mon Sep 17 00:00:00 2001 From: Julien Nicoulaud Date: Mon, 26 Mar 2012 22:54:21 +0200 Subject: [PATCH] Add Linux perf completion (partial) --- _perf | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 _perf diff --git a/_perf b/_perf new file mode 100644 index 0000000..c569625 --- /dev/null +++ b/_perf @@ -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 +# +# ------------------------------------------------------------------------------ +# -*- 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 "$@"