<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/95864>95864</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Inconsistent debug information of static global pointer, compiled with "-g -O0"
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
edumoot
</td>
</tr>
</table>
<pre>
We use more brief source code from > https://github.com/llvm/llvm-project/issues/95512, with different optimization level `-g -O0` to expose more.
Problems: The dereference of `global_pointer` is `3` on line 16 and it continue to point to `3` on line 24, but the data that the `golbal_pointer` points to is changed to `0` while the value of the `global_pointer` is still the same when we step in continuously. This issue leads to a wrong return value `0` (the correct should be `3`).
```
* thread #1, name = 'case_O0.out', stop reason = step in
frame #0: 0x00005555555551cc case_O0.out`func_1 at case.c:16:13
13 ptr_global = ptr_local_var;
14 *ptr_to_global_pointer = &local_var;
15
-> 16 return *global_pointer;
17 }
18
19
(lldb) fr v
(int *) ptr_global = 0x00007fffffffd864
(int) local_var = 3
(int *) ptr_local_var = 0x00007fffffffd864
(int **) ptr_to_global_pointer = 0x0000555555558040
(lldb) ta v
Global variables for /home/ad/Downloads/lldb/reproduce_bug/case.c in /home/ad/Downloads/lldb/reproduce_bug/case_O0.out:
(int *) global_pointer = 0x00007fffffffd864
(int) global_var = 7
(lldb) p *global_pointer
(int) 3
(lldb) s
Process 37174 stopped
* thread #1, name = 'case_O0.out', stop reason = step in
frame #0: 0x000055555555515b case_O0.out`main at case.c:23:21
20 int main(void)
21 {
22 int a = 0;
-> 23 printf("%d %d", func_1(), *global_pointer);
24 a += *global_pointer;
25 return a;
26 }
(lldb) ta v
Global variables for /home/ad/Downloads/lldb/reproduce_bug/case.c in /home/ad/Downloads/lldb/reproduce_bug/case_O0.out:
(int *) global_pointer = 0x00007fffffffd864
(int) global_var = 7
(lldb) p *global_pointer
(int) 3
(lldb) s
Process 37174 stopped
* thread #1, name = 'case_O0.out', stop reason = step in
frame #0: 0x0000555555555174 case_O0.out`main at case.c:24:11
21 {
22 int a = 0;
23 printf("%d %d", func_1(), *global_pointer);
-> 24 a += *global_pointer;
25 return a;
26 }
(lldb) ta v
Global variables for /home/ad/Downloads/lldb/reproduce_bug/case.c in /home/ad/Downloads/lldb/reproduce_bug/case_O0.out:
(int *) global_pointer = 0x00007fffffffd864
(int) global_var = 7
(lldb) p *global_pointer
(int) 0
(lldb) s
Process 38123 stopped
* thread #1, name = 'case_O0.out', stop reason = step in
frame #0: 0x0000555555555183 case_O0.out`main at case.c:25:12
22 int a = 0;
23 printf("%d %d", func_1(), *global_pointer);
24 a += *global_pointer;
-> 25 return a;
26 }
(lldb) fr v
(int) a = 0
```
Source code: `cat case.c`
```
#include "stdio.h"
static int global_var = 7;
static int *global_pointer = (void*)0;
static int func_1(void)
{
int *ptr_global = &global_var;
int local_var = 3;
int *ptr_local_var = &local_var;
int **ptr_to_global_pointer = &global_pointer;
ptr_global = ptr_local_var;
*ptr_to_global_pointer = &local_var;
return *global_pointer;
}
int main(void)
{
int a = 0;
printf("%d %d", func_1(), *global_pointer);
a += *global_pointer;
return a;
}
```
Environment: The problems can be reproduced in LLVM 18.1.2, LLVM17.0.6, and LLVM16.0.3. In these environments, the variable `a` and the dereference of the static global pointer `global_pointer` compiled with `-g -O0` and `-g -O3` are inconsistent (0 and 21845). However, their debug information one line 25 emitted in LLVM14.0.6 with `-g -O0` and `-g -O3` are consistent ( both are 0).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWFmP27AR_jX0y2AFiTosP_jBycZtgBQp0KB9XFDiyGJBkwZJ2Ul_fUFKsuRjD2wTBChiLLQixRnO8X08hlkrdgpxTfIPJH9csM612qyRd3ut3aLS_Mf6XwidRdhrg1AZgQ1Y3ZkaodYcoTF6DyT9BK1zB0vSDaFbQrc74dquimq9J3Qr5XH893Aw-t9YO0K3wtoOLaHbVZ4nlNCPcBKuBS6aBg0qB_rgxF78hzmhFUg8ogRSxA87ePgakyIGpwG_H_RgW0TiRxJv-uffja4k7r098K1F4GgwaK0RdOPV7KSumHw6aKEcGq9OWN-f-lfwEwqFkBTAFAfhoNbKCdWhnzUI-Zeb8TTzflSdA-dnZY6Ba1nf8pNqeTVpeLVel7BQt0ztkA-ag4-nVkgM4kcmu2D8qOueA9YJKcMIy_YIcGpRwQnBOjyAUKMXurPyRwTfWmEhpAEkMh7MYHAyWu3AoOuMGmYdrSG09LprbQzWDmyrO8mhwjEQhK7GNBTx8Nc36QZca5BxIDRNfJCUN5Ckj0DosmYWn77Gke4coUv_1Tp9AIPMahUGDQ702gAAGhPkaRr7HMff4ziO8_GX1DXMdRZx06n6KQHmQn9Uk3STFP6RnlUmKQCJV175wZmnPr5hct-Uumby6cgMST9MIlkvQujGj3H66TIrg3_FfeE8CPftB0-hpDhbMISf0M1VnucKlr2C5ePUVc50-vZq1ia0lJJXhK6gMXA8d3owE7rx_VeO92FdNv2Pl0U2F_ICZ8_C-PQ5nZfDXlbby51F7wf1MuFlnMU3Pjo2-viX3qMjM4JVEi002gCh21bvkdAt44RuH_VJSc24DQuV17A1eDCadzU-Vd2O0G2PHE-j98mOaEw398L0rJMvhX8QGgO7vAnC4Q6ErnSkN0L2vIjWaC2ky2SZBUYekP8ePufVFZ_3TKgLNtPUP5KzQhoH5PsA-7GElkctOKETN2gy0GdiFKVnAnpB1mfhzLlAUjosEwcjlGsILQmlhOY-EDkP7x-hX23Ct5Vv3-aAruZMptl5XgaEfujD-AL1aX69UrCLz8XlyvCHFf-XrFhmr7Ii83tc8grmX4C8HzDbF38W5nsmvRf1fyD_SyB_u4VeQ75MaPp7IV-mr0I-95Cnb13TfxHAZ4v6G7Dd0-Hda_r1ac73jX7ePY3fPP8x3eh81EkR11NMi2e00FSoWnbcZ4tax4WOWh-rmV7rmBN1CPwNQkffZmNuIjTgaNi7PT2mzN1InxN0sdPP17pxkqtjLqHFZN085mH89RH3-vug73LYc4d-mA64L94YngHKpOetV5R33E0m2VdvIRMaZ8_nzlw3mbjh4s-k3xv3lFuuTT5d4v2TOgqj1R6VG8sKh6HMADVT_hp8Xuy53xy-fPnn3yApoyQKDvhmsoziqPAtpnjfU0RxlEYAn5W_t1sEnOaxfmR_-e93LM9M5m_iXtzdFjbCzb9nxACOc7bvVQxqvT8IibyvvFwUV_wEY0eocTCDIFStlRXWYUBx2Q-jSZnl_uoPf9UnPPpMBKuFAY5VtwOhGm32fR1HKxxKJTngXjg3xSrJfHB6W14xJlhzaQtU2rWhf1aGWPB1ylfpii1wnSyTsiiK5SpbtOtlXuVN2iS85k2JqzRDXqasWJU0Z2UdrxZiTWOaxUWypCkt0ixa5rxKYpbGdRpj1mQki3HPhIykPO4jbXaLUElZr_KyyBaSVShtKKtRqvDUl1k8lPPHhVmHUljV7SzJYimss5MWJ5zE9ed5pO9EsbmfZh_5q6RSOsSR0kVn5Pp_qdN5z45r-t8AAAD__5do2bs">