mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			809 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			809 lines
		
	
	
	
		
			33 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef perf
 | |
| 
 | |
| local curcontext="$curcontext" curstate state line expl nm="$compstate[nmatches]"
 | |
| local -a args opts cmd fields sortkeys
 | |
| local -A exclude full short
 | |
| local -i i skip
 | |
| 
 | |
| exclude=(
 | |
|   --add \* --cgroup \* --definition \* --del \*
 | |
|   --detailed \* --dlarg \* --dsos \* --event \* --events \*
 | |
|   --fields \* --funcs \* --node-info \* --symbols \* --vars \*
 | |
|   --gtk '(--stdio --stdio2 --tui)'
 | |
|   --tui '(--gtk --stdio --stdio2)'
 | |
|   --stdio '(--gtk --tui --stdio2)'
 | |
|   --stdio2 '(--gtk --tui --stdio)'
 | |
|   --log-fd '(--output)'
 | |
|   --output '(--log-fd)'
 | |
|   --tracer '(-G --graph-funcs -g --nograph-funcs -F --funcs)'
 | |
|   --graph-funcs '(-g --nograph-funcs -N --notrace-funcs -T --trace-funcs -t --tracer)*'
 | |
|   --nograph-funcs '(-G --graph-funcs -N --notrace-funcs -T --trace-funcs -t --tracer)*'
 | |
|   --trace-funcs '(-N --notrace-funcs -G --graph-funcs -g --nograph-funcs -t --tracer)*'
 | |
|   --notrace-funcs '(-T --trace-funcs -G --graph-funcs -g --nograph-funcs -t --tracer)*'
 | |
|   --source '!(--no-source)'
 | |
| )
 | |
| 
 | |
