From c1b465c94e26be629315bf28e3763dea9dea8336 Mon Sep 17 00:00:00 2001 From: Kuan-Lin Chen Date: Thu, 2 Feb 2017 15:27:18 +0800 Subject: [PATCH] RISC-V: Fix the offset of CFA relocation. gas/ChangeLog: 2017-03-02 Kuan-Lin Chen * config/tc-riscv.c (md_apply_fix): Compute the correct offsets for CFA relocations. --- gas/ChangeLog | 5 +++++ gas/config/tc-riscv.c | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 4d6dd4e2f1a..4d638b4d10d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2017-03-02 Kuan-Lin Chen + + * config/tc-riscv.c (md_apply_fix): Compute the correct offsets + for CFA relocations. + 2017-03-13 Nick Clifton PR binutils/21202 diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 6bbaa4b1010..3744e84d99a 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1847,6 +1847,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) unsigned int subtype; bfd_byte *buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where); bfd_boolean relaxable = FALSE; + offsetT loc; /* Remember value for tc_gen_reloc. */ fixP->fx_addnumber = *valP; @@ -1932,30 +1933,31 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) case BFD_RELOC_RISCV_CFA: /* Load the byte to get the subtype. */ - subtype = bfd_get_8 (NULL, &fixP->fx_frag->fr_literal[fixP->fx_where]); + subtype = bfd_get_8 (NULL, &((fragS *) (fixP->fx_frag->fr_opcode))->fr_literal[fixP->fx_where]); + loc = fixP->fx_frag->fr_fix - (subtype & 7); switch (subtype) { case DW_CFA_advance_loc1: - fixP->fx_where++; - fixP->fx_next->fx_where++; + fixP->fx_where = loc + 1; + fixP->fx_next->fx_where = loc + 1; fixP->fx_r_type = BFD_RELOC_RISCV_SET8; fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB8; break; case DW_CFA_advance_loc2: fixP->fx_size = 2; - fixP->fx_where++; fixP->fx_next->fx_size = 2; - fixP->fx_next->fx_where++; + fixP->fx_where = loc + 1; + fixP->fx_next->fx_where = loc + 1; fixP->fx_r_type = BFD_RELOC_RISCV_SET16; fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB16; break; case DW_CFA_advance_loc4: fixP->fx_size = 4; - fixP->fx_where++; fixP->fx_next->fx_size = 4; - fixP->fx_next->fx_where++; + fixP->fx_where = loc; + fixP->fx_next->fx_where = loc; fixP->fx_r_type = BFD_RELOC_RISCV_SET32; fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB32; break; @@ -2079,7 +2081,6 @@ riscv_pre_output_hook (void) { if (frag->fr_type == rs_cfa) { - fragS *loc4_frag; expressionS exp; symbolS *add_symbol = frag->fr_symbol->sy_value.X_add_symbol; @@ -2090,8 +2091,7 @@ riscv_pre_output_hook (void) exp.X_add_number = 0; exp.X_op_symbol = op_symbol; - loc4_frag = (fragS *) frag->fr_opcode; - fix_new_exp (loc4_frag, (int) frag->fr_offset, 1, &exp, 0, + fix_new_exp (frag, (int) frag->fr_offset, 1, &exp, 0, BFD_RELOC_RISCV_CFA); } } -- 2.30.2