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_648h  0x100001072
  var_650h  0x100001617,0x100001691
  var_65ch  0x100001784
  var_658h  0x10000173c,0x100001807,0x10000181c
  var_654h  0x100001736,0x1000017dd,0x1000017f2
  var_660h  0x1000017d4
  var_668h  0x1000018f1
  var_66ch  0x10000190b
  var_678h  0x100001911
   var_3ch  0x10000179e
  var_448h  0x1000015f8
   var_38h  0x1000010d6
   var_36h  0x1000010f0
afvW
      argv
      argc
  var_648h
  var_650h  0x100001079
  var_65ch  0x100001137,0x100001315
  var_658h  0x10000114c,0x1000014f2
  var_654h  0x100001156,0x1000012d8
  var_660h  0x100001160,0x1000014ce
  var_668h  0x100001597
  var_66ch  0x1000015a3
  var_678h  0x1000015ad
   var_3ch
  var_448h
   var_38h
   var_36h
* var_648h
R 0x100001072  lea rax, [var_648h]
* var_650h
R 0x100001617  lea rbx, [var_650h]
R 0x100001691  lea rsi, [var_650h]
W 0x100001079  mov qword [var_650h], rax
* var_65ch
R 0x100001784  cmp dword [var_65ch], 0
W 0x100001137  mov dword [var_65ch], 0
W 0x100001315  mov dword [var_65ch], 1
* var_658h
R 0x10000173c  or ebx, dword [var_658h]
R 0x100001807  cmp dword [var_658h], 0
R 0x10000181c  cmp dword [var_658h], 0
W 0x10000114c  mov dword [var_658h], 0
W 0x1000014f2  mov dword [var_658h], 1
* var_654h
R 0x100001736  mov ebx, dword [var_654h]
R 0x1000017dd  cmp dword [var_654h], 0
R 0x1000017f2  cmp dword [var_654h], 0
W 0x100001156  mov dword [var_654h], 0
W 0x1000012d8  mov dword [var_654h], 1
* var_660h
R 0x1000017d4  cmp dword [var_660h], 0
W 0x100001160  mov dword [var_660h], 0
W 0x1000014ce  mov dword [var_660h], 1
* var_668h
R 0x1000018f1  mov rax, qword [var_668h]
W 0x100001597  mov qword [var_668h], rcx
* var_66ch
R 0x10000190b  mov edi, dword [var_66ch]
W 0x1000015a3  mov dword [var_66ch], eax
* var_678h
R 0x100001911  mov rsi, qword [var_678h]
W 0x1000015ad  mov qword [var_678h], rax
* var_3ch
R 0x10000179e  lea rdi, [var_3ch]
* var_448h
R 0x1000015f8  lea rdi, [var_448h]
* var_38h
R 0x1000010d6  lea rdx, [var_38h]
* var_36h
R 0x1000010f0  movzx eax, word [var_36h]
* argv
R 0x10000106c  mov rbx, rsi
* argc
R 0x10000106f  mov r14d, edi
EOF
RUN

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

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

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

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

NAME=Detect register args used only by callee
FILE==
CMDS=<<EOF
e asm.bytes=true
e asm.arch=x86
e asm.bits=64
e analysis.cc=ms
wx 40534883ec20418bd8e80a00000003c34883c4205bc3cccc2bca8bc1c3
aa
pd 13
EOF
EXPECT=<<EOF
/ 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
/ 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 const char * s @ rcx
arg int64_t arg2 @ rdx
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_8h @ stack + 0x8
var int64_t var_10h @ stack + 0x10
var int64_t var_18h @ stack + 0x18
var int64_t var_20h @ stack + 0x20
EOF
RUN

NAME=Variable access with misc registers (x86)
FILE==
ARGS=-a x86 -b 64
CMDS=<<EOF
e asm.flags=false
e asm.bytes=true
e analysis.cc=ms
wx 488bc448895808488970104889781841574881ecb00000008364242000488d48884c8d9c24b0000000498b5b10498b7318498b7b20498be3415fc3
af
aaef
afvx
pdf
EOF
EXPECT=<<EOF
afvR
   var_98h  0x18
    var_8h  0x21
    var_0h
   var_s8h  0x29
  var_s10h  0x2d
  var_s18h  0x31
   var_78h
