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.
This commit is contained in:
parent
2c232b8361
commit
c1b465c94e
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue