LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 50285 - [DebugInfo@O2] Poor coverage for frame index variable locations
Summary: [DebugInfo@O2] Poor coverage for frame index variable locations
Status: NEW
Alias: None
Product: libraries
Classification: Unclassified
Component: Common Code Generator Code (show other bugs)
Version: trunk
Hardware: PC Linux
: P enhancement
Assignee: Unassigned LLVM Bugs
URL:
Keywords:
Depends on:
Blocks: poor-debug-experiences
  Show dependency tree
 
Reported: 2021-05-10 02:10 PDT by Orlando Cazalet-Hyams
Modified: 2021-05-12 18:40 PDT (History)
4 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Orlando Cazalet-Hyams 2021-05-10 02:10:39 PDT
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, ...).
Comment 1 Orlando Cazalet-Hyams 2021-05-10 02:13:25 PDT
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.