<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/202150>202150</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISC-V][lld] ld.lld medlow abs HI20 overflow not prevented by GP relaxation
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
XiaobingHou1219
</td>
</tr>
</table>
<pre>
I ran into this while reducing a RISC-V linker testcase. The reproducer is small, and I have been seeing the same result consistently across three reruns.
### Summary
GNU ld 2.45 links the legal input and rewrites both absolute data accesses to `addi t0,gp,-0x10` and `addi t0,gp,-0x8`, but ld.lld 21.1.3 and 22.1.0 reject the same link with `R_RISCV_HI20 out of range` before applying gp relaxation.
### Expected behavior
Link a medlow RV64 executable whose absolute `%hi/%lo` data references become legal only after gp relaxation.
### Environment
- linker route: llvm-mc 22 plus GNU ld control and ld.lld replay
- march: rv64i
- mabi: lp64
- first failing stage: link
- local stability check: True
### Reduced testcase
These are the reduced input files from the minimized reproducer I used locally:
#### `case.s`
```asm
.text
.global _start
_start:
.ifdef __medany__
.option pic
.ifdef __undefweak__
# Refer to undefined weak symbol by GOT_PCREL.
la t0, symbolW
.option nopic
.else
# Refer to global data symbol by GOT_PCREL.
la t0, symbolG
.option nopic
# Refer to local data symbol by PCREL.
lla t0, symbolL
# Refer to non-pic data global symbol by PCREL.
la t0, symbolG
.endif
.endif
.ifdef __medlow__
.ifdef __undefweak__
# Refer to undefined weak symbol by absolutely access.
lui t0, %hi(symbolW)
addi t0, t0, %lo(symbolW)
.else
# Refer to local data symbol by absolutely access.
lui t0, %hi(symbolL)
addi t0, t0, %lo(symbolL)
# Refer to global data symbol by absolutely access.
lui t0, %hi(symbolG)
addi t0, t0, %lo(symbolG)
.endif
.endif
.size _start, .-_start
.data
.global symbolG
symbolL:
.dword 0x1111222233334444
symbolG:
.dword 0x5555666677778888
.ifdef __undefweak__
.weak symbolW
.endif
```
#### `layout.ld`
```ld
/* text: in the 32-bit address range.
data: far away from text. */
ENTRY(_start)
MEMORY
{
rom (rx) : ORIGIN = 0x10000, LENGTH = 0x1000
ram (!rx) : ORIGIN = 0x800000000, LENGTH = 0x1000
}
SECTIONS {
.text : {
*(.text*)
} >rom
.data : {
*(.data*)
} >ram
__global_pointer$ = .;
.got : {
*(.got*)
} > ram
}
```
### Reproduction notes
- This packaged root does not have a single canonical `run.ps1` wrapper.
- Use the reduced inputs under `case/` and follow the commands documented in `case/README.md`.
- Stable witness outputs, when present, are preserved under `verify/run1..run3/`.
### What I checked
- Reduced inputs are preserved under case/.
- Stable witness outputs are preserved under verify/run1..run3/.
- The strict recheck says stable normalized run signatures across three runs: True.
- Tracker guidance link: https://llvm.org/docs/HowToSubmitABug.html
- evidence summary: 3 clean reproductions under hunt/verify/lld_medlow_abs_hi20_overflow_not_prevented_by_gp_relaxation/run1..run3 show stable assembly success for medlow.o, stable GNU ld outputs whose bfd.objdump.txt begins with `addi t0,gp,-0x10` and `addi t0,gp,-0x8`, and stable ld.lld 21.1.3/22.1.0 failures whose stderr files report out-of-range `R_RISCV_HI20` against `symbolL` and `symbolG`.
### Notes
upstream////binutils-gdb//ld//testsuite//ld-riscv-elf//code-model-relax-medlow-01.d and code-model.s
Root key: `lld.riscv.medlow_abs_hi20_overflow_not_prevented_by_gp_relaxation`
Case id: `20260527-lld-medlow-overflow-before-gp-relax`
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysWN1u27gSfhrlZmBBpizZvshFmr8GSNOFk-2evTIocSSxoUiBP3a8T39ASrKdxMnZFqcwGokcfvNxZjicETWG1xLxPMq-RNnVGXW2Ufr8P5yqgsv6q3JTMl2eFYrtzu9AUwlcWgW24Qa2DRcIGpkruayBwuru8XLyAwSXz6jBorElNRjDU-PFOq2YK1EDN2BaKkRELoFKBnfQ0A1CgSjBIHos2yAY2vplxgkLpZKGG4vSih3QUitjwDYavYB20sRRchUlF8P_JO1_8OjalupdP3z78CcIBiSeZYGiCVoE1lQAl52zgYzGreYWDRTKNkALo4SzCIxaCrQs0Rg0YBVEeUIZ42CTiFzWXUQuJ8nLNInyJMCcnF5EuX-FwlkQLBaezTSexmlYQkg8jRPQ-BNLe7CApwpbbhuPuVp7G_9Yf70jCShnQVXeKTV6vQVWSiPQrhM7b8S6A42CvlDLlfzAQtcvHZYWGRTY0A1Xuhe490optMiE2sLqRz4DfMHSWVoIhG2jDB5sE3aVNTwiNxHJhPJcgr00VqhRlt6aWKp2tLaS3ouVRf3vOMoN10q2KG0_NRlDTCtnMUovQIhNO2lLIAQ64QwMvi6VtFqJYN7B4Bo7QXcjTkt12XgAvcln_DBa8IDa5bNxrOLaWKgoF960xtK6V8zl856UKqnwUwUX3O6gbLB89kJP2uHpra384UG2Pyv9_FOD3r4aQxToQaaP0YoLNFBp1YbJlkve8n-QHR-wO3AGWc9H7KL04qRyrz_Kk3BEjfdhP50n_Y-adly2jC2-2MNbLVRBBayNpXoYHp5fq4p5xbCC9bpFRuVuvT5AqM47HDpevhF1kmG1Rfp8JN1bqvI5RUEQ4BIZeCkwu7ZQAood3H5_Wv9xubq-34fRUtAoWYYjOMj99Y6BVAcOKAyeVjrsOET1r2m8_UzjWzV9BL3R8lbDOxX3p8GkkpOOlz3csIGPUT_gHaNkvHr__N7BQm1Hl_0fnDkml5DufdY9our4nuuQdxajd8lyL-bT715uLy3UCelPHH_SI79F7v6XyL2S_heh-FuUbn-J0u2RvT4KimVs-D84ZgZyCfHkOEscxDz9dwnlVeSNdkiPV22VZlGyTF6m0-mUEELSNE1ns9nseM3tB2uyLMvyPM_n8_l8sVgsTkbyqZCN_XuULF_lkFcbH5PmZ4lW0J1yNhbsfa4VbFxyE5ELCNk2vQAuQ45PyaTgFihjGo3p7_vBvQAhELxwRTXQLd0NdwO-2BgiEiCPSF0_PK3-jshi9NDg0W_X376v_h4E51_2O_dQEVnol4gsAbya76u727sHiNIr8PVOkoRIub9-uH36ejR6QKABISLTHuQdxiIZ_n2GM7_qHx6vL5_uvj88wjHJcDsF4OPRcG4uIrLoLy__eHSi5lcQpddatacC8xOsYO3TWPQt1nrdx_W6U1xa1BGZhZ3FUfrlrdpafbaDWn2wAThoHU30eSzCaigThqvIohnLlydf03e0fKa1LyeUssAUGi_UF-gUDJe1QCipVJL7xBjliXYy7szUF31bTbsOdTwi_mlOVDAmJH09lh4-PoeauVLCV5t-RanalkpmgKnS-cIvrD5as7q-uPp2Hbf-MO31PQ7lKbfSHxTlrNfn42rboIROo_E1pG87NPaveoPsQGiDmle7iNxoJ6dxrJ1Me34fVKZ_NdTCXV_oIRtprF5v95SuYRf_g_nJpac5xgcvIhireWlBYyAGhu5MKEsFglS6paIvGJ0E3_xR6zSaN12Vk2asXA_Qmpa-6q4dZ1SWfWvipRprOy8e0teNr8VjpeuI3DBVmojcfFXbJ_Xoipbbiy-ujhvbihEUN5z5FgHM0KulF5BCKZDKfUnrY3UMm8Z5D97srSAEG6sPWph1w0myVhvUlR-Ryq47jZsQQOtit6679aHdeGVDMI3ajlaixmBbiB0YFy5TqJQemqFYhRqplxvajNFdfV9UVCxWxU_m2i62LxYKrLk0-xbut7tGLzDofdU8RuRmaB19dxJ82RMxlqHWQ8egsVPaeqoTVU3CHfK2oQwsasqlsX5qvIAP3Mbr9cPz8HDIJ64zViNt-5jofwWXznJhJjUrhlhh_V_f_xjHLY7DE81NuZmgqPqRUjGctIqhmAQHTnpvTJJpzAK9g0BsjsmtfB57xhBX_qYVLA7Q8e8GzZhYL6lB4GzAJQnJk4zMJ0KwkduIOOkb80nd9dz3EGfsPGXLdEnP8Hw6XySLNM8X-VlzTtM8K4qMkpzNZjNcZiWy-bIii2lFS8zLM34eFObJfEqyKcljRhZzukhLypJkmS3m0SzBlnIRj6fxjBvj0C-bZsmZoAUKEz76ECK8F0iUXZ3p89BIF6420SwR3FhzALDcivCdqP_ME2VXUfbFr82uxoAcvhfQwkD_hWKwQLhD9jYNrdMfR33_mdPi_HUSqbltXBGXqh0yyvBn0mn1E0ufAsKGfHoZ9rQ5J_8NAAD__2XAuQc">