rizin/test/db/analysis/vars
NOT XVilka 9f34985c21
librz/arch/dwarf: fix range-size underflow when picking a loclist's representative location (#6474)
location_by_biggest_range() computed each location-list entry's PC-range
size as (begin - end). For a normal [begin, end) range (begin < end) this
underflows and wraps to a huge ut64, so the entry with the *smallest* span
was always chosen as a variable's single representative storage instead of
the largest.

This breaks functions whose register arguments and locals are described by
location lists, e.g.

    item:         [low, X): DW_OP_reg0 ; [X, high): DW_OP_reg8
    input_buffer: [low, Y): DW_OP_reg1 ; [Y, high): DW_OP_reg10

with DW_AT_frame_base = DW_OP_call_frame_cfa (.debug_loc + DW_AT_GNU_locviews,
no .debug_loclists). The wrongly-picked short entry is frequently one that
does not resolve to a valid RzAnalysisVarStorage (e.g. an implicit
DW_OP_stack_value piece), leaving the variable with EVAL_PENDING storage. The
affected variables then fail to materialize and 'afv'/'afvl' reports nothing
for the whole function -- even though the arguments live plainly in registers
and need no CFA computation.

Computing the span as (end - begin) selects the genuinely largest range, so
each variable resolves to the register it occupies for most of the function
and the register arguments load correctly.

Co-authored-by: Anton Kochkov <anton.kochkov@gmail.com>
2026-06-10 16:14:28 +08:00

1263 lines
44 KiB
Text

