From: Kuan-Lin Chen Date: Thu, 2 Feb 2017 07:27:18 +0000 (+0800) Subject: RISC-V: Fix the offset of CFA relocation. X-Git-Tag: users/ARM/embedded-binutils-2_28-branch-2017q2~116 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5fa45e35a3f36846b2f5a20f921d06705d66854f;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 90a532ddb42..50a7303995e 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-27 Alan Modra PR 21303 diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index ec5b0bb0362..c79f3136178 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1837,6 +1837,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; @@ -1922,30 +1923,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; @@ -2069,7 +2071,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; @@ -2080,8 +2081,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); } }