[DebugInfo] Avoid adding too much indirection to pointer-valued variables
authorJeremy Morse <jeremy.morse.llvm@gmail.com>
Mon, 1 Jul 2019 09:38:23 +0000 (09:38 +0000)
committerJeremy Morse <jeremy.morse.llvm@gmail.com>
Mon, 1 Jul 2019 09:38:23 +0000 (09:38 +0000)
commitd2b6665e33944eb04ea699124f15850ba22a144a
treec7323403d652a99a5056b0bb3694b9133b14d636
parent9d34f4569b48821fdc27ab520fecde9ec09b344b
[DebugInfo] Avoid adding too much indirection to pointer-valued variables

This patch addresses PR41675, where a stack-pointer variable is dereferenced
too many times by its location expression, presenting a value on the stack as
the pointer to the stack.

The difference between a stack *pointer* DBG_VALUE and one that refers to a
value on the stack, is currently the indirect flag. However the DWARF backend
will also try to guess whether something is a memory location or not, based
on whether there is any computation in the location expression. By simply
prepending the stack offset to existing expressions, we can accidentally
convert a register location into a memory location, which introduces a
suprise (and unintended) dereference.

The solution is to add DW_OP_stack_value whenever we add a DIExpression
computation to a stack *pointer*. It's an implicit location computed on the
expression stack, thus needs to be flagged as a stack_value.

For the edge case where the offset is zero and the location could be a register
location, DIExpression::prepend will still generate opcodes, and thus
DW_OP_stack_value must still be added.

Differential Revision: https://reviews.llvm.org/D63429

llvm-svn: 364736
llvm/include/llvm/IR/DebugInfoMetadata.h
llvm/lib/CodeGen/PrologEpilogInserter.cpp
llvm/lib/IR/DebugInfoMetadata.cpp
llvm/test/DebugInfo/MIR/X86/prolog-epilog-indirection.mir [new file with mode: 0644]