#compdef gprof

local curcontext="$curcontext" state line ret=1
typeset -A opt_args

_arguments -C -s -{a,b,c,D,h,i,l,L,s,T,v,w,x,y,z} \
           -{A,C,e,E,f,F,J,n,N,O,p,P,q,Q,Z}:'function name:->funcs' \
	   '-I:directory:_dir_list' \
	   '-d-:debug level:' '-k:function names:->pair' \
	   '-m:minimum execution count:' \
	   ':executable:_files -g \*\(-\*\)' \
	   ':profile file:_files -g gmon.\*\(-.\)' \
	   -- -s '((#s)--[no-] --)' \
           '*=name*:function name:->funcs' \
	   '*=dirs*:directory:_dir_list' && ret=0

if [[ -n "$state" ]]; then
  local cmd pair expl

  _tags functions || return 1

  [[ "$state" = pair ]] && pair=yes

  if [[ $#line -gt 1 ]]; then
    cmd="$line[2]"
  else
    return 1
  fi

  if [[ -n "$cmd" ]]; then
    if [[ "$cmd" = /* ]]; then
      tmp="$cmd"
    else
      tmp="$PWD/$cmd"
    fi

    if [[ "$tmp" != "$_gprof_command" ]]; then
      _gprof_command="$tmp"
      _gprof_funcs=( "${(@)${(@M)${(@f)$(nm $cmd)}:#[^ ]# [tT] ([^_]|_[^_])*}##* }" )
    fi
  
    if [[ -n "$pair" ]]; then
      if compset -P '*/'; then
        expl='call arc to function'
      else
        expl='call arc from function'
      fi
    else
      expl=function
    fi
    _wanted functions expl "$expl" \
        compadd -M 'r:|_=* r:|=*' -a _gprof_funcs && ret=0
  else
    return 1
  fi
fi

return ret
