<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55628>55628</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Wrong relocation under ARM RWPI relocation model
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Acciente717
</td>
</tr>
</table>
<pre>
TL; DR: Two global variables are relocated to the same address.
Reproducible code example here: https://github.com/Acciente717/rwpi-bug
The C code snippet fetches and adds global variables.
```c
extern int vola1;
extern int vola2;
extern int vola3;
extern int vola4;
extern int vola5;
int main(void) {
vola1 += 1;
vola2 += 2;
vola3 += 3;
vola4 += 4;
vola5 += 5;
return 0;
}
```
The disassembly of the compiled code shows that `vola1` and `vola4` are relocated to the same address.
```
080001a8 <main>:
80001a8: f240 0000 movw r0, #0
80001ac: f2c0 0000 movt r0, #0
80001b0: f859 1000 ldr.w r1, [r9, r0] ; fetching vola1 from [%r9 + 0]
80001b4: 3101 adds r1, #1 ; vola1 += 1
80001b6: f849 1000 str.w r1, [r9, r0] ; storing vola1
80001ba: f240 0008 movw r0, #8
80001be: f2c0 0000 movt r0, #0
80001c2: f859 1000 ldr.w r1, [r9, r0]
80001c6: 3102 adds r1, #2
80001c8: f849 1000 str.w r1, [r9, r0]
80001cc: f240 0004 movw r0, #4
80001d0: f2c0 0000 movt r0, #0
80001d4: f859 1000 ldr.w r1, [r9, r0]
80001d8: 3103 adds r1, #3
80001da: f849 1000 str.w r1, [r9, r0]
80001de: f240 0000 movw r0, #0
80001e2: f2c0 0000 movt r0, #0
80001e6: f859 1000 ldr.w r1, [r9, r0] ; fetching vola4 from [%r9 + 0] again ???
80001ea: 3104 adds r1, #4 ; vola4 += 4
80001ec: f849 1000 str.w r1, [r9, r0] ; storing vola4
80001f0: f240 0104 movw r1, #4
80001f4: f2c0 0100 movt r1, #0
80001f8: f859 0001 ldr.w r0, [r9, r1]
80001fc: 1d42 adds r2, r0, #5
80001fe: 2000 movs r0, #0
8000200: f849 2001 str.w r2, [r9, r1]
8000204: 4770 bx lr
```
My toolchain version is
```
clang version 14.0.4 (https://github.com/llvm/llvm-project.git 5f66e721ec1d099cf2370235ce122cf47c287308)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: ~/opt/llvm-14/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytV9uO6jYU_ZrwYg1yHOf2wMMMHKoj9UjVdKTzWDmxA25NjGwHmL_vdi6QMDAtmoMQibNvy8vL8abQ_H3x9nsQvaDVaxA9o7ejRhulC6bQgRnJCiUsYkYgI5QumRMcOY3cViDLdgIxzo2wdh7gVYCfu99XsTeaN6WEWFRqLpA4sd0eBlthhC-ydW5v4SYga_hupNs2xbzUOxg8l6UUtRNpmMLIHPfyqWg24_RvUHvZ5bW13O-FQ5Vw5dbjrLlHZD_MYIIvSHD3LbuxODlhaiRrhw5asRDIuGkg9wzRPQO9Z4jPhu7XP98xWQckO2jJA5KjIO09EHxaXCggL0G0QheAg4kMJvLBFA2m6IOJDib6wRQPpmug3sEI18Bc8MWUrq6YvV4vLi2zVuwK9Y501coHlnsvFcipW8mtPlp4zhyC8G4ZEtwuaD-m7fj_CnEKBGcY45BlKIiWLc3RN6--bka9rX2QV4RiBA8wgsFOH45wMTggSyAkwpOIcogoJxHubkSB-4gszlHYRyhu5m2RsA2JX0zubyBDvEJ-W7balvWm10Bl9M67BSQ2uV8l5D0nZWhXJgpxiNoPDPyuuFQhUW9pK1yJa5wqGRDTC2Lr_gOxddqcAU_SsSnJ2S2Ss0mEeJTkkjxI8iQ4OVNH7lJHJhHZgwxNgsspH_QWH3QcwfGjfHD6BT54duYjustHNIlgX-CDi0c3oSCP8iGSL29CemcTIraBdwv4r_vvuCw7M0nvMkmvNuXoBT1OVX51U07SVXhMejgVYXhLhBUdkx5OSQ9vkV5lI9L9gwnpeAo5vFJF1c8XpPxxU5J-ll3ReBLXq4l4ioY4gGnvaQMcR8ySHuaZWfIpTIJ7VmiaXsoVJz9R88np-OMdjjGtyq2XzkEYKzW0CfZmRKmYX8HeKaRzPPcSyT5pp5Q6DJcn6Mr-FqWbgwOKqyQRKQExwTslz8uKRCkGAksRElJWNC1JlkY4g06kP8WZ2Qjnm7dTlvyV0Kem_qfWx_pJybo5PW3qZjjtjWAc7eBQV957r608dabvtXVMwZG_ksabgvQbQNN7NwAMKdwVcDy37mvdwOlfQgsgORz36LflEvqnNgVzQECbgqwba3y8LPzU4Y1K1j3ACzCyzn59yp6XP4UCTqEZ-QW5lmdgu0Y56YMgydz3WRTvEvqZV0R6t-F8uu12OvudBsfzDD4relbijC8inkc5mznplFj8NBo02fdkXpbAsDDo-fUHev35x_expdXErDFq8ZhgYSitbYSFmzhOSDbbLqo8E5hilqRpldJQ5GECjU9VJDwvcprxmWKFUHbRvqRJLY6oTQH3sG1nckEwITgmob_G-TxMOU9EHidphfMkJjB1AY2imnscc202M7NoIcF_EQtGJa2zFyP0tnJTC9GWg_yscVttFqP_MrO2_KKF_y-HA5ea">