diff options
author | Alan Modra <amodra@gmail.com> | 2008-09-19 02:11:02 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2008-09-19 02:11:02 +0000 |
commit | 9a97a5d735f8ccba73271e5098e6194551c877d7 (patch) | |
tree | 0ab4e75b10d40cb1076be9faf1ee6f134b468ad9 /gas/write.c | |
parent | 2a403edaa8115c3d1a82770f1d9ba67232b20266 (diff) | |
download | gdb-9a97a5d735f8ccba73271e5098e6194551c877d7.zip gdb-9a97a5d735f8ccba73271e5098e6194551c877d7.tar.gz gdb-9a97a5d735f8ccba73271e5098e6194551c877d7.tar.bz2 |
* 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.
Diffstat (limited to 'gas/write.c')
-rw-r--r-- | gas/write.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/gas/write.c b/gas/write.c index f164e2e..f03fcf3 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)); } } |