aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2008-09-19 02:11:02 +0000
committerAlan Modra <amodra@gmail.com>2008-09-19 02:11:02 +0000
commit9a97a5d735f8ccba73271e5098e6194551c877d7 (patch)
tree0ab4e75b10d40cb1076be9faf1ee6f134b468ad9 /gas
parent2a403edaa8115c3d1a82770f1d9ba67232b20266 (diff)
downloadgdb-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')
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-sh.h5
-rw-r--r--gas/write.c27
3 files changed, 30 insertions, 10 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 8490ad8..7b22d2f 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2008-09-19 Alan Modra <amodra@bigpond.net.au>
+
+ * 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 <amodra@bigpond.net.au>
* write.c (install_reloc): Correct EMIT_SECTION_SYMBOLS test.
diff --git a/gas/config/tc-sh.h b/gas/config/tc-sh.h
index dfdabd4..a3187b3 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 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));
}
}