| full=(
 | |
|   --addr-range '=[list traced records within address range]:range'
 | |
|   --affinity '=[set affinity mask of trace reading thread]:affinity:(node cpu)'
 | |
|   --aio '=[specify number of control blocks in asynchronous trace writing mode]:control blocks (1-4) [1]'
 | |
|   --all-cgroups '[record cgroup events]'
 | |
|   --all-cpus '[system-wide collection from all CPUs]'
 | |
|   --asm-raw '[show raw instruction encoding of assembly instructions]'
 | |
|   --aux-sample '=[sample AUX area]::options'
 | |
|   --baseline-only '[show only items with match in baseline]'
 | |
|   --branch-any '[sample any taken branches]'
 | |
|   --branch-filter '=[enable taken branch stack sampling]:mask'
 | |
|   --branch-stack '[use branch records for per branch histogram filling]'
 | |
|   --buffer-size '=[size of per-cpu buffer]: :_numbers size B K M G'
 | |
|   --build-ids '[inject build-ids into the output stream]'
 | |
|   --buildid-all '[handle build-id of all DSOs]'
 | |
|   --call-graph '=[enable call-graph (stacktrace) recording]:(fp dwarf)'
 | |
|   --cgroup '=[monitor event in named cgroup only]:cgroup'
 | |
|   --children '[accumulate callchains of children and show total overhead]'
 | |
|   --clang-opt '=:clang option'
 | |
|   --clang-path '=:clang binary:_command_names -e'
 | |
|   --clockid '=[specify clockid to use for events]:clock id'
 | |
|   --coalesce '=:coalesce field:_sequence compadd - pid tid iaddr dso'
 | |
|   --color-cpus '=[highlight given CPUs in map]:cpus'
 | |
|   --color-pids '=[highlight given pids in map]: :_sequence _pids'
 | |
|   --column-widths '=[use fixed column widths]:widths (comma-separated)'
 | |
|   --comms '=[restrict to specified comms]:comms'
 | |
|   --compression-level '=[produce compressed trace  using specified level]:level (1-22) [1]'
 | |
|   --compute '=[set comparison method]:comparison method [delta-abs]:(delta delta-abs ratio wdiff)'
 | |
|   --control '=[listen on ctl-fd descriptor for command to control measurement]:descriptor'
 | |
|   --count '=[specify event period]:period'
 | |
|   --count-filter '=[only display functions with more than given number of events]:minimum number of events'
 | |
|   --cpu '=[restrict to specified CPUs]:cpus'
 | |
|   --cpus '=[restrict to specified CPUs]:cpus'
 | |
|   --cycles-hist '[show cycles histogram and standard deviation]'
 | |
|   --data '[record the sample addresses]'
 | |
|   --data-page-size '[record the sampled data address data page size]'
 | |
|   --definition '=[show trace-event definition converted from given probe-event]:event'
 | |
|   --delay '=[specify delay before starting measurement after program start]:delay (ms)'
 | |
|   --demangle '[demangle symbols]'
 | |
|   --demangle-kernel '[demangle kernel symbols]'
 | |
|   --detailed '[detailed run - start a lot of events]'
 | |
|   --disassembler-style '=[specify disassembler style]:style'
 | |
|   --dlarg '=:dlfilter argument'
 | |
|   --dlfilter '=[filter sample events using the given shared object]:file:_files -g "*.so(-.)"'
 | |
|   --dry-run '[parse options then exit]'
 | |
|   --dsos '=[only consider symbols in these dsos]:dso'
 | |
|   --dump-raw-trace '[dump raw trace in ASCII]'
 | |
|   --dump-symtab '[dump the symbol table used for profiling]'
 | |
|   --duration '=[show only events with duration over threshold]:minimum duration (ms)'
 | |
|   --entries '=[specify how many functions to display]:number of functions'
 | |
|   --event '=[select the PMU event]:event:->events'
 | |
|   --exclude-other '[only display entries with parent-match]'
 | |
|   --exclude-perf "[don't record events from perf itself]"
 | |
|   --exec '=[specify path to executable or shared library]:file:_files'
 | |
|   --expr '=[specify syscalls/events to trace]:syscall or event'
 | |
|   --field-separator '=[specify field separator]:separator'
 | |
|   --fields '=[specify output field]:field:->fields'
 | |
|   --filter '=[event filter]:filter'
 | |
|   --filter-pids '=[specify pids to filter]: :_sequence _pids'
 | |
|   --for-each-cgroup '=[expand events for each cgroup]:cgroup'
 | |
|   --force "[don't complain, do it]"
 | |
|   --format '=[specify output formatting style]:style:(default simple)'
 | |
|   --formula '[show formula]'
 | |
|   --freq '=[specify profile frequency]:frequency (Hz)'
 | |
|   --func-opts '=[specify function tracer options]:option:_sequence compadd - call-graph irq-info'
 | |
|   --funcs '=[show available functions]::filter'
 | |
|   --graph-funcs '=[select function_graph tracer and trace given functions]:function'
 | |
|   --graph-function '=[only print symbols and callees with --call-trace/--call-ret-trace]:symbol list'
 | |
|   --graph-opts '=[specify graph tracer options]: : _values -s , option nosleep-time noirqs verbose thresh\:duration depth\:depth'
 | |
|   --group '=[show event group information together]'
 | |
|   --group-sort-idx '=[sort output by specified event in group]:event index'
 | |
|   --gtk '[use the graphical interface]'
 | |
|   --guestkallsyms '=[provide copy of guest os /proc/kallsyms]:file:_files'
 | |
|   --guestmodules '=[provide copy of guest os /proc/modules]:file:_files'
 | |
|   --guestmount '=[specify guest os root file system mount directory]:path:_directories'
 | |
|   --guestvmlinux '=[provide guest os kernel]:kernel file:_files'
 | |
|   --hide_kernel_symbols '[hide kernel symbols]'
 | |
|   --hide_user_symbols '[hide user symbols]'
 | |
|   --hide-unresolved '[only display entries resolved to a symbol]'
 | |
|   --hierarchy '[show entries in a hierarchy]'
 | |
|   --ignore-callees '=[ignore callees of specified functions in call graphs]:functions (regex)'
 | |
|   --ignore-vmlinux '[ignore vmlinux files]'
 | |
|   --inherit '[trace child processes]'
 | |
|   --input '=[specify input file]:file:_files'
 | |
|   --interval-count '=[print counts for fixed number of times]:times'
 | |
|   --interval-print '=[print counts at regular interval]:interval (ms)'
 | |
|   --intr-regs '=[sample selected machine registers on interrupt]:register'
 | |
|   --inverted '[alias for inverted call graph]'
 | |
|   --iostat '=::default'
 | |
|   --itrace '=[specify instruction tracing options]:option:->itrace-opts'
 | |
|   --jit '[merge jitdump files into perf.data file]'
 | |
|   --kallsyms '=[specify kallsyms pathname]:path:_files'
 | |
|   --kcore '=[add specified kcore file to the cache]:file:_files'
 | |
|   --kernel '[show running kernel build id]'
 | |
|   --Latency '[show latency attributes (irqs/preemption disabled, etc)]'
 | |
|   --list '[list all cached files]'
 | |
|   --list-opts '[list available options]'
 | |
|   --log-fd '=[log output to file descriptor instead of stderr]:file descriptor:_file_descriptors'
 | |
|   --map-dump '=[specify BPF map to periodically dump]:BPF map'
 | |
|   --max-blocks '=[set maximum number of code blocks to dump with brstackinsn]:blocks'
 | |
|   --max-events '=[set maximum number of events to print]:events'
 | |
|   --max-size '=[limit the maximum size of the output file]: :_numbers size B K M G'
 | |
|   --max-stack '=[set maximum stack depth when parsing the callchain]:depth [kernel.perf_event_max_stack or 127]'
 | |
|   --metrics '=[monitor specified metrics or metric groups]:metric'
 | |
|   --min-stack '=[set minimum stack depth when parsing the callchain]:depth'
 | |
|   --mmap-flush '=[specify minimum size that is extracted from mmap data pages]: :_numbers -d 1 -u bytes size B K M G'
 | |
|   --mmap-pages '=[specify number of mmap data pages]:number of pages'
 | |
|   --modules '[load module symbols]'
 | |
|   --namespaces '[record namespaces events]'
 | |
|   --no-bpf-event "[don't record bpf events]"
 | |
|   --no-buildid "[don't collect buildids in perf.data]"
 | |
|   --no-buildid-cache "[don't update the buildid cache]"
 | |
|   --no-inherit "[child tasks don't inherit counters]"
 | |
|   --no-samples "[don't sample]"
 | |
|   --node-info '[show extra node info in report]'
 | |
|   --nograph-funcs "=[select function_graph tracer and don't trace given functions]:function"
 | |
|   --notrace-funcs "=[select function tracer and don't trace given functions]:function filter"
 | |
|   --null "[null run - don't start any counters]"
 | |
|   --num-thread-synthesize '=[specify number of threads to run for event synthesis]:threads'
 | |
|   --objdump '=[specify objdump binary to use for disassembly and annotations]:path:_command_names -e'
 | |
|   --order '=[specify compute sorting]:ordering [1]:((
 | |
|     0\:baseline\ overhead
 | |
|     1\:computed\ value\ of\ column\ 1))'
 | |
