[PATCH] RISC-V: Fix the asm code for large code model

Jeff Johnston jjohnstn@redhat.com
Tue Apr 1 20:10:09 GMT 2025


Patch merged.  Thanks.

-- Jeff J.

On Tue, Apr 1, 2025 at 10:11 AM Kito Cheng <kito.cheng@sifive.com> wrote:

> The large code model assume the data may far away from the code, so we
> must put the address of the target data wihin the `.text` section,
> normally we will just put within the function or nearby the function to
> prevent it out-of-range.
>
> Report from riscv-gnu-toolchain:
> https://github.com/riscv-collab/riscv-gnu-toolchain/issues/1699
>
> Verified with riscv-gnu-toolchain with rv64gc.
> ---
>  libgloss/riscv/crt0.S              | 39 ++++++++++++++++++++++++++++++
>  newlib/libc/machine/riscv/strcmp.S |  9 ++++++-
>  2 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/libgloss/riscv/crt0.S b/libgloss/riscv/crt0.S
> index 54443e412..aa5ac3684 100644
> --- a/libgloss/riscv/crt0.S
> +++ b/libgloss/riscv/crt0.S
> @@ -27,8 +27,13 @@ _start:
>  .option pop
>
>    /* Initialize jvt CSR (reg addr: 0x0017) */
> +#ifndef __riscv_cmodel_large
>    .weak __jvt_base$
>    lla a0, __jvt_base$
> +#else
> +  la a0, .Laddr_jvt_base
> +  ld a0, 0(a0)
> +#endif
>    beqz a0, .Ljvt_init_end
>  .option push
>  .option norelax
> @@ -38,21 +43,38 @@ _start:
>  .Ljvt_init_end:
>
>    # Clear the bss segment
> +#ifndef __riscv_cmodel_large
>    la      a0, __bss_start
>    la      a2, _end
> +#else
> +  la      a0, .Laddr_bss_start
> +  ld      a0, 0(a0)
> +  la      a2, .Laddr_end
> +  ld      a2, 0(a2)
> +#endif
>    sub     a2, a2, a0
>    li      a1, 0
>    call    memset
>  #ifdef _LITE_EXIT
>    # Make reference to atexit weak to avoid unconditionally pulling in
>    # support code.  Refer to comments in __atexit.c for more details.
> +#ifndef __riscv_cmodel_large
>    .weak   atexit
>    la      a0, atexit
> +#else
> +  la      a0, .Laddr_atexit
> +  ld      a0, 0(a0)
> +#endif
>    beqz    a0, .Lweak_atexit
>    .weak   __libc_fini_array
>  #endif
>
> +#ifndef __riscv_cmodel_large
>    la      a0, __libc_fini_array   # Register global termination functions
> +#else
> +  la      a0, .Laddr_libc_fini_array
> +  ld      a0, 0(a0)
> +#endif
>    call    atexit                  #  to be called upon exit
>  #ifdef _LITE_EXIT
>  .Lweak_atexit:
> @@ -66,4 +88,21 @@ _start:
>    add     a2, a2, a1                 # a2 = envp
>    call    main
>    tail    exit
> +#ifdef __riscv_cmodel_large
> +.Laddr_gp:
> +  .dword __global_pointer$
> +.Laddr_jvt_base:
> +  .weak __jvt_base$
> +  .dword __jvt_base$
> +.Laddr_bss_start:
> +  .dword __bss_start
> +.Laddr_end:
> +  .dword _end
> +.Laddr_atexit:
> +  .weak   atexit
> +  .dword atexit
> +.Laddr_libc_fini_array:
> +  .weak   __libc_fini_array
> +  .dword __libc_fini_array
> +#endif
>    .size  _start, .-_start
> diff --git a/newlib/libc/machine/riscv/strcmp.S
> b/newlib/libc/machine/riscv/strcmp.S
> index 12c39db94..cc29b7b8b 100644
> --- a/newlib/libc/machine/riscv/strcmp.S
> +++ b/newlib/libc/machine/riscv/strcmp.S
> @@ -188,9 +188,16 @@ strcmp:
>    foundnull 1 3
>    foundnull 2 3
>  #endif
> +#ifdef __riscv_cmodel_large
> +  # Put the data within the funciton for large code model to prevent
> +  # the data put too far.
> +.align 3
> +mask:
> +.dword 0x7f7f7f7f7f7f7f7f
> +#endif
>  .size  strcmp, .-strcmp
>
> -#if SZREG == 8
> +#if SZREG == 8 && !defined(__riscv_cmodel_large)
>  .section .srodata.cst8,"aM",@progbits,8
>  .align 3
>  mask:
> --
> 2.34.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/newlib/attachments/20250401/3d56a50c/attachment.htm>


More information about the Newlib mailing list