[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
More information about the Binutils mailing list
Mon Feb 10 09:05:41 GMT 2025
- Previous message (by thread): [PATCH] RISC-V: Fix incorrect DW_AT_high_pc after linker relaxation
- Next message (by thread): [PATCH] Mark _PROCEDURE_LINKAGE_TABLE_ as code instead of data
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message (by thread): [PATCH] RISC-V: Fix incorrect DW_AT_high_pc after linker relaxation
- Next message (by thread): [PATCH] Mark _PROCEDURE_LINKAGE_TABLE_ as code instead of data
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list