aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2007-11-13 10:40:29 +0000
committerNick Clifton <nickc@redhat.com>2007-11-13 10:40:29 +0000
commitb5f5fd962ef368674d3460bf78a9c6d13a2ab72b (patch)
treee438575a95064274620cb1ef22c617a4b5b8d145 /gas
parent0067a5693ac40531a6975777c7b6c3b40fd8795e (diff)
downloadfsf-binutils-gdb-b5f5fd962ef368674d3460bf78a9c6d13a2ab72b.zip
fsf-binutils-gdb-b5f5fd962ef368674d3460bf78a9c6d13a2ab72b.tar.gz
fsf-binutils-gdb-b5f5fd962ef368674d3460bf78a9c6d13a2ab72b.tar.bz2
* config/tc-mn10300.c (mn10300_force_relocation): Force a reloc to be generated for alignment fixups.
* config/tc-mn10300.h (TC_FORCE_RELOCATION): Call mn10300_force_relocation. * elf-m10300.c (mn10300_elf_final_link_relocate): Prevent the accidental termination of DWARF location list entries. (mn10300_elf_relax_delete_bytes): Stop deletion if an align reloc is encountered that is larger than or not a mutliple of the number of bytes being deleted. When adjusting symbols, any symbols inside the region being deleted must be moved to the end of the region. Move align relocs forward if there is room for them after the deletion of the region.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-mn10300.c19
-rw-r--r--gas/config/tc-mn10300.h13
3 files changed, 27 insertions, 12 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 3b640e7..06fd9d1 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2007-11-13 Nick Clifton <nickc@redhat.com>
+
+ * config/tc-mn10300.c (mn10300_force_relocation): Force a reloc to
+ be generated for alignment fixups.
+ * config/tc-mn10300.h (TC_FORCE_RELOCATION): Call
+ mn10300_force_relocation.
+
2007-11-12 Nick Clifton <nickc@redhat.com>
PR gas/5269
diff --git a/gas/config/tc-mn10300.c b/gas/config/tc-mn10300.c
index e16a764..5d21cb5 100644
--- a/gas/config/tc-mn10300.c
+++ b/gas/config/tc-mn10300.c
@@ -2571,11 +2571,9 @@ mn10300_allow_local_subtract (expressionS * left, expressionS * right, segT sect
void
mn10300_handle_align (fragS *frag)
{
- if (! linkrelax)
- return;
-
- if ((frag->fr_type == rs_align
- || frag->fr_type == rs_align_code)
+ if (linkrelax
+ && (frag->fr_type == rs_align
+ || frag->fr_type == rs_align_code)
&& frag->fr_address + frag->fr_fix > 0
&& frag->fr_offset > 1
&& now_seg != bss_section
@@ -2590,3 +2588,14 @@ mn10300_handle_align (fragS *frag)
fix_new (frag, frag->fr_fix, 0, & abs_symbol, frag->fr_offset, FALSE,
BFD_RELOC_MN10300_ALIGN);
}
+
+bfd_boolean
+mn10300_force_relocation (struct fix * fixp)
+{
+ if (linkrelax
+ && (fixp->fx_pcrel
+ || fixp->fx_r_type == BFD_RELOC_MN10300_ALIGN))
+ return TRUE;
+
+ return generic_force_reloc (fixp);
+}
diff --git a/gas/config/tc-mn10300.h b/gas/config/tc-mn10300.h
index ca51eda..63ca74a 100644
--- a/gas/config/tc-mn10300.h
+++ b/gas/config/tc-mn10300.h
@@ -26,8 +26,8 @@
#define DIFF_EXPR_OK
#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
-#define TC_FORCE_RELOCATION(FIX) \
- (generic_force_reloc (FIX))
+#define TC_FORCE_RELOCATION(FIX) mn10300_force_relocation (FIX)
+extern bfd_boolean mn10300_force_relocation (struct fix *);
#define TC_FORCE_RELOCATION_LOCAL(FIX) \
(!(FIX)->fx_pcrel \
@@ -36,14 +36,13 @@
|| (FIX)->fx_r_type == BFD_RELOC_32_GOT_PCREL \
|| TC_FORCE_RELOCATION (FIX))
-#define md_parse_name(name, exprP, mode, nextcharP) \
- mn10300_parse_name ((name), (exprP), (mode), (nextcharP))
-int mn10300_parse_name PARAMS ((char const *, expressionS *,
- enum expr_mode, char *));
+#define md_parse_name(NAME, EXPRP, MODE, NEXTCHARP) \
+ mn10300_parse_name ((NAME), (EXPRP), (MODE), (NEXTCHARP))
+int mn10300_parse_name (char const *, expressionS *, enum expr_mode, char *);
#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP) \
mn10300_cons_fix_new ((FRAG), (OFF), (LEN), (EXP))
-void mn10300_cons_fix_new PARAMS ((fragS *, int, int, expressionS *));
+void mn10300_cons_fix_new (fragS *, int, int, expressionS *);
/* This is used to construct expressions out of @GOTOFF, @PLT and @GOT
symbols. The relocation type is stored in X_md. */