diff options
author | Nick Clifton <nickc@redhat.com> | 2007-11-13 10:40:29 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2007-11-13 10:40:29 +0000 |
commit | b5f5fd962ef368674d3460bf78a9c6d13a2ab72b (patch) | |
tree | e438575a95064274620cb1ef22c617a4b5b8d145 /gas | |
parent | 0067a5693ac40531a6975777c7b6c3b40fd8795e (diff) | |
download | fsf-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/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-mn10300.c | 19 | ||||
-rw-r--r-- | gas/config/tc-mn10300.h | 13 |
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. */ |