[PATCH] RISC-V: Fix incorrect DW_AT_high_pc after linker relaxation

Kito Cheng kito.cheng@gmail.com
Mon Feb 10 09:05:41 GMT 2025
Could you try to add a testcase for this fix?

On Mon, Feb 10, 2025 at 4:17 PM Yu-Cheng Liang <yclwlcy@gmail.com> wrote:
>
> Fix the issue reported in https://sourceware.org/bugzilla/show_bug.cgi?id=28878
>
> Signed-off-by: Yu-Cheng Liang <yclwlcy@gmail.com>
> ---
>  gas/as.c              |  4 ++++
>  gas/config/tc-riscv.c |  9 +++++++--
>  gas/config/tc-riscv.h |  3 +++
>  gas/dwarf2dbg.c       | 28 ++++++++++++++++++++++------
>  4 files changed, 36 insertions(+), 8 deletions(-)
>
> diff --git a/gas/as.c b/gas/as.c
> index 449167db595..4f41029caa0 100644
> --- a/gas/as.c
> +++ b/gas/as.c
> @@ -1464,6 +1464,10 @@ main (int argc, char ** argv)
>       directives from the user or by the backend, emit it now.  */
>    cfi_finish ();
>
> +#ifdef md_insert_uleb128_fixes
> +  md_insert_uleb128_fixes ();
> +#endif
> +
>    keep_it = 0;
>    if (seen_at_least_1_file ())
>      {
> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
> index a915c8b4995..d1142ec4075 100644
> --- a/gas/config/tc-riscv.c
> +++ b/gas/config/tc-riscv.c
> @@ -5623,8 +5623,6 @@ void
>  riscv_md_finish (void)
>  {
>    riscv_set_public_attributes ();
> -  if (riscv_opts.relax)
> -    bfd_map_over_sections (stdoutput, riscv_insert_uleb128_fixes, NULL);
>  }
>
>  /* Called just before the assembler exits.  */
> @@ -5635,6 +5633,13 @@ riscv_md_end (void)
>    htab_delete (riscv_pcrel_hi_fixup_hash);
>  }
>
> +void
> +riscv_md_insert_uleb128_fixes (void)
> +{
> +  if (riscv_opts.relax)
> +    bfd_map_over_sections (stdoutput, riscv_insert_uleb128_fixes, NULL);
> +}
> +
>  /* Adjust the symbol table.  */
>
>  void
> diff --git a/gas/config/tc-riscv.h b/gas/config/tc-riscv.h
> index 6b25a791da8..9702582dd47 100644
> --- a/gas/config/tc-riscv.h
> +++ b/gas/config/tc-riscv.h
> @@ -147,6 +147,9 @@ bool riscv_parse_name (const char *, struct
> expressionS *, enum expr_mode);
>  extern void riscv_md_finish (void);
>  extern int riscv_convert_symbolic_attribute (const char *);
>
> +#define md_insert_uleb128_fixes riscv_md_insert_uleb128_fixes
> +extern void riscv_md_insert_uleb128_fixes (void);
> +
>  /* Set mapping symbol states.  */
>  #define md_cons_align(nbytes) riscv_mapping_state (MAP_DATA, 0, 0)
>  void riscv_mapping_state (enum riscv_seg_mstate, int, bool);
> diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
> index 2963e52958a..b2f62824661 100644
> --- a/gas/dwarf2dbg.c
> +++ b/gas/dwarf2dbg.c
> @@ -2991,14 +2991,30 @@ out_debug_info (segT info_seg, segT
> abbrev_seg, segT line_seg, segT str_seg,
>     if (DWARF2_VERSION < 4)
>       {
>         if (size.X_op == O_constant)
> - size.X_op = O_symbol;
> -       size.X_add_symbol = symp;
> -       emit_expr (&size, sizeof_address);
> + {
> +   exp.X_op = O_symbol;
> +   exp.X_add_symbol = symp;
> +   exp.X_add_number = size.X_add_number;
> +   emit_expr (&exp, sizeof_address);
> + }
> +       else
> + {
> +   exp.X_op = O_symbol;
> +   exp.X_add_symbol
> +       = symbol_get_value_expression (size.X_op_symbol)
> +     ->X_add_symbol;
> +   exp.X_add_number = 0;
> +   emit_expr (&exp, sizeof_address);
> + }
>       }
> -   else if (size.X_op == O_constant)
> -     out_uleb128 (size.X_add_number);
>     else
> -     emit_leb128_expr (symbol_get_value_expression (size.X_op_symbol), 0);
> +     {
> +       if (size.X_op == O_constant)
> + out_uleb128 (size.X_add_number);
> +       else
> + emit_leb128_expr (
> +     symbol_get_value_expression (size.X_op_symbol), 0);
> +     }
>   }
>
>        if (DWARF2_VERSION > 2)
> --
> 2.47.1


More information about the Binutils mailing list