]> granicus.if.org Git - llvm/commit
[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)
commit9ea08046da6779d6f4b112cb0a84247ae1d8648c
tree221acd6354f32fd2e2036f2971a9f794c0eefe0f
parent331d5b9b286e9955d5431f35305f7d2d8041c097
[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364736 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/IR/DebugInfoMetadata.h
lib/CodeGen/PrologEpilogInserter.cpp
lib/IR/DebugInfoMetadata.cpp
test/DebugInfo/MIR/X86/prolog-epilog-indirection.mir [new file with mode: 0644]