David Stenberg 30e399a675
[DebugInfo] Find call site values for params in preserved registers (#172339)
For example, given code like this:

    int local = value();
    callee(local);
    return local;

resulting in assembly like:

    movl    %eax, %ebx // %eax = local
    movl    %eax, %edi
    callq   callee@PLT

the call site value generation did not understand that the value of
local is stored in the callee-saved %ebx during the call, and did not
emit any call site value. This patch addresses that, resulting in:

    DW_TAG_call_site_parameter
      DW_AT_location      (DW_OP_reg5 RDI)
      DW_AT_call_value    (DW_OP_breg3 RBX+0)

This code does not keep track if any succeeding instructions save
registers, meaning that it fails to emit a call site value for a case
like this:

    movq    %rax, %rdi
    movq    %rax, %rbx
    callq   callee@PLT

The test case dbgcall-site-preserved-clobbered.mir has been added for
that. This should be rather easy to address, but can be done in a
follow-up patch.

Building a clang-21 RelWithDebInfo binary for x86-64 without/with this
patch results in a ~1.8% increase of the number of call site parameter
entries with a location (from 1792876 to 1825718). This also reduces the
number of call site parameter entries using DW_OP_entry_value locations,
which are not guaranteed to be printable as they require the frame above
to provide a call site value for that parameter, from 57718 to 34871.

Fixes #43464.
2026-01-14 16:50:56 +01:00
..