|   --output '=[specify output file]:file:_files'
 | |
|   --parent '=[filter by parent caller]:parent (regex)'
 | |
|   --percent-limit "=[don't show entries under specified percentage]:percent"
 | |
|   --percent-type '=[set annotation percent type]:compadd {local,global}{period,hits}'
 | |
|   --percentage '=[set display of filtered entries percentages]:display:(relative absolute)'
 | |
|   --phys-data '[record/report sample physical addresses]'
 | |
|   --pid '=[restrict to specified process id]:process: _sequence _pids'
 | |
|   --post '=[specify command to run after to the measured command]: :_cmdstring'
 | |
|   --pre '=[specify command to run prior to the measured command]: :_cmdstring'
 | |
|   --prefix '=[add prefix to source file path names]:prefix:_directories'
 | |
|   --prefix-strip '=[strip elements from source file path names]:elements'
 | |
|   --pretty '=[specify pretty printing style]:key:(normal raw)'
 | |
|   --proc-map-timeout '=[specify per-thread proc mmap processing timeout]:timeout (ms)'
 | |
|   --quiet "[don't print any messages]"
 | |
|   --raw-samples '[collect raw sample records from all opened counters]'
 | |
|   --raw-trace '[show raw trace event output]'
 | |
|   --realtime '=[profile --addevents with specified priority]:RT SCHED_FIFO priority'
 | |
|   --repeat '=[specify amount of times to repeat the run]:repetitions'
 | |
|   --samples '=[specify number of samples to save per histogram entry for individual browsing]:samples'
 | |
|   --sched-stat '[get details of how long tasks slept]'
 | |
|   --show-cpu-utilization '[show sample percentage for different cpu modes]'
 | |
|   --show-info '[display extended perf.data information]'
 | |
|   --show-nr-samples '[show a column with the number of samples]'
 | |
|   --show-on-off-events '[show the --switch-on/off events too]'
 | |
|   --show-round-events '[display finished round events]'
 | |
|   --show-switch-events '[display context switch events]'
 | |
|   --show-total-period '[show a column with the sum of periods]'
 | |
|   --skip-missing '--skip-missing[skip symbols that cannot be annotated]'
 | |
|   --snapshot '=[select AUX area tracing snapshot mode]::snapshot capturing parameter'
 | |
|   --socket-filter '=[only show processor socket that match specified filter]:filter'
 | |
|   --sort '=[sort by specified keys]:key:->sort-keys'
 | |
|   --stat '[per-thread counts]'
 | |
|   --stdio '[use the stdio interface]'
 | |
|   --stdio-color '=[specify when to use colors in output]:mode [always]:(always never auto)'
 | |
|   --stdio2 '[use the stdio2 interface, non-interactive, TUI formatting]'
 | |
|   --stitch-lbr '[enable LBR callgraph stitching approach]'
 | |
|   --stop-bt '=[stop display of callgraph at these symbols]:symbol list'
 | |
|   --stream '[enable hot streams comparison]'
 | |
|   --strip '[strip non-synthesized events]'
 | |
|   --summary '[show only syscall summary with statistics]'
 | |
|   --switch-max-files '=[limit number of generated files to keep]:limit'
 | |
|   --switch-off '=[stop considering events after occurrence of specified event]:event'
 | |
|   --switch-on '=[consider events after occurrence of specified event]:event'
 | |
|   --switch-output '=[specify when to rotate output file]::signal or size [USR2]:_signals'
 | |
|   --switch-output-event '=[switch output event selector]:event:->events'
 | |
|   --sym-annotate '=[specify symbol to annotate]:symbol'
 | |
|   --symbol '=[specify symbol]:symbol'
 | |
|   --symbol-filter '=[only show symbols that match filter]:filter'
 | |
|   --symbols '=[only consider specified symbols]:symbol'
 | |
|   --symfs '=[look symbol files relative to specified directory]:directory:_directories'
 | |
|   --sync '[call sync() before starting a run]'
 | |
|   --system '[read and write system config file]'
 | |
|   --target-ns '=[obtain mount namespace information form the target pid]:pid:_processes'
 | |
|   --td-level '=[set the metrics level for the top-down statistics]:level'
 | |
|   --tid '=[restrict to specified threads]:tids'
 | |
|   --time '=[specify time span of interest]:time span (start,stop)'
 | |
|   --time-quantum '=[set time quantum for time sort key]: :_numbers -d 100ms "time quantum" ms us ns s'
 | |
|   --timeout '=[stop workload and print counts after a timeout period]:timeout (ms)'
 | |
|   --timestamp-filename '[append timestamp to output file name]'
 | |
|   --trace-fields '[show tracepoint fields]'
 | |
|   --trace-funcs '=[select function tracer and set function filter]:function filter'
 | |
|   --tracer '=[specify tracer to use]:tracer:(function_graph function)'
 | |
|   --tui '[use the curses interface]'
 | |
|   --uid '=[profile events in threads owned by uid]:uid:_users'
 | |
|   --user '[read and write user config file]'
 | |
|   --user-regs '=[sample selected machine registers on interrupt]:registers'
 | |
