diff --git a/gas/ChangeLog b/gas/ChangeLog index 1ff090ab688..e3da87381ea 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2020-05-24 Jim Wilson + + PR 26025 + * config/tc-riscv.c (riscv_pre_output_hook): Change s type from const + asection to segT. New locals seg and subseg. Call subseg_set before + fix_new_exp. Call subseg_set after loop to restore original values. + 2020-05-21 Alan Modra * atof-generic.c: Replace "if (x) free (x)" with "free (x)" diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 04df0884f37..2a03a440b19 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -3062,7 +3062,11 @@ void riscv_pre_output_hook (void) { const frchainS *frch; - const asection *s; + segT s; + + /* Save the current segment info. */ + segT seg = now_seg; + subsegT subseg = now_subseg; for (s = stdoutput->sections; s; s = s->next) for (frch = seg_info (s)->frchainP; frch; frch = frch->frch_next) @@ -3082,11 +3086,18 @@ riscv_pre_output_hook (void) exp.X_add_number = 0; exp.X_op_symbol = symval->X_op_symbol; + /* We must set the segment before creating a frag after all + frag chains have been chained together. */ + subseg_set (s, frch->frch_subseg); + fix_new_exp (frag, (int) frag->fr_offset, 1, &exp, 0, BFD_RELOC_RISCV_CFA); } } } + + /* Restore the original segment info. */ + subseg_set (seg, subseg); }