NAME=DWARF 5 loclists: variables located through DW_FORM_loclistx (clang)
FILE=bins/elf/dwarf/loclists-x64-clang
CMDS=<<EOF
aaa
afv @ sym.work
afv @ sym.main
afv @ sym._start~var
id~version 5
id~?End of list
id~?debug_loc section
EOF
EXPECT=<<EOF
arg int a @ rdi
arg int b @ rsi
var int x @ rbp
var int y @ rax
var int z @ rbx
arg int argc @ rdi
arg char ** argv @ rsi
var int r @ rax
0x0 version 5 address size 8 offsets 6
0x65 version 5 address size 8 offsets 1
7
0
EOF
RUN

NAME=DWARF 5 loclists: variables located through DW_FORM_sec_offset (gcc)
FILE=bins/elf/dwarf/loclists-aarch64-gcc
CMDS=<<EOF
aaa
afv @ sym.work
afv @ sym.main
id~base_address
id~offset_pair 0x4000e
EOF
EXPECT=<<EOF
arg int b @ x1
var int z @ x0
var int x @ x2
var int64_t var_10h @ sp+0x0
var int64_t var_10h_2 @ sp+0x8
arg int argc @ x0
arg char ** argv @ x1
0x10 base_address 0x4000e0
0x2a base_address 0x4000c0
0x44 base_address 0x4000c0
0x5f base_address 0x4000e8
0x94 base_addressx 0x0
0x98 base_address 0x4000fc
0x19 offset_pair 0x4000e0 0x4000e4 1
0x1e offset_pair 0x4000e4 0x4000e8 3
0x68 offset_pair 0x4000e8 0x4000f4 1
EOF
RUN

NAME=DWARF 2 binaries keep their .debug_loc and gain no loclists
FILE=bins/elf/dwarf/hello-dwarf2
CMDS=<<EOF
id~?debug_loclists
id~?debug_loc section
EOF
EXPECT=<<EOF
0
1
EOF
RUN

NAME=DWARF 5 loclists: a parameter gets its entry location, a local the widest
FILE=bins/elf/dwarf/loclists-x64-semantics
ARGS=-e anal.vars=false
CMDS=<<EOF
aaa
afv @ sym.work
afv @ sym._start
EOF
EXPECT=<<EOF
arg int a @ rdi
arg int b @ rdx
var int x @ rbp
var int z @ rbx
var int r @ rax
EOF
RUN

NAME=DWARF 5 loclists: a malformed entry drops its list and nothing else
FILE=bins/elf/dwarf/loclists-x64-bad-entries
CMDS=<<EOF
aaa
afv @ sym.work
id~Malformed entry
EOF
EXPECT=<<EOF
arg int a @ rdi
arg int b @ rsi
var int y @ rax
0x37 <Malformed entry>
EOF
RUN

NAME=DWARF 5 loclists: a list is bounded by its contribution
FILE=bins/elf/dwarf/loclists-x64-bad-contribution
CMDS=<<EOF
aaa
afv @ sym.work
afv @ sym._start~var
id~Malformed
id~?version 5
EOF
EXPECT=<<EOF
arg int a @ rdi
arg int b @ rsi
var int x @ rbp
var int y @ rax
var int r @ rax
0x51 <Malformed entry>
0x53 <Malformed header>
1
EOF
RUN

NAME=DWARF 5 loclists: a loclistx index past the offset table costs that location only
FILE=bins/elf/dwarf/loclists-x64-bad-index
CMDS=<<EOF
aaa
afv @ sym.work
EOF
EXPECT=<<EOF
arg int a @ rdi
arg int b @ rsi
var int y @ rax
var int z @ rbx
EOF
RUN

NAME=DWARF 5 loclists: a loclists base of the wrong form keeps its unit
FILE=malloc://4096
CMDS=<<EOF
wff bins/elf/dwarf/loclists-x64-clang
wx 06 @ 0x311
oba 0
id~&loclists_base,:
id~Compilation Unit
EOF
EXPECT=<<EOF
     DW_AT_loclists_base       : 12
     DW_AT_loclists_base       : <0x71>
  Compilation Unit @ offset 0x0:
  Compilation Unit @ offset 0xd4:
EOF
RUN

NAME=DWARF 5 loclists: a range whose sums wrap is malformed
FILE=bins/elf/dwarf/loclists-aarch64-bad-base
CMDS=<<EOF
id~Malformed
EOF
EXPECT=<<EOF
0x4d <Malformed entry>
EOF
RUN