|   --vars '=[show available local variables at given probe point]:probe'
 | |
|   --vcpu '=[specify vcpu id to report]:vcpu'
 | |
|   --verbose '[be more verbose]'
 | |
|   --vm-time-correlation '=[correlate time between VM guests and the host]::options'
 | |
|   --vmlinux '=[specify vmlinux path]:vmlinux pathname:_files'
 | |
|   --weight '[sample by weight (on special events only)]'
 | |
|   --with-hits '[show only DSOs with hits]'
 | |
|   --with-summary '[show all syscalls and summary with statistics]'
 | |
|   --zero '[zero history across updates]'
 | |
| )
 | |
| short=(
 | |
|   --add                -a
 | |
|   --all-cpus           -a
 | |
|   --baseline-only      -b
 | |
|   --branch-any         -b
 | |
|   --build-ids          -b
 | |
|   --cpu                -C
 | |
|   --coalesce           -c
 | |
|   --compute            -c
 | |
|   --count              -c
 | |
|   --delay              -D
 | |
|   --dump-raw-trace     -D
 | |
|   --data               -d
 | |
|   --dsos               -d
 | |
|   --event              -e
 | |
|   --fields             -F
 | |
|   --formula            -F
 | |
|   --freq               -F
 | |
|   --funcs              -F
 | |
|   --force              -f
 | |
|   --cgroup             -G
 | |
|   --graph-funcs        -G
 | |
|   --with-hits          -H
 | |
|   --intr-regs          -I
 | |
|   --show-info          -I
 | |
|   --input              -i
 | |
|   --no-inherit         -i
 | |
|   --branch-filter      -j
 | |
|   --jit                -j
 | |
|   --clockid            -k
 | |
|   --key                -k
 | |
|   --vmlinux            -k
 | |
|   --list               -l
 | |
|   --disassembler-style -M
 | |
|   --buffer-size        -m
 | |
|   --mmap-pages         -m
 | |
|   --modules            -m
 | |
|   --node-info          -N
 | |
|   --no-buildid-cache   -N
 | |
|   --no-samples         -n
 | |
|   --show-nr-samples    -n
 | |
|   --order              -o
 | |
|   --output             -o
 | |
|   --pid                -p
 | |
|   --quiet              -q
 | |
|   --raw-samples        -R
 | |
|   --realtime           -r
 | |
|   --repeat             -r
 | |
|   --snapshot           -S
 | |
|   --symbols            -S
 | |
|   --with-summary       -S
 | |
|   --sched-stat         -s
 | |
|   --script             -s
 | |
|   --sort               -s
 | |
|   --summary            -s
 | |
|   --timestamp          -T
 | |
|   --tid                -t
 | |
|   --tracer             -t
 | |
|   --uid                -u
 | |
|   --verbose            -v
 | |
|   --weight             -W
 | |
|   --column-widths      -w
 | |
|   --field-separator    -x
 | |
|   --compression-level  -z
 | |
|   --zero               -z
 | |
| )
 | |
| 
 | |
| cmd=( $words[1] )
 | |
