<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">