* elf-m10300.c (mn10300_elf_relax_section): Allow for alignment relocs when
computing whether instructions can be relaxed. * ld-mn10300/i135409-4.s: New test case. Check for relaxation to a 16-bit jump instruction. * ld-mn10300/i135409-4.t: Linker script for the new test. * ld-mn10300/i135409-4.d: Expected disassembly of new test. * ld-mn10300/mn10300.exp: Run the new test.
This commit is contained in:
parent
031cd65fb2
commit
fc91707cc2
|
@ -1,3 +1,8 @@
|
||||||
|
2007-11-21 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* elf-m10300.c (mn10300_elf_relax_section): Allow for alignment
|
||||||
|
relocs when computing whether instructions can be relaxed.
|
||||||
|
|
||||||
2007-11-16 Tristan Gingold <gingold@adacore.com>
|
2007-11-16 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
* elflink.c (elf_link_output_extsym): Weaken assertion: if
|
* elflink.c (elf_link_output_extsym): Weaken assertion: if
|
||||||
|
|
|
@ -2105,6 +2105,7 @@ mn10300_elf_relax_section (bfd *abfd,
|
||||||
Elf_Internal_Sym *isymbuf = NULL;
|
Elf_Internal_Sym *isymbuf = NULL;
|
||||||
struct elf32_mn10300_link_hash_table *hash_table;
|
struct elf32_mn10300_link_hash_table *hash_table;
|
||||||
asection *section = sec;
|
asection *section = sec;
|
||||||
|
bfd_vma align_gap_adjustment;
|
||||||
|
|
||||||
/* Assume nothing changes. */
|
/* Assume nothing changes. */
|
||||||
*again = FALSE;
|
*again = FALSE;
|
||||||
|
@ -2718,6 +2719,33 @@ mn10300_elf_relax_section (bfd *abfd,
|
||||||
if (internal_relocs == NULL)
|
if (internal_relocs == NULL)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
|
/* Scan for worst case alignment gap changes. Note that this logic
|
||||||
|
is not ideal; what we should do is run this scan for every
|
||||||
|
opcode/address range and adjust accordingly, but that's
|
||||||
|
expensive. Worst case is that for an alignment of N bytes, we
|
||||||
|
move by 2*N-N-1 bytes, assuming we have aligns of 1, 2, 4, 8, etc
|
||||||
|
all before it. Plus, this still doesn't cover cross-section
|
||||||
|
jumps with section alignment. */
|
||||||
|
irelend = internal_relocs + sec->reloc_count;
|
||||||
|
align_gap_adjustment = 0;
|
||||||
|
for (irel = internal_relocs; irel < irelend; irel++)
|
||||||
|
{
|
||||||
|
if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_ALIGN)
|
||||||
|
{
|
||||||
|
bfd_vma adj = 1 << irel->r_addend;
|
||||||
|
bfd_vma aend = irel->r_offset;
|
||||||
|
|
||||||
|
aend = BFD_ALIGN (aend, 1 << irel->r_addend);
|
||||||
|
adj = 2*adj - adj - 1;
|
||||||
|
|
||||||
|
/* Record the biggest adjustmnet. Skip any alignment at the
|
||||||
|
end of our section. */
|
||||||
|
if (align_gap_adjustment < adj
|
||||||
|
&& aend < sec->output_section->vma + sec->output_offset + sec->size)
|
||||||
|
align_gap_adjustment = adj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Walk through them looking for relaxing opportunities. */
|
/* Walk through them looking for relaxing opportunities. */
|
||||||
irelend = internal_relocs + sec->reloc_count;
|
irelend = internal_relocs + sec->reloc_count;
|
||||||
for (irel = internal_relocs; irel < irelend; irel++)
|
for (irel = internal_relocs; irel < irelend; irel++)
|
||||||
|
@ -2933,7 +2961,10 @@ mn10300_elf_relax_section (bfd *abfd,
|
||||||
/* See if the value will fit in 16 bits, note the high value is
|
/* See if the value will fit in 16 bits, note the high value is
|
||||||
0x7fff + 2 as the target will be two bytes closer if we are
|
0x7fff + 2 as the target will be two bytes closer if we are
|
||||||
able to relax. */
|
able to relax. */
|
||||||
if ((long) value < 0x8001 && (long) value > -0x8000)
|
/* Account for jumps across alignment boundaries using
|
||||||
|
align_gap_adjustment. */
|
||||||
|
if (value < 0x8001 - align_gap_adjustment
|
||||||
|
&& ((bfd_signed_vma) value > -0x8000 + (bfd_signed_vma) align_gap_adjustment))
|
||||||
{
|
{
|
||||||
unsigned char code;
|
unsigned char code;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
2007-11-21 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* ld-mn10300/i135409-4.s: New test case. Check for relaxation to
|
||||||
|
a 16-bit jump instruction.
|
||||||
|
* ld-mn10300/i135409-4.t: Linker script for the new test.
|
||||||
|
* ld-mn10300/i135409-4.d: Expected disassembly of new test.
|
||||||
|
* ld-mn10300/mn10300.exp: Run the new test.
|
||||||
|
|
||||||
2007-11-20 Nick Clifton <nickc@redhat.com>
|
2007-11-20 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* lib/ld-lib.exp (check_gc_sections_available): New proc, based
|
* lib/ld-lib.exp (check_gc_sections_available): New proc, based
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
tmpdir/i135409-4.x: file format elf32-.*
|
||||||
|
|
||||||
|
Disassembly of section .text:
|
||||||
|
|
||||||
|
0+0 <_start>:
|
||||||
|
0:[ ]+cc 00 07[ ]+jmp[ ]+700 \<L001\>
|
|
@ -0,0 +1,8 @@
|
||||||
|
.text
|
||||||
|
.global _start
|
||||||
|
_start:
|
||||||
|
jmp L001
|
||||||
|
|
||||||
|
.section .text1
|
||||||
|
L001:
|
||||||
|
nop
|
|
@ -0,0 +1,23 @@
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0x0;
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
. = 0x700;
|
||||||
|
.text1 :
|
||||||
|
{
|
||||||
|
*(.text1)
|
||||||
|
}
|
||||||
|
. = 0x8100;
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(.bss)
|
||||||
|
}
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
}
|
|
@ -79,6 +79,14 @@ set mn10300_tests {
|
||||||
{ {objdump -d i135409-3.d} }
|
{ {objdump -d i135409-3.d} }
|
||||||
"i135409-3.x"
|
"i135409-3.x"
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
"adjusting a 16 bit branch"
|
||||||
|
"-Ti135409-4.t -relax"
|
||||||
|
""
|
||||||
|
{ "i135409-4.s" }
|
||||||
|
{ {objdump -d i135409-4.d} }
|
||||||
|
"i135409-4.x"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run_ld_link_tests $mn10300_tests
|
run_ld_link_tests $mn10300_tests
|
||||||
|
|
Loading…
Reference in New Issue