| (( $#words > 2 )) && ign='!'
 | |
| 
 | |
| _arguments -C -A "-*" \
 | |
|   "${ign}(- *)"{-v,--version}'[display version information]' \
 | |
|   "${ign}(- *)"{-h,--help}'[display usage information]' \
 | |
|   "${ign}(- *)-vv[print the compiled-in status of libraries]" \
 | |
|   '(- *)--exec-path[display or set exec path]' \
 | |
|   '(- *)--html-path[display html documentation path]' \
 | |
|   "${ign}(- *)--list-opts[list available options]" \
 | |
|   "${ign}(- *)--list-cmds[list available subcommands]" \
 | |
|   '!(-p --paginate --no-pager)'{-p,--paginate} \
 | |
|   --no-pager \
 | |
|   '--buildid-dir=[setup buildid cache directory]: :_directories' \
 | |
|   '--debugfs-dir=[set debugfs directory]: :_directories' \
 | |
|   '--debug=[setup debug variable]: : _values -s, "debug option"
 | |
|     verbose\:level ordered-events data-convert stderr perf-event-open' \
 | |
|   '1: :->subcmds' \
 | |
|   '*:: :->args'
 | |
| 
 | |
| while (( $#state )); do
 | |
|   curstate=$state
 | |
|   shift state
 | |
|   case $curstate in
 | |
|     subcmds)
 | |
|       subcmds=(
 | |
|         ${${${(f)"$(_call_program subcmds $cmd)"}[3,-2]## ##}/ ##(#m)?/:$MATCH[-1]:l}
 | |
|         'help:display help information about perf'
 | |
|       )
 | |
|       _describe 'subcommand' subcmds
 | |
|     ;;
 | |
|     subsubcmds)
 | |
|       _description commands expl command
 | |
|       compadd "$expl[@]" -a subcmds
 | |
|     ;;
 | |
|     args)
 | |
|       (( $#words < 3 )) && ign=''
 | |
|       cmd+=( $words[1] )
 | |
|       curcontext="${curcontext%:*:*}:${(j.-.)cmd}:"
 | |
|       args=()
 | |
|       skip=0
 | |
|       case ${(j.-.)cmd[2,-1]} in
 | |
|         kvm-*|top|stat)
 | |
|           full[--group]='[put the counters into a counter group]'
 | |
|         ;|
 | |
|         bench-[^-]##(|-all)) skip=1 opts=() subcmds=() ;|
 | |
| 
 | |
|         annotate)
 | |
|           full+=(
 | |
|             --full-paths "[don't shorten the displayed pathnames]"
 | |
|             --print-line "[print matching source lines (may be slow)]"
 | |
|           )
 | |
|           short+=(
 | |
|             --print-line -l
 | |
|             --full-paths -P
 | |
|             --symbol -s
 | |
|           )
 | |
|           args+=(
 | |
|             "--no-source[don't interleave source code with assembly code]"
 | |
|             '1:: :_guard "^-*" "symbol name"'
 | |
|           )
 | |
|         ;;
 | |
| 
 | |
|         archive)
 | |
|           _arguments --help '1:file:_files'
 | |
|           break
 | |
|         ;;
 | |
| 
 | |
|         bench)
 | |
|           short+=(
 | |
|             --edge -E
 | |
|             --format -f
 | |
|             --nfds -f
 | |
|             --group -g
 | |
|             --iterations -i
 | |
|             --loop -l
 | |
|             --nr_loops -l
 | |
|             --nr-mmaps -m
 | |
|             --multiq -m
 | |
|             --nested -N
 | |
|             --noaffinity -n
 | |
|             --nonblocking -B
 | |
|             --nr-samples -n
 | |
|             --pipe -p
 | |
|             --randomize -R
 | |
|              -fruntime -r
 | |
|             --size -s
 | |
|             --thread -t
 | |
|             --threaded -T
 | |
|           )
 | |
|           args=(
 | |
|             '1:subsystem:(sched syscall mem numa futex epoll internals all)'
 | |
|             '*:: :->args'
 | |
|           )
 | |
|           full+=(
 | |
|             --group '=[specify number of groups]:groups'
 | |
|             --nr_loops '=[specify number of loops to run]:loops [100]'
 | |
|             --pipe '[use pipe() instead of socketpair()]'
 | |
|             --runtime '=[specify runtime]:runtime (seconds)'
 | |
|             --thread '[be multi thread instead of multi process]'
 | |
|             --threads '=[specify number of threads]:threads'
 | |
|             --loop '=[specify number of loops]:loops'
 | |
|             --iterations '=[number of iterations used to compute average]:iterarions'
 | |
|             --threaded '[specify threads/process based task setup]'
 | |
|             --size '=[specify size of memory buffers]: :_numbers -d 1MB size B KB MB GB TB'
 | |
|           )
 | |
|         ;;
 | |
|         bench-sched) args=( '1:suite:(all messaging pipe)' '*:: :->args' ) ;;
 | |
|         bench-numa) args=( '1:suite:(all mem)' '*:: :->args' ) ;;
 | |
|         bench-mem) args=( '1:suite:(all memcpy memset find_bit)' '*:: :->args' ) ;;
 | |
|         bench-futex)
 | |
|           args=( '1:suite:(all hash wake wake-parallel requeue lock-pi)' '*:: :->args' )
 | |
|         ;;
 | |
|         bench-epoll) args=( '1:suite:(all wait ctl)' '*:: :->args' ) ;;
 | |
|         bench-internals) args=( '1:suite:(all synthesize kallsyms-parse inject-build-id)' '*:: :->args' ) ;;
 | |
|         bench-syscall) args=( '1:suite:(all basic)' '*:: :->args' ) ;;
 | |
| 
 | |
|         buildid-cache)
 | |
|           full+=(
 | |
|             --add '=[add specified file to the cache]:file:_files'
 | |
|             --debuginfod '=[specify debuginfod URL to be used when retrieving perf.data binaries]:url:_urls'
 | |
|             --missing '=[list missing build ids in the cache for the specified]:file:_files'
 | |
|             --purge '=[purge all cached binaries including older caches which have specified path from the cache]:path:_files'
 | |
|             --purge-all '[purge all cached binaries - flush out entire cache]'
 | |
|             --remove '=[remove a cached binary which has same build-id of specified file from the cache]:file:_files'
 | |
|             --update '=[update specified file of the cache]:file:_files'
 | |
|           )
 | |
|           short+=(
 | |
|             --kcore -k
 | |
|             --missing -M
 | |
|             --purge -p
 | |
|             --purge-all -P
 | |
|             --remove -r
 | |
|             --update -u
 | |
|           )
 | |
|         ;;
 | |
|         c2c)
 | |
|           args+=( '1:commands:(record report)' '*:: :->args' )
 | |
|         ;;
 | |
|         daemon)
 | |
|           full+=(
 | |
|             --base '=[specify base directory]:base directory:_directories'
 | |
|             --config '=[specify config file path]:config file:_files'
 | |
|             --foreground "[don't put process in background]"
 | |
|             --session '=[apply to specific session]:session'
 | |
|           )
 | |
|           short[--foreground]=-f
 | |
|           args=( '1:action:(start stop signal ping)' '*:: :->args' )
 | |
|         ;;
 | |
|         (kvm-|)buildid-list)
 | |
|           short[--kernel]=-k
 | |
|         ;;
 | |
|         config)
 | |
|           full[--list]='[show current config variables]'
 | |
|         ;;
 | |
|         data)
 | |
|           full+=(
 | |
|             --all '[convert all events]'
 | |
|             --to-json '=[convert to JSON format]:output file:_files'
 | |
|             --to-ctf '=[convert to CTF format]:output file:_files'
 | |
|             --tod '[convert time to wall clock time]'
 | |
|           )
 | |
