diff options
author | Kuan-Lin Chen <rufus@andestech.com> | 2017-02-02 15:27:18 +0800 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2017-03-14 09:51:29 -0700 |
commit | c1b465c94e26be629315bf28e3763dea9dea8336 (patch) | |
tree | 19baa36fb1dc82cc552356e5487d0caa73289306 /gas | |
parent | 2c232b8361a044d689d12161b7a645d238586f5e (diff) | |
download | gdb-c1b465c94e26be629315bf28e3763dea9dea8336.zip gdb-c1b465c94e26be629315bf28e3763dea9dea8336.tar.gz gdb-c1b465c94e26be629315bf28e3763dea9dea8336.tar.bz2 |
RISC-V: Fix the offset of CFA relocation.
gas/ChangeLog:
2017-03-02 Kuan-Lin Chen <rufus@andestech.com>
* config/tc-riscv.c (md_apply_fix): Compute the correct offsets
for CFA relocations.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-riscv.c | 20 |
2 files changed, 15 insertions, 10 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 4d6dd4e..4d638b4 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2017-03-02 Kuan-Lin Chen <rufus@andestech.com> + + * config/tc-riscv.c (md_apply_fix): Compute the correct offsets + for CFA relocations. + 2017-03-13 Nick Clifton <nickc@redhat.com> PR binutils/21202 diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 6bbaa4b..3744e84 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); } } |