afvW
   var_98h  0x18
    var_8h
    var_0h
   var_s8h  0x3
  var_s10h  0x7
  var_s18h  0xb
   var_78h
/ fcn.00000000 ();
|           ; var int64_t var_98h @ stack - 0x98
|           ; var int64_t var_78h @ stack - 0x78
|           ; var int64_t var_8h @ stack - 0x8
|           ; var int64_t var_0h @ stack + 0x0
|           ; var int64_t var_s8h @ stack + 0x8
|           ; var int64_t var_s10h @ stack + 0x10
|           ; var int64_t var_s18h @ stack + 0x18
|           0x00000000      488bc4         mov   rax, rsp
|           0x00000003      48895808       mov   qword [var_s8h], rbx
|           0x00000007      48897010       mov   qword [var_s10h], rsi
|           0x0000000b      48897818       mov   qword [var_s18h], rdi
|           0x0000000f      4157           push  r15
|           0x00000011      4881ecb00000.  sub   rsp, 0xb0
|           0x00000018      8364242000     and   dword [var_98h], 0
|           0x0000001d      488d4888       lea   rcx, [var_78h]
|           0x00000021      4c8d9c24b000.  lea   r11, [var_8h]
|           0x00000029      498b5b10       mov   rbx, qword [var_s8h]
|           0x0000002d      498b7318       mov   rsi, qword [var_s10h]
|           0x00000031      498b7b20       mov   rdi, qword [var_s18h]
|           0x00000035      498be3         mov   rsp, r11
|           0x00000038      415f           pop   r15
\           0x0000003a      c3             ret
EOF
RUN


NAME=Variable access with misc registers (ARM)
FILE==
ARGS=-a arm -b 16
CMDS=<<EOF
e asm.bytes=true
e asm.flags=false
e asm.comments=false
wx 80b483b000af78600b467b8013467b707b78002b03d07a887b689a6103e07b881a047b689a6100bf0c37bd465df8047b7047
af
aaef
afvx
pdf
EOF
EXPECT=<<EOF
afvR
      arg1  0x6
      arg2  0x8
      arg3  0xc
   var_10h  0x4,0x2c
    var_ch  0x18,0x22
    var_eh  0x16,0x1e
    var_fh  0x10
    var_4h  0x2c
afvW
      arg1
      arg2
      arg3
   var_10h
    var_ch  0x6
    var_eh  0xa
    var_fh  0xe
    var_4h
/ fcn.00000000 (int16_t arg1, int16_t arg2, int16_t arg3);
|           ; arg int16_t arg1 @ r0
|           ; arg int16_t arg2 @ r1
|           ; arg int16_t arg3 @ r2
|           ; var int16_t var_10h @ stack - 0x10
|           ; var int8_t var_fh @ stack - 0xf
|           ; var int16_t var_eh @ stack - 0xe
|           ; var int32_t var_ch @ stack - 0xc
|           ; var int16_t var_4h @ stack - 0x4
|           0x00000000      80b4           push  {r7}
|           0x00000002      83b0           sub   sp, 0xc
|           0x00000004      00af           add   r7, var_10h
|           0x00000006      7860           str   r0, [var_ch]
|           0x00000008      0b46           mov   r3, r1
|           0x0000000a      7b80           strh  r3, [var_eh]
|           0x0000000c      1346           mov   r3, r2
|           0x0000000e      7b70           strb  r3, [var_fh]
|           0x00000010      7b78           ldrb  r3, [var_fh]
|           0x00000012      002b           cmp   r3, 0
|       ,=< 0x00000014      03d0           beq   0x1e
|       |   0x00000016      7a88           ldrh  r2, [var_eh]
|       |   0x00000018      7b68           ldr   r3, [var_ch]
|       |   0x0000001a      9a61           str   r2, [r3, 0x18]
|      ,==< 0x0000001c      03e0           b     0x26
|      |`-> 0x0000001e      7b88           ldrh  r3, [var_eh]
|      |    0x00000020      1a04           lsls  r2, r3, 0x10
|      |    0x00000022      7b68           ldr   r3, [var_ch]
|      |    0x00000024      9a61           str   r2, [r3, 0x18]
|      `--> 0x00000026      00bf           nop
|           0x00000028      0c37           adds  r7, 0xc
|           0x0000002a      bd46           mov   sp, r7
|           0x0000002c      5df8047b       ldr   r7, [sp], 4
\           0x00000030      7047           bx    lr
EOF
RUN