|           exclude+=(
 | |
|             --to-ctf '(--to-json)'
 | |
|             --to-json '(--to-ctf)'
 | |
|           )
 | |
|         ;;
 | |
|         (kvm-|)diff)
 | |
|           short+=(
 | |
|             --baseline-only -b
 | |
|             --compute -c
 | |
|             --comms -C
 | |
|             --field-separator -t
 | |
|             --formula -F
 | |
|             --order -o
 | |
|             --period -p
 | |
|           )
 | |
|           full+=(
 | |
|             --period '[show period values]'
 | |
|           )
 | |
|           unset 'short[--pid]'
 | |
|           unset 'short[--tid]'
 | |
|           sortkeys=( pid comm dso symbol cpu parent srcline )
 | |
|         ;;
 | |
|         evlist)
 | |
|           short+=( --group -g )
 | |
|         ;;
 | |
|         ftrace)
 | |
|           short+=(
 | |
|             --nograph-funcs -g
 | |
|             --graph-funcs -G
 | |
|             --buffer-size -m
 | |
|             --notrace-funcs -N
 | |
|             --trace-funcs -T
 | |
|             --tracer -t
 | |
|           )
 | |
|           unset 'short[--tid]'
 | |
|         ;;
 | |
|         help*)
 | |
|           short+=( -a --all -i --info -m --man -w --web )
 | |
|         ;;
 | |
|         inject)
 | |
|           short+=( --jit -j --build-ids -b --sched-stat -s )
 | |
|         ;;
 | |
|         kmem)
 | |
|           full+=(
 | |
|             --alloc '[show per-allocation statistics]'
 | |
|             --caller '[show per-callsite statistics]'
 | |
|             --raw-ip '[show raw ip instead of symbol]'
 | |
|             --line '=[show specified number of lines]:lines'
 | |
|             --live '[show live page stat]'
 | |
|             --slab '[analyze SLAB allocator events]'
 | |
|             --page '[analyze page allocator events]'
 | |
|           )
 | |
|           short[--line]=-l
 | |
|           sortkeys=(
 | |
|             ptr callsite bytes hit pingpong frag
 | |
|             page order migtype gfp
 | |
|           )
 | |
|         ;;
 | |
|         list)
 | |
|           short+=( --desc -d --long-desc -v )
 | |
|           full+=(
 | |
|             --desc '[print extra event descriptions]'
 | |
|             --details '[print information on the perf event names and expressions used internally by events]'
 | |
|             --long-desc '[print longer event descriptions]'
 | |
|           )
 | |
|           args=( '*::events:->event-types' )
 | |
|         ;;
 | |
|         lock-info)
 | |
|           short[--map]=-m
 | |
|           short[--threads]=-t
 | |
|           full+=(
 | |
|             --map '[dump map of lock instances (address:name table)]'
 | |
|             --threads '[dump thread list in perf.data]'
 | |
|           )
 | |
|         ;;
 | |
|         lock-report)
 | |
|           full[--key]='=[specify sort key]:key [acquired]:(acquired contended avg_wait wait_total wait_max wait_min)'
 | |
|         ;;
 | |
|         mem)
 | |
|           short[--phys-data]=-p
 | |
|           short[--type]=-t
 | |
|           short[--dump-raw-samples]=-D
 | |
|           full[--type]='=[select the memory operation type]:type:(load store)'
 | |
|           full[--dump-raw-samples]='[dump raw samples in ASCII]'
 | |
|         ;;
 | |
|         probe)
 | |
|           full+=(
 | |
|             --add '=[probe point definition]:probe'
 | |
|             --del '=[delete a probe event]:probe event'
 | |
|             --filter '=[set a filter]:filter'
 | |
|             --line '[show source code lines which can be probed]'
 | |
|             --max-probes '=[set how many probe points can be found for a probe]:probes'
 | |
|             --module '=[specify target module name or path]:module name or path:_directories'
 | |
|             --range '[show variables location range in scope]'
 | |
|             --source '=[specify path to kernel source]:path:_directories'
 | |
|           )
 | |
|           short+=(
 | |
|             --definition -D
 | |
|             --del -d
 | |
|             --exec -x
 | |
|             --line -L
 | |
|             --module -m
 | |
|             --dry-run -n
 | |
|             --source -s
 | |
|             --vars -V
 | |
|           )
 | |
|           unset 'exclude[--source]'
 | |
|           unset 'short[--list]'
 | |
|         ;;
 | |
|         timechart-record)
 | |
|           short+=( --io-only -I --callchain -g )
 | |
|           full+=(
 | |
|             --callchain '[record callchain]'
 | |
|             --io-only '[record only IO data]'
 | |
|           )
 | |
|         ;;
 | |
|         *record)
 | |
|           short+=(
 | |
|             --data -d
 | |
|             --clockid -k
 | |
|             --no-samples -n
 | |
|             --no-buildid -B
 | |
|             --no-buildid-cache -N
 | |
|             --period -P
 | |
|             --stat -s
 | |
|           )
 | |
|           full+=(
 | |
|             --overwrite '[use overwrite mode]'
 | |
|             --period '[record the sample period]'
 | |
|             --timestamp '[record the sample timestamps]'
 | |
|             --transaction '[sample transaction flags (special events only)]'
 | |
|           )
 | |
