<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">