NAME=global variables list
FILE=bins/elf/float_ex1/float_ex1_globals
CMDS=<<EOF
aaa
avglt
EOF
EXPECT=<<EOF
name type size address decl_file decl_line decl_col
--------------------------------------------------------------------------------------------------------------------
bb const float 0x4 0x402010 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 16 13
b const float 0x4 0x402068 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 39 21
aa double 0x8 0x404038 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 17 8
a float 0x4 0x404040 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 38 15
staticsome some_t 0x16 0x404060 /home/xvilka/rizin/rizin-testbins/elf/float_ex1/float_ex1.c 15 15
EOF
RUN
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, qword [var_648h]
* var_650h
R 0x100001617 lea rbx, qword [var_650h]
R 0x100001691 lea rsi, qword [var_650h]
W 0x100001079 mov qword [var_650h], rax
* var_65ch
R 0x100001784 cmp dword [var_65ch], 0x00
W 0x100001137 mov dword [var_65ch], 0x00
W 0x100001315 mov dword [var_65ch], 0x01
* var_658h
R 0x10000173c or ebx, dword [var_658h]
R 0x100001807 cmp dword [var_658h], 0x00
R 0x10000181c cmp dword [var_658h], 0x00
W 0x10000114c mov dword [var_658h], 0x00
W 0x1000014f2 mov dword [var_658h], 0x01
* var_654h
R 0x100001736 mov ebx, dword [var_654h]
R 0x1000017dd cmp dword [var_654h], 0x00
R 0x1000017f2 cmp dword [var_654h], 0x00
W 0x100001156 mov dword [var_654h], 0x00
W 0x1000012d8 mov dword [var_654h], 0x01
* var_660h
R 0x1000017d4 cmp dword [var_660h], 0x00
W 0x100001160 mov dword [var_660h], 0x00
W 0x1000014ce mov dword [var_660h], 0x01
* 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, qword [var_3ch]
* var_448h
R 0x1000015f8 lea rdi, qword [var_448h]
* var_38h
R 0x1000010d6 lea rdx, qword [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, qword [var_648h]
* var_650h
R 0x100001617 lea rbx, qword [var_650h]
R 0x100001691 lea rsi, qword [var_650h]
W 0x100001079 mov qword [var_650h], rax
* var_65ch
R 0x100001784 cmp dword [var_65ch], 0x00
W 0x100001137 mov dword [var_65ch], 0x00
W 0x100001315 mov dword [var_65ch], 0x01
* var_658h
R 0x10000173c or ebx, dword [var_658h]
R 0x100001807 cmp dword [var_658h], 0x00
R 0x10000181c cmp dword [var_658h], 0x00
W 0x10000114c mov dword [var_658h], 0x00
W 0x1000014f2 mov dword [var_658h], 0x01
* var_654h
R 0x100001736 mov ebx, dword [var_654h]
R 0x1000017dd cmp dword [var_654h], 0x00
R 0x1000017f2 cmp dword [var_654h], 0x00
W 0x100001156 mov dword [var_654h], 0x00
W 0x1000012d8 mov dword [var_654h], 0x01
* var_660h
R 0x1000017d4 cmp dword [var_660h], 0x00
W 0x100001160 mov dword [var_660h], 0x00
W 0x1000014ce mov dword [var_660h], 0x01
* 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, qword [var_3ch]
* var_448h
R 0x1000015f8 lea rdi, qword [var_448h]
* var_38h
R 0x1000010d6 lea rdx, qword [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, qword [var_648h]
* var_650h
R 0x100001617 lea rbx, qword [var_650h]
R 0x100001691 lea rsi, qword [var_650h]
W 0x100001079 mov qword [var_650h], rax
* var_65ch
R 0x100001784 cmp dword [var_65ch], 0x00
W 0x100001137 mov dword [var_65ch], 0x00
W 0x100001315 mov dword [var_65ch], 0x01
* var_658h
R 0x10000173c or ebx, dword [var_658h]
R 0x100001807 cmp dword [var_658h], 0x00
R 0x10000181c cmp dword [var_658h], 0x00
W 0x10000114c mov dword [var_658h], 0x00
W 0x1000014f2 mov dword [var_658h], 0x01
* var_654h
R 0x100001736 mov ebx, dword [var_654h]
R 0x1000017dd cmp dword [var_654h], 0x00
R 0x1000017f2 cmp dword [var_654h], 0x00
W 0x100001156 mov dword [var_654h], 0x00
W 0x1000012d8 mov dword [var_654h], 0x01
* var_660h
R 0x1000017d4 cmp dword [var_660h], 0x00
W 0x100001160 mov dword [var_660h], 0x00
W 0x1000014ce mov dword [var_660h], 0x01
* 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, qword [var_3ch]
* var_448h
R 0x1000015f8 lea rdi, qword [var_448h]
* var_38h
R 0x1000010d6 lea rdx, qword [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
afvl
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
afvl
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], 0x00
| 0x0000001d 488d4888 lea rcx, qword [var_78h]
| 0x00000021 4c8d9c24b000. lea r11, qword [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
e cfg.bigendian=false
wx 80b483b000af78600b467b8013467b707b78002b03d07a887b689a6103e07b881a047b689a6100bf0c37bd465df8047b7047
af
aaef
afvx
pdf
EOF
EXPECT=<<EOF
afvR
arg1 0x6
arg2 0x8
arg3 0xc
var_10h
var_ch 0x18,0x22
var_eh 0x16,0x1e
var_fh 0x10
var_4h
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 int32_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 int32_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 pop {r7}
\ 0x00000030 7047 bx lr
EOF
RUN
NAME=Takeover variables
FILE==
ARGS=-a x86 -b 32
CMDS=<<EOF
wx e805000000e80600000039d1742577145589e583ec048b5d088b4d0c895dfc83f90174098b45fc8945fc49ebf28b45fc89ec5dc3
aac
afvl @ 10
afvx @ 10
afvl @ 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
afvl
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
/ int varfunc()
| ; var int lightbulb @ stack - 0x18
| ; var int sun @ stack - 0x14
| ; var int last @ stack - 0x10
| ; var int chance @ stack - 0xc
| 0x0000113c push rbp ; main.c:9
| 0x0000113d mov rbp, rsp
| 0x00001140 sub rsp, 0x10
| 0x00001144 mov dword [lightbulb], 0x01 ; main.c:15
| 0x0000114b mov dword [sun], 0x02 ; main.c:16
| 0x00001152 mov dword [last], 0x03 ; main.c:17
| 0x00001159 mov dword [chance], 0x04 ; main.c:18
| 0x00001160 mov eax, 0x00 ; main.c:20
| 0x00001165 call dbg.leaffunc
| 0x0000116a mov eax, dword [chance] ; main.c:22
| 0x0000116d mov dword [sun], eax
| 0x00001170 mov eax, dword [lightbulb] ; main.c:23
| 0x00001173 leave ; main.c:24
\ 0x00001174 ret
EOF
RUN
NAME=Analyze vars accessed from sp (x86)
FILE=bins/elf/vars-x86_64-sp
CMDS=<<EOF
s sym.varfunc
af
afvl
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
/ int 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 ; main.c:9
| 0x0000113b mov dword [rsp], 0x01 ; main.c:15
| 0x00001142 mov dword [sun], 0x02 ; main.c:16
| 0x0000114a mov dword [last], 0x03 ; main.c:17
| 0x00001152 mov dword [chance], 0x04 ; main.c:18
| 0x0000115a mov eax, 0x00 ; main.c:20
| 0x0000115f call dbg.leaffunc
| 0x00001164 mov eax, dword [chance] ; main.c:22
| 0x00001168 mov dword [sun], eax
| 0x0000116c mov eax, dword [rsp] ; main.c:23
| 0x0000116f add rsp, 0x10 ; main.c:24
\ 0x00001173 ret
EOF
RUN
NAME=Vars and Args from dwarf accessed from sp (x86)
FILE=bins/elf/vars_args/example.x64
CMDS=<<EOF
aaa
s dbg.foo
pdf
EOF
EXPECT=<<EOF
; CALL XREF from dbg.main @ 0x11c0
/ int foo(int num)
| ; var int64_t arg1 @ rdi
| ; arg int num @ stack - 0x2c
| ; var int int_one @ stack - 0x20
| ; var long int long_twenty @ stack - 0x18
| ; var short int minus_seven @ stack - 0x24
| ; var int mult_int @ stack - 0x1c
| ; var long int add_long @ stack - 0x10
| ; var short int sub_short @ stack - 0x22
| 0x00001139 push rbp ; example.c:3
| 0x0000113a mov rbp, rsp
| 0x0000113d sub rsp, 0x30
| 0x00001141 mov dword [num], edi ; arg1
| 0x00001144 mov dword [int_one], 0x01 ; example.c:4
| 0x0000114b mov qword [long_twenty], 0x14 ; example.c:5
| 0x00001153 mov word [minus_seven], 0xfff9 ; example.c:6
| 0x00001159 mov edx, dword [int_one] ; example.c:7
| 0x0000115c mov eax, edx
| 0x0000115e add eax, eax
| 0x00001160 add eax, edx
| 0x00001162 add eax, eax
| 0x00001164 mov dword [mult_int], eax
| 0x00001167 mov rax, qword [long_twenty] ; example.c:8
| 0x0000116b add rax, 0x07
| 0x0000116f mov qword [add_long], rax
| 0x00001173 movzx eax, word [minus_seven] ; example.c:9
| 0x00001177 sub eax, 0x09
| 0x0000117a mov word [sub_short], ax
| 0x0000117e movsx esi, word [sub_short] ; example.c:11
| 0x00001182 mov rcx, qword [add_long]
| 0x00001186 mov edx, dword [mult_int]
| 0x00001189 mov eax, dword [num]
| 0x0000118c mov r8d, esi
| 0x0000118f mov esi, eax
| 0x00001191 lea rax, qword str.result__d__d__ld__ld ; 0x2004 ; "result %d %d %ld %ld\n"
| 0x00001198 mov rdi, rax ; const char *format
| 0x0000119b mov eax, 0x00
| 0x000011a0 call sym.imp.printf ; int printf(const char *format)
| 0x000011a5 mov eax, 0x0a ; example.c:13
| 0x000011aa leave ; example.c:14
\ 0x000011ab ret
EOF
RUN
NAME=Function arguments from DWARF (arm)
FILE=bins/elf/float_ex1/float_ex1_arm
CMDS=<<EOF
aaa
s sym.fn1
e asm.comments=0
pdf
EOF
EXPECT=<<EOF
;-- fn1:
/ dbg.fn1 (int a, char *g, double q, struct Some *gg, some_t **out);
| ; var int16_t var_20h @ stack - 0x20
| ; arg some_t **out @ stack - 0x1e
| ; arg struct Some *gg @ stack - 0x1a
| ; arg double q @ stack - 0x16
| ; arg char *g @ stack - 0xe
| ; arg int a @ stack - 0xa
| 0x000005e0 push {r7, lr}
| 0x000005e2 sub sp, 0x18
| 0x000005e4 add r7, var_20h
| 0x000005e6 str r0, [r7, 0x14]
| 0x000005e8 str r1, [r7, 0x10]
| 0x000005ea vstr d0, [r7, 8]
| 0x000005ee str r2, [r7, 4]
| 0x000005f0 str r3, [r7]
| 0x000005f2 ldr r3, [r7, 4]
| 0x000005f4 cmp r3, 0
| ,=< 0x000005f6 beq 0x5fe
| | 0x000005f8 ldr r3, [r7]
| | 0x000005fa cmp r3, 0
| ,==< 0x000005fc bne 0x602
| |`-> 0x000005fe movs r3, 0
| |,=< 0x00000600 b 0x642
| `--> 0x00000602 movs r0, 0x14
| | 0x00000604 blx sym.imp.malloc
| | 0x00000608 mov r3, r0
| | 0x0000060a mov r2, r3
| | 0x0000060c ldr r3, [r7]
| | 0x0000060e str r2, [r3]
| | 0x00000610 ldr r3, [r7]
| | 0x00000612 ldr r3, [r3]
| | 0x00000614 ldr r2, [r7, 0x14]
| | 0x00000616 str r2, [r3]
| | 0x00000618 ldr r3, [r7]
| | 0x0000061a ldr r3, [r3]
| | 0x0000061c adds r3, 4
| | 0x0000061e movs r2, 5
| | 0x00000620 ldr r1, [r7, 0x10]
| | 0x00000622 mov r0, r3
| | 0x00000624 blx sym.imp.strncpy
| | 0x00000628 ldr r3, [r7]
| | 0x0000062a ldr r3, [r3]
| | 0x0000062c vldr d7, [r7, 8]
| | 0x00000630 vcvt.f32.f64 s15, d7
| | 0x00000634 vstr s15, [r3, 0xc]
| | 0x00000638 ldr r3, [r7]
| | 0x0000063a ldr r3, [r3]
| | 0x0000063c ldr r2, [r7, 4]
| | 0x0000063e str r2, [r3, 0x10]
| | 0x00000640 movs r3, 1
| `-> 0x00000642 mov r0, r3
| 0x00000644 adds r7, 0x18
| 0x00000646 mov sp, r7
\ 0x00000648 pop {r7, pc}
EOF
BROKEN=1
RUN
NAME=Function arguments from DWARF (arm_nodebug)
FILE=bins/elf/float_ex1/float_ex1_arm_nodebug
BROKEN=1
CMDS=<<EOF
aaa
s sym.fn1
e asm.comments=0
pdf
EOF
EXPECT=<<EOF
/ sym.fn1 (int16_t arg1, int16_t arg2, int16_t arg3, int16_t arg4);
| ; arg int16_t arg1 @ r0
| ; arg int16_t arg2 @ r1
| ; arg int16_t arg3 @ r2
| ; arg int16_t arg4 @ r3
| ; var int16_t var_20h @ stack - 0x20
| 0x000005e0 push {r7, lr}
| 0x000005e2 sub sp, 0x18
| 0x000005e4 add r7, var_20h
| 0x000005e6 str r0, [r7, 0x14]
| 0x000005e8 str r1, [r7, 0x10]
| 0x000005ea vstr d0, [r7, 8]
| 0x000005ee str r2, [r7, 4]
| 0x000005f0 str r3, [r7]
| 0x000005f2 ldr r3, [r7, 4]
| 0x000005f4 cmp r3, 0
| ,=< 0x000005f6 beq 0x5fe
| | 0x000005f8 ldr r3, [r7]
| | 0x000005fa cmp r3, 0
| ,==< 0x000005fc bne 0x602
| |`-> 0x000005fe movs r3, 0
| |,=< 0x00000600 b 0x642
| `--> 0x00000602 movs r0, 0x14
| | 0x00000604 blx sym.imp.malloc
| | 0x00000608 mov r3, r0
| | 0x0000060a mov r2, r3
| | 0x0000060c ldr r3, [r7]
| | 0x0000060e str r2, [r3]
| | 0x00000610 ldr r3, [r7]
| | 0x00000612 ldr r3, [r3]
| | 0x00000614 ldr r2, [r7, 0x14]
| | 0x00000616 str r2, [r3]
| | 0x00000618 ldr r3, [r7]
| | 0x0000061a ldr r3, [r3]
| | 0x0000061c adds r3, 4
| | 0x0000061e movs r2, 5
| | 0x00000620 ldr r1, [r7, 0x10]
| | 0x00000622 mov r0, r3
| | 0x00000624 blx sym.imp.strncpy
| | 0x00000628 ldr r3, [r7]
| | 0x0000062a ldr r3, [r3]
| | 0x0000062c vldr d7, [r7, 8]
| | 0x00000630 vcvt.f32.f64 s15, d7
| | 0x00000634 vstr s15, [r3, 0xc]
| | 0x00000638 ldr r3, [r7]
| | 0x0000063a ldr r3, [r3]
| | 0x0000063c ldr r2, [r7, 4]
| | 0x0000063e str r2, [r3, 0x10]
| | 0x00000640 movs r3, 1
| `-> 0x00000642 mov r0, r3
| 0x00000644 adds r7, 0x18
| 0x00000646 mov sp, r7
\ 0x00000648 pop {r7, pc}
EOF
RUN
NAME=Function arguments from DWARF (arm_stripped)
FILE=bins/elf/float_ex1/float_ex1_arm_stripped
BROKEN=1
CMDS=<<EOF
aaa
s 0x5e0
e asm.comments=0
pdf
EOF
EXPECT=<<EOF
/ fcn.000005e0 (int16_t arg1, int16_t arg2, int16_t arg3, int16_t arg4);
| ; arg int16_t arg1 @ r0
| ; arg int16_t arg2 @ r1
| ; arg int16_t arg3 @ r2
| ; arg int16_t arg4 @ r3
| ; var int16_t var_20h @ stack - 0x20
| 0x000005e0 push {r7, lr}
| 0x000005e2 sub sp, 0x18
| 0x000005e4 add r7, var_20h
| 0x000005e6 str r0, [r7, 0x14]
| 0x000005e8 str r1, [r7, 0x10]
| 0x000005ea vstr d0, [r7, 8]
| 0x000005ee str r2, [r7, 4]
| 0x000005f0 str r3, [r7]
| 0x000005f2 ldr r3, [r7, 4]
| 0x000005f4 cmp r3, 0
| ,=< 0x000005f6 beq 0x5fe
| | 0x000005f8 ldr r3, [r7]
| | 0x000005fa cmp r3, 0
| ,==< 0x000005fc bne 0x602
| |`-> 0x000005fe movs r3, 0
| |,=< 0x00000600 b 0x642
| `--> 0x00000602 movs r0, 0x14
| | 0x00000604 blx sym.imp.malloc
| | 0x00000608 mov r3, r0
| | 0x0000060a mov r2, r3
| | 0x0000060c ldr r3, [r7]
| | 0x0000060e str r2, [r3]
| | 0x00000610 ldr r3, [r7]
| | 0x00000612 ldr r3, [r3]
| | 0x00000614 ldr r2, [r7, 0x14]
| | ;-- aav.0x00000616:
| | 0x00000616 str r2, [r3]
| | 0x00000618 ldr r3, [r7]
| | 0x0000061a ldr r3, [r3]
| | 0x0000061c adds r3, 4
| | 0x0000061e movs r2, 5
| | 0x00000620 ldr r1, [r7, 0x10]
| | 0x00000622 mov r0, r3
| | 0x00000624 blx sym.imp.strncpy
| | 0x00000628 ldr r3, [r7]
| | 0x0000062a ldr r3, [r3]
| | 0x0000062c vldr d7, [r7, 8]
| | 0x00000630 vcvt.f32.f64 s15, d7
| | 0x00000634 vstr s15, [r3, 0xc]
| | 0x00000638 ldr r3, [r7]
| | 0x0000063a ldr r3, [r3]
| | 0x0000063c ldr r2, [r7, 4]
| | 0x0000063e str r2, [r3, 0x10]
| | 0x00000640 movs r3, 1
| `-> 0x00000642 mov r0, r3
| 0x00000644 adds r7, 0x18
| 0x00000646 mov sp, r7
\ 0x00000648 pop {r7, pc}
EOF
RUN
NAME=Function va_args arguments from DWARF
FILE=bins/elf/float_ex1/float_ex1_hightec
CMDS=<<EOF
aaa
(sig; afvl; afvlt; afs; pd 1; echo "---------")
s dbg.printf
.(sig)
s dbg.prout
.(sig)
s dbg._fpadd_parts
.(sig)
s dbg.strnlen_s
.(sig)
s dbg._Wctomb
.(sig)
s dbg._Mbtowc
.(sig)
s dbg.feraiseexcept
.(sig)
s dbg._Atrealloc
.(sig)
s dbg.fn1
.(sig)
EOF
EXPECT=<<EOF
var va_list ap @ stack + 0x4
var int32_t arg5 @ a4
arg const char *fmt @ a6
var int ans @ ...
is_arg name type constraints origin addr
-----------------------------------------------------------------------------------------------------------------------------------------
false ap va_list DWARF loclist: [(0x80000c22, 20): CFA+0, (0x80000c36, 5): a7, (0x80000c3b, 1): CFA+0]
false arg5 int32_t rizin a4
true fmt const char * DWARF loclist: [(0x80000c22, 10): a4, (0x80000c2c, 15): a6, (0x80000c3b, 1): <evaluation waiting>]
false ans int DWARF empty
int printf(const char *fmt, ...);
; CALL XREFS from dbg.main @ 0x8000054e, 0x80000636
/ int printf(const char *fmt, ...)
| ; var int32_t arg5 @ a4
| ; arg const char *fmt @ a6
| ; var int ans @ ...
| ; var va_list ap @ stack + 0x4
| 0x80000c22 mov.aa a6, a4 ; printf.c:10 ; arg5
---------
arg void *str @ a15
var int32_t arg5 @ a4
arg const char *buf @ a5
arg size_t n @ d4
is_arg name type constraints origin addr
--------------------------------------------------------------------------------------------------------------------------------------------------------------
true str void * DWARF loclist: [(0x80000c04, 6): a4, (0x80000c0a, 24): a15]
false arg5 int32_t rizin a4
true buf const char * DWARF loclist: [(0x80000c04, 12): a5, (0x80000c10, 3): a4, (0x80000c13, 15): <evaluation waiting>]
true n size_t DWARF loclist: [(0x80000c04, 10): d4, (0x80000c0e, 5): d5, (0x80000c13, 7): d15, (0x80000c1a, 8): <evaluation waiting>]
void * prout(void *str, const char *buf, size_t n);
/ void * prout(void *str, const char *buf, size_t n)
| ; var int32_t arg5 @ a4
| ; arg void *str @ a15
| ; arg const char *buf @ a5
| ; arg size_t n @ d4
| 0x80000c04 mov.aa a15, a4 ; printf.c:5 ; arg5
---------
arg fp_number_type *b @ a12
arg fp_number_type *a @ a13
arg fp_number_type *tmp @ a15
var int32_t arg5 @ a4
var int32_t arg6 @ a5
var int32_t arg7 @ a6
var int a_normal_exp @ d15
var int b_normal_exp @ d2
var fractype a_fraction @ COMPOSITE
var intfrac tfraction @ COMPOSITE
var fractype b_fraction @ COMPOSITE
is_arg name type constraints origin addr
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
true b fp_number_type * DWARF loclist: [(0x80003c60, 44): a5, (0x80003c8c, 2): a2, (0x80003c8e, 4): a5, (0x80003c92, 6): a2, (0x80003c98, 28): a5, (0x80003cb4, 2): a2, (0x80003cb6, 4): a5, (0x80003cba, 47): a2, (0x80003ce9, 39): a12, (0x80003d10, 13): a2, (0x80003d1d, 41): a12, (0x80003d46, 16): a2, (0x80003d56, 172): a12, (0x80003e02, 2): <evaluation waiting>]
true a fp_number_type * DWARF loclist: [(0x80003c60, 60): a4, (0x80003c9c, 18): a2, (0x80003cae, 6): <evaluation waiting>, (0x80003cb4, 53): a4, (0x80003ce9, 39): a13, (0x80003d10, 13): a4, (0x80003d1d, 41): a13, (0x80003d46, 16): a4, (0x80003d56, 172): a13, (0x80003e02, 2): <evaluation waiting>]
true tmp fp_number_type * DWARF loclist: [(0x80003c60, 137): a6, (0x80003ce9, 39): a15, (0x80003d10, 13): a6, (0x80003d1d, 41): a15, (0x80003d46, 16): a6, (0x80003d56, 148): a15, (0x80003dea, 24): a2, (0x80003e02, 2): <evaluation waiting>]
false arg5 int32_t rizin a4
false arg6 int32_t rizin a5
false arg7 int32_t rizin a6
false a_normal_exp int DWARF loclist: [(0x80003cbc, 144): d15, (0x80003d4c, 6): a4+8, (0x80003d52, 54): d15, (0x80003d88, 16): a15+8, (0x80003dc6, 10): d15, (0x80003dd0, 6): a15+8]
false b_normal_exp int DWARF loclist: [(0x80003cc0, 32): d2, (0x80003ce0, 9): <evaluation waiting>, (0x80003d10, 13): d2, (0x80003d46, 16): d2]
false a_fraction fractype DWARF loclist: [(0x80003cd4, 104): composite: [(.0, 32): d10, (.0, 32): d11], (0x80003d44, 12): composite: [(.0, 32): d10, (.0, 32): d11], (0x80003d50, 2): a4+12, (0x80003d52, 176): composite: [(.0, 32): d10, (.0, 32): d11]]
false tfraction intfrac DWARF composite: [(.0, 32): d2, (.0, 32): d3]
false b_fraction fractype DWARF loclist: [(0x80003cd8, 48): composite: [(.0, 32): d8, (.0, 32): d9], (0x80003d0e, 244): composite: [(.0, 32): d8, (.0, 32): d9]]
fp_number_type * _fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp);
; CALL XREF from dbg.__adddf3 @ 0x80003e32
; CALL XREF from dbg.__subdf3 @ 0x80003e72
/ fp_number_type * _fpadd_parts(fp_number_type *a, fp_number_type *b, fp_number_type *tmp)
| ; var int32_t arg5 @ a4
| ; var int32_t arg6 @ a5
| ; var int32_t arg7 @ a6
| ; arg fp_number_type *a @ a13
| ; arg fp_number_type *b @ a12
| ; arg fp_number_type *tmp @ a15
| ; var intfrac tfraction @ COMPOSITE
| ; var int a_normal_exp @ d15
| ; var int b_normal_exp @ d2
| ; var fractype a_fraction @ COMPOSITE
| ; var fractype b_fraction @ COMPOSITE
| 0x80003c60 ld.bu d15, [a4]#0 ; fp-bit.c:604 ; arg5
---------
var const char *sc @ a2
arg const char *s @ a4
arg size_t maxsize @ d4
is_arg name type constraints origin addr
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
false sc const char * DWARF a2
true s const char * DWARF loclist: [(0x800030ca, 18): a4, (0x800030dc, 4): <evaluation waiting>, (0x800030e0, 10): a4, (0x800030ea, 2): a2]
true maxsize size_t DWARF loclist: [(0x800030ca, 8): d4, (0x800030ea, 2): d4]
size_t strnlen_s(const char *s, size_t maxsize);
; CALL XREF from dbg._Fail_s @ 0x8000191e
/ size_t strnlen_s(const char *s, size_t maxsize)
| ; arg const char *s @ a4
| ; arg size_t maxsize @ d4
| ; var const char *sc @ a2
| 0x800030ca mov d2, #0 ; strnlen_s.c:6
---------
arg mbstate_t *pst @ a12
var _Statab *pwcstate @ a13
arg char *s @ a15
var int32_t arg5 @ a4
var int32_t arg6 @ a5
arg wchar_t wc @ d15
var _Statab *pmbstate @ ...
is_arg name type constraints origin addr
------------------------------------------------------------------------------------------------------
true pst mbstate_t * DWARF loclist: [(0x800018a6, 21): a5, (0x800018bb, 49): a12]
false pwcstate _Statab * DWARF a13
true s char * DWARF loclist: [(0x800018a6, 21): a4, (0x800018bb, 49): a15]
false arg5 int32_t rizin a4
false arg6 int32_t rizin a5
true wc wchar_t DWARF loclist: [(0x800018a6, 21): d4, (0x800018bb, 49): d15]
false pmbstate _Statab * DWARF empty
int _Wctomb(char *s, wchar_t wc, mbstate_t *pst);
; CALL XREF from dbg._Putstr @ 0x800014d2
/ int _Wctomb(char *s, wchar_t wc, mbstate_t *pst)
| ; var int32_t arg5 @ a4
| ; var int32_t arg6 @ a5
| ; arg char *s @ a15
| ; arg wchar_t wc @ d15
| ; arg mbstate_t *pst @ a12
| ; var _Statab *pmbstate @ ...
| ; var _Statab *pwcstate @ a13
| 0x800018a6 movh.a a2, #0xd000 ; xwctomb.c:123
---------
arg wchar_t *pwc @ a4
arg const char *s @ a5
arg mbstate_t *pst @ a6
arg size_t nin @ d4
is_arg name type constraints origin addr
---------------------------------------------------------------------------------------------------
true pwc wchar_t * DWARF loclist: [(0x80003084, 23): a4, (0x8000309b, 21): a14]
true s const char * DWARF loclist: [(0x80003084, 23): a5, (0x8000309b, 21): a13]
true pst mbstate_t * DWARF loclist: [(0x80003084, 23): a6, (0x8000309b, 21): a12]
true nin size_t DWARF loclist: [(0x80003084, 23): d4, (0x8000309b, 21): d15]
int _Mbtowc(wchar_t *pwc, const char *s, size_t nin, mbstate_t *pst);
; CALL XREF from dbg._Printf @ 0x80000d02
/ int _Mbtowc(wchar_t *pwc, const char *s, size_t nin, mbstate_t *pst)
| ; arg wchar_t *pwc @ a4
| ; arg const char *s @ a5
| ; arg size_t nin @ d4
| ; arg mbstate_t *pst @ a6
| 0x80003084 movh.a a15, #0xd000 ; xmbtowc.c:150
---------
arg int except @ d4
is_arg name type constraints origin addr
-------------------------------------------
true except int DWARF d4
int feraiseexcept(int except);
; CALL XREF from dbg._Feraise @ 0x8000343e
/ int feraiseexcept(int except)
| ; arg int except @ d4
| 0x800037d8 mov d2, #0 ; feraiseexcept.c:173
---------
var size_t size_arg @ a0
var Ppvoidfn newfuns @ a12
var size_t inc @ d15
is_arg name type constraints origin addr
----------------------------------------------------------------------------------------------------
false size_arg size_t rizin a0
false newfuns Ppvoidfn DWARF loclist: [(0x800019aa, 14): a2, (0x800019b8, 100): a12]
false inc size_t DWARF d15
int _Atrealloc();
; CALL XREF from dbg.atexit @ 0x80001a4c
; CALL XREF from dbg._Atexit @ 0x800033b8
/ int _Atrealloc()
| ; var size_t size_arg @ a0
| ; var size_t inc @ d15
| ; var Ppvoidfn newfuns @ a12
| 0x80001994 movh.a a15, #0xd000 ; exit.c:22
---------
arg some_t **out @ stack - 0x18
arg struct Some *gg @ stack - 0x14
arg double q @ stack - 0x10
arg char *g @ stack - 0x8
arg int a @ stack - 0x4
var size_t size_arg @ a0
var int32_t arg5 @ a4
var int32_t arg6 @ a5
var int32_t arg7 @ a6
is_arg name type constraints origin addr
--------------------------------------------------------
true out some_t ** DWARF a14-24
true gg struct Some * DWARF a14-20
true q double DWARF a14-16
true g char * DWARF a14-8
true a int DWARF a14-4
false size_arg size_t rizin a0
false arg5 int32_t rizin a4
false arg6 int32_t rizin a5
false arg7 int32_t rizin a6
void dbg.fn1(int a, char *g, double q, struct Some *gg, some_t **out);
; CALL XREF from dbg.main @ 0x8000059e
/ _Bool fn1(int a, char *g, double q, struct Some *gg, some_t **out)
| ; var int32_t arg5 @ a4
| ; var int32_t arg6 @ a5
| ; var int32_t arg7 @ a6
| ; var size_t size_arg @ a0
| ; arg int a @ stack - 0x4
| ; arg char *g @ stack - 0x8
| ; arg double q @ stack - 0x10
| ; arg struct Some *gg @ stack - 0x14
| ; arg some_t **out @ stack - 0x18
| 0x8000041c mov.aa a14, sp ; float_ex1.c:15
---------
EOF
RUN
NAME=Function arguments from DWARF (tricore-gcc)
FILE=bins/elf/float_ex1/float_ex1_tricore_gcc
CMDS=<<EOF
aaa
s sym.fn1
e asm.comments=0
pdf
EOF
EXPECT=<<EOF
/ sym.fn1(size_t nbytes, int32_t arg5, int32_t arg6, int32_t arg7);
| ; arg size_t nbytes @ a0
| ; arg int32_t arg5 @ a4
| ; arg int32_t arg6 @ a5
| ; arg int32_t arg7 @ a6
| 0x800004ce mov.aa a14, sp
| 0x800004d0 sub.a sp, #0x18
| 0x800004d2 st.w [a14]#-4, d4
| 0x800004d6 st.a [a14]#-8, a4
| 0x800004da st.d [a14]#-0x10, e6
| 0x800004de st.a [a14]#-0x14, a5
| 0x800004e2 st.a [a14]#-0x18, a6
| 0x800004e6 ld.w d15, [a14]#-0x14
| ,=< 0x800004ea jz d15, 0x800004f2
| | 0x800004ec ld.w d15, [a14]#-0x18
| ,==< 0x800004f0 jnz d15, 0x800004f6
| |`-> 0x800004f2 mov d15, #0
| |,=< 0x800004f4 j 0x8000054c
| `--> 0x800004f6 mov d4, #0x14
| | 0x800004fa call dbg.malloc
| | 0x800004fe mov.aa a15, a2
| | 0x80000500 mov.d d15, a15
| | 0x80000502 ld.a a15, [a14]#-0x18
| | 0x80000506 st.w [a15]#0, d15
| | 0x80000508 ld.a a15, [a14]#-0x18
| | 0x8000050c ld.a a15, [a15]#0
| | 0x8000050e ld.w d15, [a14]#-4
| | 0x80000512 st.w [a15]#0, d15
| | 0x80000514 ld.a a15, [a14]#-0x18
| | 0x80000518 nop
| | 0x8000051a ld.w d15, [a15]#0
| | 0x8000051c mov.a a15, d15
| | 0x8000051e add.a a15, #4
| | 0x80000520 mov d4, #5
| | 0x80000522 ld.a a5, [a14]#-8
| | 0x80000526 mov.aa a4, a15
| | 0x80000528 call dbg.strncpy
| | 0x8000052c ld.a a15, [a14]#-0x18
| | 0x80000530 ld.a a15, [a15]#0
| | 0x80000532 ld.d e4, [a14]#-0x10
| | 0x80000536 call dbg.__truncdfsf2
| | 0x8000053a mov d15, d2
| | 0x8000053c st.w [a15]#0xc, d15
| | 0x8000053e ld.a a15, [a14]#-0x18
| | 0x80000542 ld.a a15, [a15]#0
| | 0x80000544 ld.w d15, [a14]#-0x14
| | 0x80000548 st.w [a15]#0x10, d15
| | 0x8000054a mov d15, #1
| `-> 0x8000054c mov d2, d15
\ 0x8000054e ret
EOF
RUN
NAME=Repeated function analysis - arguments and vars
FILE=bins/elf/analysis/001.make.elf.x86_64
CMDS=<<EOF
aaa
s 0x0040bbe0
afi
echo ---
afvl
pd 1
aaa
afvl
pd 1
aaa
afvl
pd 1
EOF
EXPECT=<<EOF
offset: 0x0040bbe0
name: sym.variable_expand_for_file
size: 129
is-pure: false
realsz: 120
stackframe: 0
call-convention: amd64
cyclomatic-cost: 37
cyclomatic-complexity: 3
loops: 1
bits: 64
type: sym
num-bbs: 5
edges: 6
end-bbs: 1
call-refs: 0x0040b0f0 C 0x0040b0f0 J
data-refs: 0x006331a0 0x00636050 0x006331a0 0x00636050 0x006331a0 0x00636050
code-xrefs: 0x0040cc17 C 0x00412775 C
noreturn: false
in-degree: 2
out-degree: 1
data-xrefs:
locals: 3
args: 2
var char *result @ rax
var struct variable_set_list *savev @ rbp
var floc *savef @ rbx
arg const char *line @ rdi
arg struct file *file @ rsi
---
var char *result @ rax
var struct variable_set_list *savev @ rbp
var floc *savef @ rbx
arg const char *line @ rdi
arg struct file *file @ rsi
; CALL XREF from dbg.expand_deps @ 0x40cc17
; CALL XREF from dbg.pattern_search @ 0x412775
/ char *sym.variable_expand_for_file(const char *line, struct file *file);
| ; arg const char *line @ rdi
| ; arg struct file *file @ rsi
| ; var char *result @ rax
| ; var struct variable_set_list *savev @ rbp
| ; var floc *savef @ rbx
| 0x0040bbe0 test rsi, rsi ; expand.c:458 ; file
var char *result @ rax
var struct variable_set_list *savev @ rbp
var floc *savef @ rbx
arg const char *line @ rdi
arg struct file *file @ rsi
; CALL XREF from dbg.expand_deps @ 0x40cc17
; CALL XREF from dbg.pattern_search @ 0x412775
/ char *sym.variable_expand_for_file(const char *line, struct file *file);
| ; arg const char *line @ rdi
| ; arg struct file *file @ rsi
| ; var char *result @ rax
| ; var struct variable_set_list *savev @ rbp
| ; var floc *savef @ rbx
| 0x0040bbe0 test rsi, rsi ; expand.c:458 ; file
var char *result @ rax
var struct variable_set_list *savev @ rbp
var floc *savef @ rbx
arg const char *line @ rdi
arg struct file *file @ rsi
; CALL XREF from dbg.expand_deps @ 0x40cc17
; CALL XREF from dbg.pattern_search @ 0x412775
/ char *sym.variable_expand_for_file(const char *line, struct file *file);
| ; arg const char *line @ rdi
| ; arg struct file *file @ rsi
| ; var char *result @ rax
| ; var struct variable_set_list *savev @ rbp
| ; var floc *savef @ rbx
| 0x0040bbe0 test rsi, rsi ; expand.c:458 ; file
EOF
RUN