From: Alan Modra Date: Fri, 19 Sep 2008 02:11:02 +0000 (+0000) Subject: * write.c (md_register_arithmetic): Define. X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;ds=sidebyside;h=9a97a5d735f8ccba73271e5098e6194551c877d7;p=deliverable%2Fbinutils-gdb.git * write.c (md_register_arithmetic): Define. (fixup_segment): Adjust TC_FORCE_RELOCATION_SUB_ABS invocation. Modify error message when registers involved. (TC_FORCE_RELOCATION_SUB_ABS): Heed md_register_arithmetic. * config/tc-sh.h (TC_FORCE_RELOCATION_SUB_ABS): Likewise. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 8490ad8d77..7b22d2fe32 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2008-09-19 Alan Modra + + * write.c (md_register_arithmetic): Define. + (fixup_segment): Adjust TC_FORCE_RELOCATION_SUB_ABS invocation. + Modify error message when registers involved. + (TC_FORCE_RELOCATION_SUB_ABS): Heed md_register_arithmetic. + * config/tc-sh.h (TC_FORCE_RELOCATION_SUB_ABS): Likewise. + 2008-09-15 Alan Modra * write.c (install_reloc): Correct EMIT_SECTION_SYMBOLS test. diff --git a/gas/config/tc-sh.h b/gas/config/tc-sh.h index dfdabd479c..a3187b3d0a 100644 --- a/gas/config/tc-sh.h +++ b/gas/config/tc-sh.h @@ -211,8 +211,9 @@ extern bfd_boolean sh_fix_adjustable (struct fix *); /* This keeps the subtracted symbol around, for use by PLT_PCREL relocs. */ -#define TC_FORCE_RELOCATION_SUB_ABS(FIX) \ - ((FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL) +#define TC_FORCE_RELOCATION_SUB_ABS(FIX, SEG) \ + ((FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL \ + || (!md_register_arithmetic && (SEG) == reg_section)) /* Don't complain when we leave fx_subsy around. */ #undef TC_VALIDATE_FIX_SUB diff --git a/gas/write.c b/gas/write.c index f164e2eeab..f03fcf3d5b 100644 --- a/gas/write.c +++ b/gas/write.c @@ -54,8 +54,13 @@ (! SEG_NORMAL (SEG)) #endif +#ifndef md_register_arithmetic +# define md_register_arithmetic 1 +#endif + #ifndef TC_FORCE_RELOCATION_SUB_ABS -#define TC_FORCE_RELOCATION_SUB_ABS(FIX) 0 +#define TC_FORCE_RELOCATION_SUB_ABS(FIX, SEG) \ + (!md_register_arithmetic && (SEG) == reg_section) #endif #ifndef TC_FORCE_RELOCATION_SUB_LOCAL @@ -924,7 +929,7 @@ fixup_segment (fixS *fixP, segT this_segment) #endif } else if (sub_symbol_segment == absolute_section - && !TC_FORCE_RELOCATION_SUB_ABS (fixP)) + && !TC_FORCE_RELOCATION_SUB_ABS (fixP, add_symbol_segment)) { add_number -= S_GET_VALUE (fixP->fx_subsy); fixP->fx_offset = add_number; @@ -955,12 +960,18 @@ fixup_segment (fixS *fixP, segT this_segment) } else if (!TC_VALIDATE_FIX_SUB (fixP)) { - as_bad_where (fixP->fx_file, fixP->fx_line, - _("can't resolve `%s' {%s section} - `%s' {%s section}"), - fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0", - segment_name (add_symbol_segment), - S_GET_NAME (fixP->fx_subsy), - segment_name (sub_symbol_segment)); + if (!md_register_arithmetic + && (add_symbol_segment == reg_section + || sub_symbol_segment == reg_section)) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("register value used as expression")); + else + as_bad_where (fixP->fx_file, fixP->fx_line, + _("can't resolve `%s' {%s section} - `%s' {%s section}"), + fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0", + segment_name (add_symbol_segment), + S_GET_NAME (fixP->fx_subsy), + segment_name (sub_symbol_segment)); } }