NAME=Takeover variables
FILE==
ARGS=-a x86 -b 32
CMDS=<<EOF
wx e805000000e80600000039d1742577145589e583ec048b5d088b4d0c895dfc83f90174098b45fc8945fc49ebf28b45fc89ec5dc3
aac
afv  @ 10
afvx @ 10
afv  @ 16
afvx @ 16
EOF
EXPECT=<<EOF
afvR
afvW
var int32_t var_8h @ stack - 0x4
arg int32_t var_4h @ stack + 0x0
arg int32_t arg_4h @ stack + 0x8
arg int32_t arg_8h @ stack + 0xc
afvR
    arg_4h  0x16
    arg_8h  0x19
    var_4h  0x24,0x2d
    var_8h
afvW
    arg_4h
    arg_8h
    var_4h  0x27
    var_8h  0x1c
EOF
RUN

NAME=Analyze function with 0 basic blocks
FILE=bins/elf/ls
CMDS=<<EOF
af+ a @ 0
aa
EOF
EXPECT=
RUN

NAME=Analyze vars accessed from bp (x86)
FILE=bins/elf/vars-x86_64-bp
CMDS=<<EOF
s sym.varfunc
af
afv
EOF
EXPECT=<<EOF
var int64_t var_18h @ stack - 0x18
var int64_t var_14h @ stack - 0x14
var int64_t var_10h @ stack - 0x10
var int64_t var_ch @ stack - 0xc
EOF
RUN

NAME=Vars from dwarf accessed from bp (x86)
FILE=bins/elf/vars-x86_64-bp
CMDS=<<EOF
aaa
s sym.varfunc
e asm.comments=0
pdf
EOF
EXPECT=<<EOF
            ;-- varfunc:
/ dbg.varfunc ();
|           ; var int lightbulb @ stack - 0x18
|           ; var int sun @ stack - 0x14
|           ; var int last @ stack - 0x10
|           ; var int chance @ stack - 0xc
|           0x0000113c      push  rbp
|           0x0000113d      mov   rbp, rsp
|           0x00001140      sub   rsp, 0x10
|           0x00001144      mov   dword [lightbulb], 1
|           0x0000114b      mov   dword [sun], 2
|           0x00001152      mov   dword [last], 3
|           0x00001159      mov   dword [chance], 4
|           0x00001160      mov   eax, 0
|           0x00001165      call  dbg.leaffunc
|           0x0000116a      mov   eax, dword [chance]
|           0x0000116d      mov   dword [sun], eax
|           0x00001170      mov   eax, dword [lightbulb]
|           0x00001173      leave
\           0x00001174      ret
EOF
RUN

NAME=Analyze vars accessed from sp (x86)
FILE=bins/elf/vars-x86_64-sp
CMDS=<<EOF
s sym.varfunc
af
afv
EOF
EXPECT=<<EOF
var int64_t var_10h @ stack - 0x10
var int64_t var_ch @ stack - 0xc
var int64_t var_8h @ stack - 0x8
var int64_t var_4h @ stack - 0x4
EOF
RUN

NAME=Vars from dwarf accessed from sp (x86)
FILE=bins/elf/vars-x86_64-sp
CMDS=<<EOF
aaa
s sym.varfunc
e asm.comments=0
pdf
EOF
EXPECT=<<EOF
            ;-- varfunc:
/ dbg.varfunc ();
|           ; var int lightbulb @ stack - 0x10
|           ; var int sun @ stack - 0xc
|           ; var int last @ stack - 0x8
|           ; var int chance @ stack - 0x4
|           0x00001137      sub   rsp, 0x10
|           0x0000113b      mov   dword [rsp], 1
|           0x00001142      mov   dword [sun], 2
|           0x0000114a      mov   dword [last], 3
|           0x00001152      mov   dword [chance], 4
|           0x0000115a      mov   eax, 0
|           0x0000115f      call  dbg.leaffunc
|           0x00001164      mov   eax, dword [chance]
|           0x00001168      mov   dword [sun], eax
|           0x0000116c      mov   eax, dword [rsp]
|           0x0000116f      add   rsp, 0x10
\           0x00001173      ret
EOF
RUN