|         ;;
 | |
|         (c2c-|kvm-|)report)
 | |
|           short+=(
 | |
|             --branch-stack -b
 | |
|             --comms -c
 | |
|             --inverted -G
 | |
|             --call-graph -g
 | |
|             --parent -p
 | |
|             --threads -T
 | |
|             --field-separator -t
 | |
|             --exclude-other -x
 | |
|           )
 | |
|           full+=(
 | |
|             --threads '[show per-thread event counters]'
 | |
|           )
 | |
|           unset 'short[--pid]'
 | |
|           unset 'short[--tid]'
 | |
|           sortkeys=(
 | |
|             pid comm dso symbol parent cpu socket srcline weight local_weight cgroup_id
 | |
|           )
 | |
|           fields=(
 | |
| 	    overhead period sample overhead overhead_sys overhead_us
 | |
| 	    overhead_guest_sys overhead_guest_us overhead_children
 | |
| 	    sample period pid comm dso symbol parent cpu socket
 | |
| 	    srcline srcfile local_weight weight transaction trace
 | |
| 	    symbol_size dso_size cgroup cgroup_id ipc_null time
 | |
| 	    code_page_size local_ins_lat ins_lat p_stage_cyc dso_from
 | |
| 	    dso_to symbol_from symbol_to mispredict abort in_tx
 | |
| 	    cycles srcline_from srcline_to ipc_lbr symbol_daddr
 | |
| 	    dso_daddr locked tlb mem snoop dcacheline symbol_iaddr
 | |
| 	    phys_daddr data_page_size blocked
 | |
|           )
 | |
|         ;;
 | |
|         sched-latency)
 | |
|           short+=(
 | |
|             --CPU -C
 | |
|             --pids -p
 | |
|           )
 | |
|           full+=(
 | |
|             --pids '[latency stats per pid instead of per comm]'
 | |
|             --CPU '=[specify CPU to profile on]:cpu'
 | |
|           )
 | |
|         ;;
 | |
|         sched-timehist)
 | |
|           short+=(
 | |
|             --idle-hist -I
 | |
|             --migrations -M
 | |
|             --next -n
 | |
|             --cpu-visual -V
 | |
|             --wakeups -w
 | |
|           )
 | |
|           full+=(
 | |
|             --cpu-visual '[add CPU visual]'
 | |
|             --idle-hist '[show idle events only]'
 | |
|             --migrations '[show migration events]'
 | |
|             --next '[show next task]'
 | |
|             --state '[show task state when sched-out]'
 | |
|             --wakeups '[show wakeup events]'
 | |
|           )
 | |
|         ;;
 | |
|         (*-|)script)
 | |
|           short+=( --comms -c --gen-script -g --Latency -L --debug-mode -d )
 | |
|           full+=(
 | |
|             --debug-mode '[do various checks like samples ordering and lost events]'
 | |
|             --gen-script '=[generate perf-script.xx script in specified language]:language'
 | |
|             --script '=[specify script file name]:script file name:_files'
 | |
|           )
 | |
|           unset 'short[--pid]'
 | |
|           unset 'short[--dsos]'
 | |
|           unset 'short[--tid]'
 | |
|           fields=(
 | |
| 	    comm tid pid time cpu event trace ip sym dso addr symoff
 | |
| 	    srcline period iregs uregs brstack brstacksym flags
 | |
| 	    bpf-output brstackinsn brstackoff callindent insn insnlen
 | |
| 	    synth phys_addr metric misc ipc tod data_page_size
 | |
| 	    code_page_size
 | |
|           )
 | |
|         ;;
 | |
|         *stat*)
 | |
|           full+=(
 | |
|             --big-num "[print large numbers with thousands' separators]"
 | |
|             --delay '=[wait after starting program]:delay (msecs)'
 | |
|             --key '=[specify key for sorting]:key:(sample time)'
 | |
|             --no-aggr '[disable CPU count aggregation]'
 | |
|             --transaction '[hardware transaction statistics]'
 | |
|           )
 | |
|           short+=(
 | |
|             --no-aggr -A
 | |
|             --big-num -B
 | |
|             --detailed -d
 | |
|             --group -g
 | |
|             --interval-print -I
 | |
|             --metrics -M
 | |
|             --null -n
 | |
|             --sync -S
 | |
|             --transaction -T
 | |
|           )
 | |
|           exclude+=(
 | |
|             --log-fd '(-o --output)'
 | |
|             --output '(--log-fd)'
 | |
|           )
 | |
|           unset 'short[--quiet]'
 | |
|         ;;
 | |
|         test*)
 | |
|           short+=( --dont-fork -F --skip -s )
 | |
|           full+=(
 | |
|             --dont-fork "[don't fork for testcase]"
 | |
|             --skip '=[specify tests to skip]:test'
 | |
|           )
 | |
|         ;;
 | |
|         timechart)
 | |
|           short+=( --width -w --topology -t --proc-num -n --process -p )
 | |
|           full+=(
 | |
|             --highlight '=[highlight tasks that outlast duration or with given name]:duration or name'
 | |
|             --io-skip-eagain "[don't draw EAGAIN IO events]"
 | |
|             --io-min-time '=[all IO faster than minimum time will visually appear longer]: :_numbers -u ns -d 1ms time ms us'
 | |
|             --io-merge-dist '=[merge events that are within specified time]: :_numbers -u ns -d 1us time ms us'
 | |
|             --process '=[select process]:process:_pids'
 | |
|             --proc-num '=[specify minimum number of tasks to print]:tasks'
 | |
|             --topology '[sort CPUs according to topology]'
 | |
|             --width '=[specify page width]:page width'
 | |
|           )
 | |
