#compdef otool llvm-otool
#
local opts args files variant curcontext=$context state state_descr line
typeset -A opt_args

_arguments \
  '-a[display the archive header]' \
  '-S[display the contents of the __.SYMDEF file]' \
  '-f[display the universal headers]' \
  '-h[display the Mach header]' \
  '-l[display the load commands]' \
  '-L[display names and versions of shared libs that the object file uses]' \
  '-D[display just the internal name of shared lib]' \
  '-s[display the contents of the specified section]:segment name: :section name: ' \
  '-t[display the contents of (__TEXT,__text) section]' \
  '-d[display the contents of (__DATA,__data) section]' \
  '-o[display the contents of __OBJC segment]' \
  '-r[display the relocation entries]' \
  '-c[display the argument strings from a core file]' \
  '-I[display the indirect symbol table]' \
  '-T[display the table of contents for a dynamic shared library]' \
  '-R[display the reference table of a dynamic shared library]' \
  '-M[display the module table of dymamic shared library]' \
  '-H[display the two-level namespace hints table]' \
  '-G[display the data in code table]' \
  '-C[display the linker optimization hints]' \
  '-P[print the info_plist section as strings]' \
  '-p[with -t and -v/V: start disassembly from the specified symbol]:symbol name: ' \
  '-v[display verbosely (symbolically) when possible]' \
  '-V[display disassembled operands symbolically]' \
  "-X[don't print leading addresses/headers with disassembly]" \
  '-q[use the llvm disassembler (default)]' \
  '-mcpu=[use the specified cpu for the llvm disassembler]:target:->targets' \
  '-function_offsets[with disassembly, print decimal offset from the last label]' \
  '-j[with disassembly, print opcode bytes]' \
  "-Q[use otool's disassembler]" \
  '-arch[select the specified architecture from a universal file]:arch:(i386 x86_64)' \
  '-m[object file names are not assuemd to be in archive(member) syntax]' \
  '(- *)--version[print version of otool]' \
  '*:file:_object_files' && return 0

case $state in
  targets)
    _values "target architecture" "${(z)${(@)${(f)$(_call_program targets
      ${~words[1]} --version 2>/dev/null)##*Registered Targets:}/ -*}}"
  ;;
esac
