NAME=afvx
FILE=bins/elf/ls.odd
CMDS=<<EOF
af
afvx
afv=
EOF
EXPECT=<<EOF
afvR
      arg3  0x5312
afvW
      arg3
* arg3
R 0x5312  mov r9, rdx
EOF
RUN

NAME=afvx2
FILE=bins/mach0/mac-ls
CMDS=<<EOF
af
afvx
afv=
EOF
EXPECT=<<EOF
afvR
      argv  0x10000106c
      argc  0x10000106f
  var_640h  0x100001072
  var_648h  0x100001617,0x100001691
  var_654h  0x100001784
  var_650h  0x10000173c,0x100001807,0x10000181c
  var_64ch  0x100001736,0x1000017dd,0x1000017f2
  var_658h  0x1000017d4
  var_660h  0x1000018f1
  var_664h  0x10000190b
  var_670h  0x100001911
   var_34h  0x10000179e
  var_440h  0x1000015f8
   var_30h  0x1000010d6
   var_2eh  0x1000010f0
afvW
      argv
      argc
  var_640h
  var_648h  0x100001079
  var_654h  0x100001137,0x100001315
  var_650h  0x10000114c,0x1000014f2
  var_64ch  0x100001156,0x1000012d8
  var_658h  0x100001160,0x1000014ce
  var_660h  0x100001597
  var_664h  0x1000015a3
  var_670h  0x1000015ad
   var_34h
  var_440h
   var_30h
   var_2eh
* argv
R 0x10000106c  mov rbx, rsi
* argc
R 0x10000106f  mov r14d, edi
* var_640h
R 0x100001072  lea rax, [var_640h]
* var_648h
R 0x100001617  lea rbx, [var_648h]
R 0x100001691  lea rsi, [var_648h]
W 0x100001079  mov qword [var_648h], rax
* var_654h
R 0x100001784  cmp dword [var_654h], 0
W 0x100001137  mov dword [var_654h], 0
W 0x100001315  mov dword [var_654h], 1
* var_650h
R 0x10000173c  or ebx, dword [var_650h]
R 0x100001807  cmp dword [var_650h], 0
R 0x10000181c  cmp dword [var_650h], 0
W 0x10000114c  mov dword [var_650h], 0
W 0x1000014f2  mov dword [var_650h], 1
* var_64ch
R 0x100001736  mov ebx, dword [var_64ch]
R 0x1000017dd  cmp dword [var_64ch], 0
R 0x1000017f2  cmp dword [var_64ch], 0
W 0x100001156  mov dword [var_64ch], 0
W 0x1000012d8  mov dword [var_64ch], 1
* var_658h
R 0x1000017d4  cmp dword [var_658h], 0
W 0x100001160  mov dword [var_658h], 0
W 0x1000014ce  mov dword [var_658h], 1
* var_660h
R 0x1000018f1  mov rax, qword [var_660h]
W 0x100001597  mov qword [var_660h], rcx
* var_664h
R 0x10000190b  mov edi, dword [var_664h]
W 0x1000015a3  mov dword [var_664h], eax
* var_670h
R 0x100001911  mov rsi, qword [var_670h]
W 0x1000015ad  mov qword [var_670h], rax
* var_34h
R 0x10000179e  lea rdi, [var_34h]
* var_440h
R 0x1000015f8  lea rdi, [var_440h]
* var_30h
R 0x1000010d6  lea rdx, [var_30h]
* var_2eh
R 0x1000010f0  movzx eax, word [var_2eh]
EOF
RUN

NAME=Detect register args used only by callee
FILE=-
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
afc=ms
wx 40534883ec20418bd8e80a00000003c34883c4205bc3cccc2bca8bc1c3
aa
pd 13
EOF
EXPECT=<<EOF
/ 22: fcn.00000000 (int64_t arg1, int64_t arg2, int64_t arg3);
|           ; arg int64_t arg1 @ rcx
|           ; arg int64_t arg2 @ rdx
|           ; arg int64_t arg3 @ r8
|           0x00000000      4053           push rbx
|           0x00000002      4883ec20       sub rsp, 0x20
|           0x00000006      418bd8         mov ebx, r8d                ; arg3
|           0x00000009      e80a000000     call fcn.00000018
|           0x0000000e      03c3           add eax, ebx
|           0x00000010      4883c420       add rsp, 0x20
|           0x00000014      5b             pop rbx
\           0x00000015      c3             ret
            0x00000016      cc             int3
            0x00000017      cc             int3
            ; CALL XREF from fcn.00000000 @ 0x9
/ 5: fcn.00000018 (int64_t arg1, int64_t arg2);
|           ; arg int64_t arg1 @ rcx
|           ; arg int64_t arg2 @ rdx
|           0x00000018      2bca           sub ecx, edx                ; arg2
|           0x0000001a      8bc1           mov eax, ecx                ; arg1
\           0x0000001c      c3             ret
EOF
RUN

NAME=Detect register args type used only by callees
FILE=bins/pe/rarg_detection.dll
CMDS=<<EOF
s sym.rarg_detection.dll_funcB
af
s sym.rarg_detection.dll_funcC
af
afv
EOF
EXPECT=<<EOF
arg int64_t arg3 @ r8
arg int64_t arg2 @ rdx
arg const char * s @ rcx
EOF
RUN

NAME=Variables in register save stack area
FILE=bins/pe/testx64.exe
CMDS=<<EOF
s 0x14000184c
af
afv
EOF
EXPECT=<<EOF
var int64_t var_20h @ rsp+0x48
var int64_t var_10h @ rbp+0x10
var int64_t var_18h @ rbp+0x18
var int64_t var_bp_20h @ rbp+0x20
EOF
RUN