|         ;;
 | |
|         (kvm-|)top)
 | |
|           full+=(
 | |
|             --delay '=[specify delay between refreshes]:delay (seconds)'
 | |
|             --comms '=[only consider symbols in specified comms]:comm'
 | |
|             --dsos '=[only consider symbols in these dsos]:dso'
 | |
|             --overwrite '[use a backward ring buffer]'
 | |
|           )
 | |
|           short+=(
 | |
|             --count-filter -f
 | |
|             --delay -d
 | |
|             --dump-symtab -D
 | |
|             --entries -E
 | |
|           )
 | |
|           unset 'short[--dsos]'
 | |
|           unset 'short[--fields]'
 | |
|           unset 'short[--force]'
 | |
|           unset 'short[--symbols]'
 | |
|           sortkeys=(
 | |
|             pid comm dso symbol parent srcline weight local_weight
 | |
|             abort in_tx transaction overhead sample period
 | |
|           )
 | |
|           fields=( overhead period sample $sortkeys )
 | |
|         ;;
 | |
|         trace)
 | |
|           short+=(
 | |
|             --pf -F
 | |
|             --summary -s
 | |
|             --time -T
 | |
|           )
 | |
|           full+=(
 | |
|             --pf '=[trace pagefaults]::type [maj]:(all min maj)'
 | |
|             --time '[show full timestamp, not relative]'
 | |
|           )
 | |
|           unset 'short[--no-inherit]'
 | |
|         ;;
 | |
|       esac
 | |
|       if (( !skip )); then
 | |
|         subcmds=( $(_call_program commands "$cmd --list-cmds|grep -v -e '^#' -e Unknown") )
 | |
|         opts=( $(_call_program options "$cmd --list-opts|grep -v -e '^#' -e Unknown") )
 | |
|       fi
 | |
| 
 | |
|       for (( i = $#opts; i; i-- )); do
 | |
|         opts[i]=(
 | |
|           ${exclude[$opts[i]]}${opts[i]}${full[$opts[i]]}
 | |
|           ${short[$opts[i]]:+${exclude[$opts[i]]}${short[$opts[i]]}${full[$opts[i]]/(#s)=/+}}
 | |
|         )
 | |
|       done
 | |
|       (( $#subcmds)) && opts+=(
 | |
|         "${ign}(- *)--list-cmds[list available subcommands]" \
 | |
|         '1: :->subsubcmds'
 | |
|         '*:: :->args'
 | |
|       )
 | |
|       (( $#opts )) && opts+=(
 | |
|         "${ign}(- *)--help[display help information]"
 | |
|         "${ign}(- *)--list-opts[list available options]"
 | |
|       )
 | |
|       _arguments -C $opts $args \
 | |
|         "${ign}(- *)-h[display brief usage summary]"
 | |
|     ;;
 | |
|     event-types)
 | |
|       _wanted event-types expl 'event type' compadd - hw sw cache pmu tracepoint event_glob
 | |
|     ;&
 | |
|     events)
 | |
|       _wanted events expl event compadd - \
 | |
|         ${${=${${(f)"$(_call_program events perf list hw sw cache pmu tracepoint event_glob)"}[2,-5]#  }%% [ \[]*}:#OR}
 | |
|     ;;
 | |
|     itrace-opts)
 | |
|       _values -s '' "itrace option [ibxwpe]" \
 | |
|         'i[synthesize instructions events]' \
 | |
|         'b[synthesize branches events (branch misses for Arm SPE)]' \
 | |
|         'c[synthesize branches events (calls only)]' \
 | |
|         'r[synthesize branches events (returns only)]' \
 | |
|         'x[synthesize transactions events]' \
 | |
|         'w[synthesize ptwrite events]' \
 | |
|         'p[synthesize power events (incl. PSB events for Intel PT)]' \
 | |
|         'o[synthesize other events recorded due to the use of aux-output]' \
 | |
|         'e[synthesize error events]' \
 | |
|         'd[create a debug log]' \
 | |
|         'f[synthesize first level cache events]' \
 | |
|         'm[synthesize last level cache events]' \
 | |
|         'M[synthesize memory events]' \
 | |
|         't[synthesize TLB events]' \
 | |
|         'a[synthesize remote access events]' \
 | |
|         'g[synthesize a call chain (use with i or x)]' \
 | |
|         'G[synthesize a call chain on existing event records]' \
 | |
|         'l[synthesize last branch entries (use with i or x)]' \
 | |
|         'L[synthesize last branch entries on existing event records]' \
 | |
|         's[skip initial number of events]' \
 | |
|         'q[quicker (less detailed) decoding]' \
 | |
|         'Z[prefer to ignore timestamps (so-called "timeless" decoding)]'
 | |
|     ;;
 | |
|     fields)
 | |
|       _sequence _wanted fields expl 'field' compadd - -a fields
 | |
|     ;;
 | |
|     sort-keys)
 | |
|       _sequence _wanted sort-keys expl 'sort key' compadd - -a sortkeys
 | |
|     ;;
 | |
|   esac
 | |
| done
 | |
| 
 | |
| [[ nm -ne compstate[nmatches] ]]
 |