forked from OSchip/llvm-project
![]() 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 |
||
---|---|---|
.. | ||
bit-piece-dh.mir | ||
clobbered-fragments.mir | ||
dbg-stack-value-range.mir | ||
debug-loc-0.mir | ||
empty-inline.mir | ||
kill-after-spill.mir | ||
lit.local.cfg | ||
live-debug-values-3preds.mir | ||
live-debug-values-fragments.mir | ||
live-debug-values-reg-copy.mir | ||
live-debug-values-restore.mir | ||
live-debug-values-spill.mir | ||
live-debug-values.mir | ||
live-debug-vars-unused-arg-debugonly.mir | ||
live-debug-vars-unused-arg.mir | ||
livedebugvalues-limit.mir | ||
mlicm-hoist.mir | ||
no-cfi-loc.mir | ||
prolog-epilog-indirection.mir | ||
regcoalescer.mir | ||
regcoalescing-clears-dead-dbgvals.mir |