In the reproducer below, the variable 'local' has no location around the call to 'ext' when built with "-O2 -g -c" (targeting x86_64-unknown-linux-gnu): clang built at 71597d40e878. $ cat test.cpp void ext(int, int, int, int, int, int, int, int, int, int); void escape(int*); int example() { int local = 0; escape(&local); ext(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); local += 2; return local; } $ clang -O2 -g -c test.cpp -o test.o $ llvm-objdump -d test.o test.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <_Z7examplev>: 0: 50 pushq %rax 1: c7 44 24 04 00 00 00 00 movl $0, 4(%rsp) 9: 48 8d 7c 24 04 leaq 4(%rsp), %rdi e: e8 00 00 00 00 callq 0x13 <_Z7examplev+0x13> 13: 31 ff xorl %edi, %edi 15: be 01 00 00 00 movl $1, %esi 1a: ba 02 00 00 00 movl $2, %edx 1f: b9 03 00 00 00 movl $3, %ecx 24: 41 b8 04 00 00 00 movl $4, %r8d 2a: 41 b9 05 00 00 00 movl $5, %r9d 30: 6a 09 pushq $9 32: 6a 08 pushq $8 34: 6a 07 pushq $7 36: 6a 06 pushq $6 38: e8 00 00 00 00 callq 0x3d <_Z7examplev+0x3d> 3d: 48 83 c4 20 addq $32, %rsp 41: 8b 44 24 04 movl 4(%rsp), %eax 45: 83 c0 02 addl $2, %eax 48: 59 popq %rcx 49: c3 retq $ llvm-dwarfdump test.o --name local test.o: file format elf64-x86-64 0x00000047: DW_TAG_variable DW_AT_location (0x00000000: [0x0000000000000001, 0x0000000000000009): DW_OP_consts +0, DW_OP_stack_value [0x0000000000000009, 0x0000000000000032): DW_OP_breg7 RSP+4 [0x0000000000000045, 0x000000000000004a): DW_OP_reg0 RAX) DW_AT_name ("local") DW_AT_decl_file ("test.cpp") DW_AT_decl_line (4) The variable 'local' is not given a location over the interval [32, 45) even though its stack home is still valid here (RSP+8, RSP+12, ...).
It looks like the DBG_VALUE describing the stack home uses a frame index location which is rewritten in terms of RSP by Prologue/Epilogue Insertion (prologepilog). DbgEntityHistoryCalculator then terminates the location range at the first stack adjustment because RSP is clobbered. This has been discussed on llvm-dev with the subject line "[llvm-dev] [debug-info] Stack pointer based variable locations". The preferred solution currently appears to be to set DW_AT_frame_base to DW_OP_call_frame_cfa in the parent subroutine DIE and use DW_OP_fbreg to describe the stack location.