<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/71904>71904</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[compiler-rt][builtins][aarch64] Functions defined in lse.S will cause link error if .text and .bss more than +-4GB range.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
twakatsuki
</td>
</tr>
</table>
<pre>
lse.S uses the adrp instruction to load the value of the __aarch64_have_lse_atomics variable from .bss section so .text and .bss more than +-4GB range, link error will occur even if all libraries were built with -mcmodel=large.
example C code (test.c):
```
void __aarch64_ldadd4_acq_rel(int *dst, int *src);
int x;
int y;
int main() {
__aarch64_ldadd4_acq_rel(&x, &y);
return x;
}
```
example Linker Script (test.ld):
```
MEMORY {
ROM (rx) : ORIGIN = 0x0000000000000000, LENGTH = 128M
RAM (rwx) : ORIGIN = 0x0000000100000000, LENGTH = 128M
}
SECTIONS {
.text : { *(.text*) *(.rodata*) } > ROM
.data : { *(.data*) } > RAM AT > ROM
.bss : { *(.bss*) *(COMMON) } > RAM
}
```
Checked with the LLVM git main branch HEAD.
> $ clang -v
> clang version 18.0.0 (https://github.com/llvm/llvm-project.git 0f7aaeb3241c3803489a45753190e82dbc7fd5fa)
> Target: aarch64-unknown-unknown-elf
(Actual PATH is omitted like _/path/to_.)
$ clang --target=aarch64-unknown-elf -march=armv8-a -mcmodel=large test.c _/path/to_/crt.o -T test.ld
```
aarch64-unknown-elf-ld.lld: error: /path/to/libclang_rt.builtins-aarch64.a(outline_atomic_ldadd4_4.S.obj):
(function __aarch64_ldadd4_acq_rel: .text+0x0): relocation R_AARCH64_ADR_PREL_PG_HI21
out of range: 4294967296 is not in [-4294967296, 4294967295]; references '__aarch64_have_lse_atomics'
>>> referenced by outline_atomic_ldadd4_4.S:250
(/path/to/libcompiler_rt/lib/builtins/outline_atomic_helpers.dir/outline_atomic_ldadd4_4.S:250)
>>> defined in /path/to/libclang_rt.builtins-aarch64.a(cpu_model.c.obj)
clang: error: ld.lld command failed with exit code 1 (use -v to see invocation)
```
I have confirmed that the following patch fixed the link error.
```
diff --git a/compiler-rt/lib/builtins/aarch64/lse.S b/compiler-rt/lib/builtins/aarch64/lse.S
index 1fe18f4a4681..8ef166616d48 100644
--- a/compiler-rt/lib/builtins/aarch64/lse.S
+++ b/compiler-rt/lib/builtins/aarch64/lse.S
@@ -30,6 +30,9 @@
#if !defined(__APPLE__)
HIDDEN(__aarch64_have_lse_atomics)
+ .align 3
+.L__AARCH64_HAVE_LSE_ATOMICS:
+ .xword __aarch64_have_lse_atomics
#else
HIDDEN(___aarch64_have_lse_atomics)
#endif
@@ -132,8 +135,10 @@ HIDDEN(___aarch64_have_lse_atomics)
// Macro for branch to label if no LSE available
.macro JUMP_IF_NOT_LSE label
#if !defined(__APPLE__)
- adrp x(tmp0), __aarch64_have_lse_atomics
- ldrb w(tmp0), [x(tmp0), :lo12:__aarch64_have_lse_atomics]
+ adrp x(tmp0), .L__AARCH64_HAVE_LSE_ATOMICS
+ add x(tmp0), x(tmp0), :lo12:.L__AARCH64_HAVE_LSE_ATOMICS
+ ldr x(tmp0), [x(tmp0)]
+ ldr w(tmp0), [x(tmp0)]
#else
adrp x(tmp0), ___aarch64_have_lse_atomics@page
ldrb w(tmp0), [x(tmp0), ___aarch64_have_lse_atomics@pageoff]
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycV1tv6rry_zTmZZQocS6EBx7CbbV_QVu1_W_pPEVO7IB3nZjjOMD69kd2CLfSrt2NEMGezG_GczdpGr6uGRujaIKi2YC0eiPVWO_JB9FN-8EHuaS_x6Jh7hu0DWtAbxgQqrbA60arttBc1qAlCEmoJe6IaBnI0i6yjBBVbOIw25Ady0TDMqJlxYsGdkRxkgsGpZIVuHnTQMM6uEaCq9lBA6lpR6mkYqA3pAaEJ074awKK1GuG8BQErz-AKSUV7LkQIIuiVcB2rAZeAhECBM8VUZw1sGeKQd5yoWHP9QacqqgkZQIFM0HUmrnImyEv7X7ZgVRbwWAKhaQMEE40a7RbIDxCwfEdFHvHr13uJKcXZxaUUBpmpPhvpphAOOG1BoRT2mij-XHVqA5ycinc0A6nPbP6feeNivAa4QThEaDhkfqdfITjg5GMcPz7UiaAYrpV9YVINJzdPWJvlSWvP5iCt0LxrT4ZR9BvrLOar55f_3OhKbw-rwyrOpgTAApSeH59_PX4BCiYgXfwbj5G9eX86df7g33Bx8nqhJR2SHsL9RWS_0ek87Ht79t8-v74_PR2qXQXmkYEGk6MAxFO7J79O-p3lKREk35vOAMUzM2BTzCGfAtzjyVdQfp-w22T4oY3b5orDabPq9Xz0w3U986dbljxwWiXHCZ_l8u_VrDmXaRBrkhdbOBhns6uMsVgIxxCIUi9Bmd33u12dkw1Jq_9xPVcz_hpo_W2MXGCFwgv1lxv2twtZIXwQohd_3C2Sv7NCu0aDbxySAjLAxz6RZB4QZiMSBgNo8AfeSzBNC-GJY1KYgLwJP_dZLU2hjrmhNPWH7Xc16cnE-XVUXCSFrolAl7S9wfgDciKa80oCP7BIEN4sSV6g_BCy8w9yzqf3tFHmbNbkUyU4FRm0xBVtUsc8qkEQVdkbiQhvCiUdiU479An2j0H3hHpCOoKQY0NbJW0UXOBbWzNc6t8prRrqyOvG-cI5RKEE9lqweu-dvd1JXTfXJn_fZXxOCnbuqviX9ahIIVjvky8g9exg2JCFsQyvmZp-jp9iMMsnb1mL6_zZfbyK3t4xD50UmSrTYPpWkCQQohH4Sge4lFsHFZLDbwGFE2cM8Ek_GkVoWiGggkoVjLF6oI1gPDw616F8PAUUt33zEoh_w1f2gcFKY48OBnnjuFlteWCqUzpbgPhRe8DhBc3yBsmtkw1LuXqM_FW7GUmHNWmrOQ1o9Y-P4yBYttmNlLdove6BbdcV9HVBRwUsqpMAy8JF31NYQeuu3bqmzLQNgycnRkfGsaA17tjCJw1vw7vRzCugULWJVcVMwMH0bZQlVIIuef1GrZEFxso-YF188h5PnDvYlJeluA4psQQk2ZHfzj3_XG0iCHZmSj_MUvfvSk7gF8yPylDEsaJ77oJK_04jv2Yhgn4nheHYfey4zj_Qrc-6Cbd91-rikIPhR44gemasRnA7L8RdIRjR-ofOOAlIOwfIw3hJMvSl5flPMtOXoWHx9ls_mRpX-fcqbRO4PhxieDrGoITwV1mp1rxkP41z5Zv8yx9f149Tt8uatIZ4LCXin4zlZ5PwUTDPmv7Z3Utb015eW08P8AITxNjPT-IEJ763tF-P4Y3HRNWpFASSqn6pmxGcJIzYYbeWsLybQ5kR7gwI3Y_NFSW6f_-f_WSPS6yp-d3Y6-O7Sfuc3pz2nsAABzM-FdtbcHB0z-a98QvqMrNc3_Nj6LJDSIKUiF9jIL0G-xo9snfXyj4bdh8xqBwB-NLDX8ELqi6B35jgTsn6xm_N13PeBPQV-b55LyvLRx6W7K-BfnHTvwzsizL81n7Kj2g44COghEZsLEfj0axFwWjcLAZ-wUN42HhM-JTfxQHeUyCKGBlFBX-sAjKAR9jDwe-73teEsRB6I4i3y_LyM_pMMAl81HosYpw4Zph05VqPeBN07Lx0B954cDmRWNvxhjXbA-WiDA2F2U1tgNq3q6N8oI3ujmjaK6FvVJflttohqLJqdbaVV9uoxksjlNTc9miuxZjb7UFMb3y4q7Ly394R3YHrRLjnw3cCC_sYU1PsMb4XwAAAP__x126bQ">