<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61981>61981</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Variable locations for C++ structured bindings broken with optimisations
</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/llvm version: 1a0653a80dee2b0db5fb44f50777153fb7690a4f (5th April 2023).
Variable locations for structured binding are incorrect for promoted variables
after SROA.
Consider this test case:
```
$ cat test.cpp -n
1 struct two { int a, b; };
2 __attribute__((optnone)) two get() { return {5, 10}; }
3
4 int main() {
5 auto [x, y] = get();
6 return x + y;
7 }
```
Build:
```
$ clang -g test.cpp -O2 -Xclang -fexperimental-assignment-tracking=disabled -o test
```
Debug:
```
$ gdb test
GNU gdb (GDB) 10.2
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(gdb) b 6
Breakpoint 1 at 0x5ed: file test.cpp, line 6.
(gdb) run
Starting program: test
Breakpoint 1, main () at test.cpp:6
6 return x + y;
(gdb) p x
$1 = 5
(gdb) p y
Cannot access memory at address 0xa00000009
(gdb) info addr x
Symbol "x" is multi-location:
Range 0x5555555545e6-0x5555555545f1: a variable in $rax
.
(gdb) info addr y
Symbol "y" is multi-location:
Range 0x5555555545e6-0x5555555545f1: a complex DWARF expression:
0: DW_OP_breg0 4 [$rax]
```
Variable `x` is in $rax with value 4 (correct). Variable `y` is reportedly at address $rax+4 which is clearly incorrect. It should be in $rcx with value 10 (see below).
Objdump:
```
$ llvm-objdump test --disassemble-symbols=main
test: file format elf64-x86-64
Disassembly of section .text:
00000000000005e0 <main>:
5e0: 50 pushq %rax
5e1: e8 da ff ff ff callq 0x5c0 <_Z3getv>
5e6: 48 89 c1 movq %rax, %rcx
5e9: 48 c1 e9 20 shrq $0x20, %rcx
5ed: 01 c1 addl %eax, %ecx
5ef: 89 c8 movl %ecx, %eax
5f1: 59 popq %rcx
5f2: c3 retq
5f3: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
5fd: 0f 1f 00 nopl (%rax)
```
It's SROA that is introducing this error. See below - the `DW_OP_plus_uconst, 4` offset in `y`'s (`!31`) dbg.declare is incorrectly carried over to its dbg.value , which also incorrectly uses the value `%.sroa.0.0.extract.trunc` (which is the value of the lower 32 bits of the original alloca - i.e. variable `x`).
```IR
$ clang -g test.cpp -O2 -Xclang -fexperimental-assignment-tracking=disabled -o test -mllvm -print-before=sroa -mllvm -print-after=sroa
*** IR Dump Before SROAPass on main ***
; Function Attrs: mustprogress norecurse nounwind uwtable
define dso_local noundef i32 @main() #1 !dbg !26 {
entry:
%retval = alloca i32, align 4
%0 = alloca %struct.two, align 4
store i32 0, ptr %retval, align 4
call void @llvm.dbg.declare(metadata ptr %0, metadata !30, metadata !DIExpression()), !dbg !34
call void @llvm.dbg.declare(metadata ptr %0, metadata !31, metadata !DIExpression(DW_OP_plus_uconst, 4)), !dbg !35
call void @llvm.dbg.declare(metadata ptr %0, metadata !32, metadata !DIExpression()), !dbg !36
%call = call i64 @_Z3getv(), !dbg !37
store i64 %call, ptr %0, align 4, !dbg !37
%a = getelementptr inbounds %struct.two, ptr %0, i32 0, i32 0, !dbg !34
%1 = load i32, ptr %a, align 4, !dbg !38, !tbaa !19
%b = getelementptr inbounds %struct.two, ptr %0, i32 0, i32 1, !dbg !35
%2 = load i32, ptr %b, align 4, !dbg !39, !tbaa !24
%add = add nsw i32 %1, %2, !dbg !40
ret i32 %add, !dbg !42
}
*** IR Dump After SROAPass on main ***
; Function Attrs: mustprogress norecurse nounwind uwtable
define dso_local noundef i32 @main() #1 !dbg !26 {
entry:
%call = call i64 @_Z3getv(), !dbg !33
%.sroa.0.0.extract.trunc = trunc i64 %call to i32, !dbg !33
call void @llvm.dbg.value(metadata i32 %.sroa.0.0.extract.trunc, metadata !30, metadata !DIExpression()), !dbg !34
call void @llvm.dbg.value(metadata i32 %.sroa.0.0.extract.trunc, metadata !31, metadata !DIExpression(DW_OP_plus_uconst, 4)), !dbg !34
call void @llvm.dbg.value(metadata i32 %.sroa.0.0.extract.trunc, metadata !32, metadata !DIExpression(DW_OP_LLVM_fragment, 0, 32)), !dbg !34
%.sroa.4.0.extract.shift = lshr i64 %call, 32, !dbg !33
%.sroa.4.0.extract.trunc = trunc i64 %.sroa.4.0.extract.shift to i32, !dbg !33
call void @llvm.dbg.value(metadata i32 %.sroa.4.0.extract.trunc, metadata !32, metadata !DIExpression(DW_OP_LLVM_fragment, 32, 32)), !dbg !34
%add = add nsw i32 %.sroa.0.0.extract.trunc, %.sroa.4.0.extract.trunc, !dbg !35
ret i32 %add, !dbg !36
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWUFv4zjS_TXMpWCDpiTHPuQQx53-GuhvupGendndS0CJJZkzEqkhqdj-94uiZFtOYvdipneBFQxbElmPT8Xiq6IsvdeVQbxj2Ypl6xvZhY11d18e_m8vG3-TW7W_K2ppKiYe6_qlgRd0XlvDknuYST7PErngClHkXOVZmadpmfHb29tZlpT57XzJZVoCE4ssbOC-dboGwUXCxHLK-Jrx-_77F-m0zGuE2hYyaGs8lNaBD64rQudQQa6N0qYC6RC0KaxzWITYqXW2sQEVvAwgvseUZUAH356-3J8N9WCN1wodhI32ENAHKKRHlgztbM6HT38pUihkiB2nRdvCxPQNQMeM8WVPEsLWArtdgTYBJBMPkLNkBex2zZLVYCEYXz4_yxCczruAz89MLJhY2DYYa5CJJRPLiFNhiE3LiOgwdM7QaUa4M96DRuwTlYTx5XCZMr4kGo3U5oQz6psxvgSQXbDAstWOUPcsWwNL1qexT7zpmEeTgcoOmFjB_rzHLRE4UHrtxfi96nStrjqaAg0m1cnbMPkiYPL3oaHEXYtON2iCrCd96NLFJDhZ_K5NxZK10p6CQMHERpgrfNaYd9U1PpXKRxgff_pbvMPE4uN6RV6d8ak4RFW7d7raBGp9oDbBxQweHSJ8s2XYUtw-2s6oGN7k8U-mGALzsy7QeISPXz-_JEysaG3RYB-_fj4sN0jAOqglhTRLHjYhtERcPDLxWJlual1coD2Qp5ttPd2EpmbJh36QnynctYeSKPmBEo20t11cVbEhWCg20lQI0ihwqLQfohV0mB6QkBahh5--wK_3T0_3P_38D3qgYCFsEHAX0ARo0TU60LrM91DL7cF43yIwIfzGbqGw7Z5mTYg43OH2VjonTdjTfVrhCoPUtZ-OHuTjegVb6aGwptRVVAjpCWC3mD_P00lbTGptut2kMh0T4v3Be9NhQvqhzm6-GvjROsi7Chy21gUSI236xU-CRR5oa5QeweNITvrJ8sfZ2m6309OMHSdCPFYqZ-Ix7yqaPpZ8OIyqjYp-pUdupOlkHZ1lwwYdKFt0cTlEvg697VyBHqyptUGQ4UjkTdh8h8gZ8hmjkzc2WLdx5ge_9tevvS1bZ1vrYWudIj8HCx6lKzaDx5tGGuXBIYW3omYmxNB5Oh3AnlBG_ff7Jrc1hbFtepk49GBiEZkvISe1ioLjUP7eWtLCGcgAfJchCRCUusajyNATRG_N3yC5blD7b0H2U946WznZEEjMHWf6NhqOQEl_YRDgUQphyf3A76qonli0sDtq0iyKdPa2y34QImmMDSCLAr2HBhvr9jS4VMrRHb6TvD-WrzG0KW3sdxjuW_R1XFU0b9pD09VBTw5J-hRbT1Ey-C4bjjTD-WR8Wc7IY_KYoyF6JnVyGOqN509k9q_J7L9D5t9nU9imrXEH61_vnx4Bdy256BwLADh1Xv_6_OXrc-6w4pBS1hzYZ9cS3rGsYXO-Y3NOrI8PDlsdNvAi6w4JUSyGooZqIxhb7gfLXndQ1WcTOvAQqxS2G11sqGdRo3T1_lQoTeFTAL-xXa0gPzq_OOMw40TCI0KOtd2-LtG-5L-prmmvpUuqDye279evjsmE0rH32OQ1Toa1y5J1rExG4DHJEvIyrszSukYGwLqcp5PdYj6Zp2d5-4i5B1uCx6jAMA24O-ld_83HR4acVDAOnnw4n-QM4zRnHC4fjC_bzm_-oEJHZMfYHexjTOEClISyHD5v7AtZ12TPd1kRyTz_M6kwvBzT9AA2J7B0AYslFDMybOzLaFzxAHRWnDNYDkbFDJAKELLzG9fbpXwn-AXDqIl8RoaXH10qVfcM8MgAXwGVBEScF1eAGvtyACqOQEdnDoszW35nImx78Mc5h1KQeZFQJ4fhj7O2hNrmcxAIvIRZCYsUOB9_GF8a22576KJP24uj1w8nyzPU3n0Rj0enG9v2T7h4ZXBFKz4FJm593K9A2MjQa0VwVnUFJZ64XUHnrJvCt8MihUksDdic9_rU1p1_7gprfCDHpqQctiw9hrjmey2J4xA3Op0ls_i7BJVXU4VFLfvi7qgd9R4K6ZxGBfaF9k0WdPCxey8cNFIvPbL29syw8-gjw6EnjZRNvbNyyqd8ijsq3MM0uM4UxJWJxVHETma2jBe13aIDSATkRGC4a52utKGiqKZUABPQU5yeEs0gva_l7DgHn56u7T9o-_HX9h8waeK-edI6bcIkx9JS3b0mJ7xqizvWoemMqxg-8OkJ1iSuq4gSg-Wr9FTuHYqNQ-eh-FzBY2d6ebwPwVE8Q9P5EMsYSh_GOiw65xGM7cyWis1uG-gJegiFJZVGyttncm8duyksQScCWMrHe0yRzICJmcor-hHz064TTXD7USkqMofhRdaxmBkmTieCIknWujKQHhYYExkf92Ii62vuadjat_19IL8Qt6h1bXCnwd5BJzmGF6sVPQpNxXS0CphYNBikkkEegCLo8Satnjd31p8-nOqIfiNNn4eRZ5IfOP7sO-Nf0IX3WGU_jpX4M16Zj-Y8UqBpjyd6nhKVQ64c7M-Mbw_GQwSQRQ8zigM-DoEL9kxk8vAiBGuk5U3W2uQU-P5tAI6xj4F3PHlv1pnI-jK-tlId4n6AkZcpLobrkMvo09lyBJj_GM6zSzHBRCYucc4vc16-4izGTpBK9UtbKTB-20uKyAYOmTjHSvnB1FE66_tKpV71Gl7InN5EvRHP--OLwf9F7fxTqyM5Ce-F7Bvh-rPR2onJPhEX0C4IRUzaY5kY5upS3v9vSOpf5fQDZfY_zPR70tsz_fz5l_9_Lp2sSCvIIjqdjK8wPrJIRyz8RpehVwa_ca-F92LsvIt1IRIvDfrjg_MNmR_l3t7uO_69oolXZv86-fe0_Jp-HrLwpTf5N-ouUctkKW_wbjZf8NtFxsX8ZnNXJPMlokrThSoXi5lClScci3SRFWnOBd7oO8FFwlM-n4k0SefTW-Q8kyiKpJRJlt-ylGMjdT2Nk2VddaO97_BuPlsuZje1zLH28W8qIbbOmmqi4vt7IeLGTMQrbUpLd7L1jbuL7yPiC9WU19oHf0IOOtR4d-FvpwcmVkys3vn7yUPu7O9o-vcmtg260b63vOlcfXf-qrfSYdPl08I2w59nw8-kdfa3-KbnMT6hZ-IxPuS_AgAA__9qiP3O">