<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/70952>70952</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Call site info: Volatile register shouldn't be used in DW_AT_call_value expression
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            wrong-debug,
            debuginfo
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          OCHyams
      </td>
    </tr>
</table>

<pre>
    clang version 18.0.0 (bc41b0ac2b03b8c305d7399d772c87d27cc9831c)
Target: x86_64-unknown-linux-gnu

Similar to #42688 but a different manifestation of the same DWARF violation.

DW_AT_call_value expressions are not permitted to use volatile registers:

> If it is not possible to avoid registers or memory locations that might be clobbered by the call in the expression, then the DW_AT_call_value attribute should not be provided.

See below: The DW_AT_call_value expression for the `DW_TAG_call_site_parameter` for the call site info describing the call from `f1` to `f2` uses `RAX`.

$ cat test
```
#define FORCE_SPILL() __asm ("": : : \
  "rax", "rbx", "rcx", "rdx", "rsi", "rdi", "r8", "r9", \
  "r10", "r11", "r12", "r13", "r14", "r15")

int g = 0;

[[clang::optnone]]
[[clang::not_tail_called]]
int f2(int y) {
 return y;
}

int f1(int x) {
  FORCE_SPILL();
  return f2(x + g * 2);
}
```

$ clang -O2 -g -c test.cpp -o -  | llvm-dwarfdump - --name=f1 --show-children
```
-:      file format elf64-x86-64

0x00000052: DW_TAG_subprogram
 DW_AT_name     ("f1")
              ...

0x00000062: DW_TAG_formal_parameter
                ...

0x0000006b: DW_TAG_call_site
                DW_AT_call_origin       (0x00000036)
 DW_AT_call_return_pc   (0x0000000000000034)

0x00000071: DW_TAG_call_site_parameter
                  DW_AT_location        (DW_OP_reg5 RDI)
                  DW_AT_call_value      (DW_OP_fbreg -48, DW_OP_deref_size 0x8, DW_OP_breg0 RAX+0, DW_OP_lit2, DW_OP_mul, DW_OP_plus)

0x0000007e:     NULL

0x0000007f: NULL

```

N.B. I've only seen this occur for DW_AT_call_value expressions using multiple registers.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVl9v4zYM_zTKC-FAlv_EfshD2ly3AsX10OvWvQWyRTvaZMuQ5DTZpx-kJI3Ty90MtxEl6scfKYo0t1a2PeKSZHckW8_46LbaLJ_vfz_wzs4qLQ7LWvG-hR0aK3UPcTGncwqEFVWdxhXlNatoUhV1QjOxSMpSLBasLhaCLeq6LJK4JqwkdE3o6pWbFh1JVrAv8k2eRmP_T6_f-0jJftxHbT8e9Y7_v8tOKm7AaSAsSVleFFCNDjgI2TRosHfQ8V42aB13nppuwG0RLO8Q1m-rlwfYSa3C2nyKvH7brF43NVdqs-NqRMD9YNB69yxwg9BrBwOaTjqHwhMYLcIuQCkEg620Do0lyWoKS5Iv8NiAdCDtEUJbKyuFHoHvtBSXraANdNhpcwCl60DRgttyB51stw4qhFrpqkKDAqpD8MsTBtmH8YUxYfd-5jj9g2fcOSOr0SHYrR6VCLwqhMHonRQoruLyHREqVPrdH9HrLbiLWWi0CSZJTtdvm9fVb0c9Kx1uBm54hw4NyemHYqDvl0H2jQaBtjaykn17WW2M7jxgE_uN_uBz2jA_Hi1aL72s_iI5vWJNWAo1d-DQutNMTk_vSSER2Mge4eH55f7L5vu3x6cnwgrCSthsuO0gCMy_yQo-_rL7434Awpjh-6ByH4RqKtRTQUwFK6crU6GYjMvz-NpgTCc6cTwV2FRIpkI6FbIglNNgyd5BCyRZAyXJ3VUYfQG4C3fd53Wy0oPrdY8kW_v3tk6v3cZxqcLZo5jqeksNI6zwg4OPNVmcDIJBN5oeDhcKi_Vnlk182ru_3vvjIX6gwBk42N0DYXfeWbYCNlW7GPuUJ5d0ChUvemYQtRDVIbXm9TBApCECIIt7UGrXReKdm0aM3QARRFHPOyTJuokhiuxWv0f1ViphsL9pLfI5Fp7GF5VGm447QNXkabQv8ihPp6zonoYnCyl6unB2rAajW8O7k__H-xp40PKY1E08TQK4eubz-S0b-dRG4KUmN_oGzs-RqgnSR3m4DTGpNdrIVvZHF85QSX5xYqJ6PPDNUF9rn58k_ZT_Z4VFfIvZ_7l5Znku2Uej67fN87eNwTaDl_XjT2L9ycVQTqfbm8pgC1Fa-Nt7nBJosNlY-S8C3U_mvSYFXwnZHb1MK-nYRepGdREGNdqfBQLPefj1j6enmxqN1_i8evPufJ3fzeGRsMUOQffqABZDY5IWdF2PJvSCX3bf0fqG0I3KyWHaauczsUxEmZR8hss4L4siS1iezbbLkotaiLrJ0rrMsjij2SItqiTLaRKzNBEzuWSUJXFM4zhLY5rM4ybDIo0FXSRVw1lJUoodl2ru7_Rcm3YmrR1xuaBlxmaKV6hs-D5i7N3ovo0EVmN7LLSEsSD5luZnsvXMLENtqMbWkpQqaZ29IDvpFC7vr1qhD--fnz8uTv26J2wRGvZoUfjm_4vozUajllvnhvBhwh4Ie2il247VvNYdYQ-exOknGoz-G2tH2EPw1RL2ENz9LwAA___ndOSZ">