Nios II CALL26 linker relaxation

2014-01-30  Sandra Loosemore  <sandra@codesourcery.com>

	bfd/
	* bfd-in2.h: Update from reloc.c.
	* elf32-nios2.c: Include elf32-nios2.h.
	(elf_nios2_howto_table_rel): Add entry for R_NIOS2_CALL26_NOAT.
	(nios2_reloc_map): Likewise.
	(enum elf32_nios2_stub_type): Declare.
	(struct elf32_nios2_stub_hash_entry): Declare.
	(nios2_stub_hash_entry, nios2_stub_hash_lookup): New macros.
	(struct elf32_nios2_link_hash_entry): Add hsh_cache field.
	(struct elf32_nios2_link_hash_table): Add new fields bstab,
	stub_bfd, add_stub_section, layout_sections_again, stub_group,
	bfd_count, top_index, input_list, all_local_syms.
	(nios2_call26_stub_entry): New.
	(nios2_elf32_install_imm16): Move up in file.
	(nios2_elf32_install_data): Move up in file.
	(hiadj): Move up in file.
	(stub_hash_newfunc): New.
	(link_hash_newfunc): Initialize hsh_cache field.
	(STUB_SUFFIX): New.
	(nios2_stub_name): New.
	(nios2_get_stub_entry): New.
	(nios2_add_stub): New.
	(nios2_elf32_setup_section_lists): New.
	(nios2_elf32_next_input_section): New.
	(CALL26_SEGMENT): New.
	(MAX_STUB_SECTION_SIZE): New.
	(group_sections): New.
	(nios2_type_of_stub): New.
	(nios2_build_one_stub): New.
	(nios2_size_one_stub): New.
	(get_local_syms): New.
	(nios2_elf32_size_stubs): New.
	(nios2_elf32_build_stubs): New.
	(nios2_elf32_do_call26_relocate): Correct CALL26 overflow test.
	(nios2_elf32_relocate_section): Handle R_NIOS2_CALL26_NOAT.  Add
	trampolines for R_NIOS2_CALL26 stubs.
	(nios2_elf32_check_relocs): Handle R_NIOS2_CALL26_NOAT.
	(nios2_elf32_gc_sweep_hook): Likewise.
	(nios2_elf32_link_hash_table_create): Initialize the stub hash table.
	(nios2_elf32_link_hash_table_free): New.
	(bfd_elf32_bfd_link_hash_table_free): Define.
	* elf32-nios2.h: New file.
	* libbfd.h: Update from reloc.c.
	* reloc.c (BFD_RELOC_NIOS2_CALL26_NOAT): New.

	gas/
	* config/tc-nios2.c (md_apply_fix): Handle BFD_RELOC_NIOS2_CALL26_NOAT.
	(nios2_assemble_args_m): Likewise.
	(md_assemble): Likewise.

	gas/testsuite/
	* gas/nios2/call26_noat.d: New.
	* gas/nios2/call26_noat.s: New.
	* gas/nios2/call_noat.d: New.
	* gas/nios2/call_noat.s: New.

	include/elf/
	* nios2.h (elf_nios2_reloc_type): Add R_NIOS2_CALL26_NOAT.

	ld/
	* Makefile.am (enios2elf.c, enios2linux.c): Update dependencies.
	* Makefile.in: Regenerated.
	* emulparams/nios2elf.sh (EXTRA_EM_FILE): Set.
	* emulparams/nios2linux.sh (EXTRA_EM_FILE): Set.
	* emultempl/nios2elf.em: New file.
	* gen-doc.texi (NIOSII): Set.
	* ld.texinfo (NIOSII): Set.

	ld/testsuite/
	* ld-nios2/relax_call26.s: New.
	* ld-nios2/relax_call26_boundary.ld: New.
	* ld-nios2/relax_call26_boundary.s: New.
	* ld-nios2/relax_call26_boundary_c8.d: New.
	* ld-nios2/relax_call26_boundary_cc.d: New.
	* ld-nios2/relax_call26_boundary_d0.d: New.
	* ld-nios2/relax_call26_boundary_d4.d: New.
	* ld-nios2/relax_call26_boundary_d8.d: New.
	* ld-nios2/relax_call26_boundary_dc.d: New.
	* ld-nios2/relax_call26_boundary_f0.d: New.
	* ld-nios2/relax_call26_boundary_f4.d: New.
	* ld-nios2/relax_call26_boundary_f8.d: New.
	* ld-nios2/relax_call26_boundary_fc.d: New.
	* ld-nios2/relax_call26_cache.d: New.
	* ld-nios2/relax_call26_cache.ld: New.
	* ld-nios2/relax_call26_cache.s: New.
	* ld-nios2/relax_call26_multi.d: New.
	* ld-nios2/relax_call26_multi.ld: New.
	* ld-nios2/relax_call26_norelax.d: New.
	* ld-nios2/relax_call26_shared.d: New.
	* ld-nios2/relax_call26_shared.ld: New.
This commit is contained in:
Sandra Loosemore 2014-01-30 17:47:07 -08:00
parent 1b4f7b4d1e
commit 78058a5e4f
45 changed files with 2022 additions and 50 deletions

View file

@ -1,3 +1,49 @@
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* bfd-in2.h: Update from reloc.c.
* elf32-nios2.c: Include elf32-nios2.h.
(elf_nios2_howto_table_rel): Add entry for R_NIOS2_CALL26_NOAT.
(nios2_reloc_map): Likewise.
(enum elf32_nios2_stub_type): Declare.
(struct elf32_nios2_stub_hash_entry): Declare.
(nios2_stub_hash_entry, nios2_stub_hash_lookup): New macros.
(struct elf32_nios2_link_hash_entry): Add hsh_cache field.
(struct elf32_nios2_link_hash_table): Add new fields bstab,
stub_bfd, add_stub_section, layout_sections_again, stub_group,
bfd_count, top_index, input_list, all_local_syms.
(nios2_call26_stub_entry): New.
(nios2_elf32_install_imm16): Move up in file.
(nios2_elf32_install_data): Move up in file.
(hiadj): Move up in file.
(stub_hash_newfunc): New.
(link_hash_newfunc): Initialize hsh_cache field.
(STUB_SUFFIX): New.
(nios2_stub_name): New.
(nios2_get_stub_entry): New.
(nios2_add_stub): New.
(nios2_elf32_setup_section_lists): New.
(nios2_elf32_next_input_section): New.
(CALL26_SEGMENT): New.
(MAX_STUB_SECTION_SIZE): New.
(group_sections): New.
(nios2_type_of_stub): New.
(nios2_build_one_stub): New.
(nios2_size_one_stub): New.
(get_local_syms): New.
(nios2_elf32_size_stubs): New.
(nios2_elf32_build_stubs): New.
(nios2_elf32_do_call26_relocate): Correct CALL26 overflow test.
(nios2_elf32_relocate_section): Handle R_NIOS2_CALL26_NOAT. Add
trampolines for R_NIOS2_CALL26 stubs.
(nios2_elf32_check_relocs): Handle R_NIOS2_CALL26_NOAT.
(nios2_elf32_gc_sweep_hook): Likewise.
(nios2_elf32_link_hash_table_create): Initialize the stub hash table.
(nios2_elf32_link_hash_table_free): New.
(bfd_elf32_bfd_link_hash_table_free): Define.
* elf32-nios2.h: New file.
* libbfd.h: Update from reloc.c.
* reloc.c (BFD_RELOC_NIOS2_CALL26_NOAT): New.
2014-01-29 Nick Clifton <nickc@redhat.com>
PR binutils/16318

View file

@ -5225,6 +5225,7 @@ a matching LO8XG part. */
BFD_RELOC_NIOS2_JUMP_SLOT,
BFD_RELOC_NIOS2_RELATIVE,
BFD_RELOC_NIOS2_GOTOFF,
BFD_RELOC_NIOS2_CALL26_NOAT,
/* IQ2000 Relocations. */
BFD_RELOC_IQ2000_OFFSET_16,

File diff suppressed because it is too large Load diff

38
bfd/elf32-nios2.h Normal file
View file

@ -0,0 +1,38 @@
/* Nios II support for 32-bit ELF
Copyright (C) 2013, 2014 Free Software Foundation, Inc.
Contributed by Mentor Graphics
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#ifndef _ELF32_NIOS2_H
#define _ELF32_NIOS2_H
extern int nios2_elf32_setup_section_lists
(bfd *, struct bfd_link_info *);
extern void nios2_elf32_next_input_section
(struct bfd_link_info *, asection *);
extern bfd_boolean nios2_elf32_size_stubs
(bfd *, bfd *, struct bfd_link_info *,
asection * (*) (const char *, asection *, bfd_boolean), void (*) (void));
extern bfd_boolean nios2_elf32_build_stubs
(struct bfd_link_info *);
#endif /* _ELF32_NIOS2_H */

View file

@ -2532,6 +2532,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_NIOS2_JUMP_SLOT",
"BFD_RELOC_NIOS2_RELATIVE",
"BFD_RELOC_NIOS2_GOTOFF",
"BFD_RELOC_NIOS2_CALL26_NOAT",
"BFD_RELOC_IQ2000_OFFSET_16",
"BFD_RELOC_IQ2000_OFFSET_21",
"BFD_RELOC_IQ2000_UHI16",

View file

@ -6065,6 +6065,8 @@ ENUMX
BFD_RELOC_NIOS2_RELATIVE
ENUMX
BFD_RELOC_NIOS2_GOTOFF
ENUMX
BFD_RELOC_NIOS2_CALL26_NOAT
ENUMDOC
Relocations used by the Altera Nios II core.

View file

@ -1,3 +1,9 @@
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* config/tc-nios2.c (md_apply_fix): Handle BFD_RELOC_NIOS2_CALL26_NOAT.
(nios2_assemble_args_m): Likewise.
(md_assemble): Likewise.
2014-01-24 DJ Delorie <dj@redhat.com>
* config/tc-msp430.c (msp430_section): Always flag data sections,

View file

@ -1139,6 +1139,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|| fixP->fx_r_type == BFD_RELOC_NIOS2_U16
|| fixP->fx_r_type == BFD_RELOC_16_PCREL
|| fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26
|| fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26_NOAT
|| fixP->fx_r_type == BFD_RELOC_NIOS2_IMM5
|| fixP->fx_r_type == BFD_RELOC_NIOS2_CACHE_OPX
|| fixP->fx_r_type == BFD_RELOC_NIOS2_IMM6
@ -1595,7 +1596,10 @@ nios2_assemble_args_m (nios2_insn_infoS *insn_info)
unsigned long immed
= nios2_assemble_expression (insn_info->insn_tokens[1], insn_info,
insn_info->insn_reloc,
BFD_RELOC_NIOS2_CALL26, 0);
(nios2_as_options.noat
? BFD_RELOC_NIOS2_CALL26_NOAT
: BFD_RELOC_NIOS2_CALL26),
0);
SET_INSN_FIELD (IMM26, insn_info->insn_code, immed);
nios2_check_assembly (insn_info->insn_code, insn_info->insn_tokens[2]);
@ -2728,7 +2732,10 @@ md_assemble (char *op_str)
&& !nios2_as_options.noat
&& insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CALL
&& insn->insn_reloc
&& insn->insn_reloc->reloc_type == BFD_RELOC_NIOS2_CALL26)
&& ((insn->insn_reloc->reloc_type
== BFD_RELOC_NIOS2_CALL26)
|| (insn->insn_reloc->reloc_type
== BFD_RELOC_NIOS2_CALL26_NOAT)))
output_call (insn);
else if (insn->insn_nios2_opcode->pinfo & NIOS2_INSN_ANDI)
output_andi (insn);

View file

@ -1,3 +1,10 @@
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* gas/nios2/call26_noat.d: New.
* gas/nios2/call26_noat.s: New.
* gas/nios2/call_noat.d: New.
* gas/nios2/call_noat.s: New.
2014-01-30 Michael Zolotukhin <michael.v.zolotukhin@gmail.com>
Jan Beulich <jbeulich@suse.com>

View file

@ -0,0 +1,76 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: NIOS2 nios2-reloc-r-nios2-call26-noat
# Test the branch instructions.
.*: +file format elf32-littlenios2
Disassembly of section .text:
[ ]*\.\.\.
[ ]*0: R_NIOS2_CALL26_NOAT .text\+0x100
[ ]*4: R_NIOS2_CALL26_NOAT globalfunc
0+0008 <[^>]*> 0001883a nop
0+000c <[^>]*> 0001883a nop
0+0010 <[^>]*> 0001883a nop
0+0014 <[^>]*> 0001883a nop
0+0018 <[^>]*> 0001883a nop
0+001c <[^>]*> 0001883a nop
0+0020 <[^>]*> 0001883a nop
0+0024 <[^>]*> 0001883a nop
0+0028 <[^>]*> 0001883a nop
0+002c <[^>]*> 0001883a nop
0+0030 <[^>]*> 0001883a nop
0+0034 <[^>]*> 0001883a nop
0+0038 <[^>]*> 0001883a nop
0+003c <[^>]*> 0001883a nop
0+0040 <[^>]*> 0001883a nop
0+0044 <[^>]*> 0001883a nop
0+0048 <[^>]*> 0001883a nop
0+004c <[^>]*> 0001883a nop
0+0050 <[^>]*> 0001883a nop
0+0054 <[^>]*> 0001883a nop
0+0058 <[^>]*> 0001883a nop
0+005c <[^>]*> 0001883a nop
0+0060 <[^>]*> 0001883a nop
0+0064 <[^>]*> 0001883a nop
0+0068 <[^>]*> 0001883a nop
0+006c <[^>]*> 0001883a nop
0+0070 <[^>]*> 0001883a nop
0+0074 <[^>]*> 0001883a nop
0+0078 <[^>]*> 0001883a nop
0+007c <[^>]*> 0001883a nop
0+0080 <[^>]*> 0001883a nop
0+0084 <[^>]*> 0001883a nop
0+0088 <[^>]*> 0001883a nop
0+008c <[^>]*> 0001883a nop
0+0090 <[^>]*> 0001883a nop
0+0094 <[^>]*> 0001883a nop
0+0098 <[^>]*> 0001883a nop
0+009c <[^>]*> 0001883a nop
0+00a0 <[^>]*> 0001883a nop
0+00a4 <[^>]*> 0001883a nop
0+00a8 <[^>]*> 0001883a nop
0+00ac <[^>]*> 0001883a nop
0+00b0 <[^>]*> 0001883a nop
0+00b4 <[^>]*> 0001883a nop
0+00b8 <[^>]*> 0001883a nop
0+00bc <[^>]*> 0001883a nop
0+00c0 <[^>]*> 0001883a nop
0+00c4 <[^>]*> 0001883a nop
0+00c8 <[^>]*> 0001883a nop
0+00cc <[^>]*> 0001883a nop
0+00d0 <[^>]*> 0001883a nop
0+00d4 <[^>]*> 0001883a nop
0+00d8 <[^>]*> 0001883a nop
0+00dc <[^>]*> 0001883a nop
0+00e0 <[^>]*> 0001883a nop
0+00e4 <[^>]*> 0001883a nop
0+00e8 <[^>]*> 0001883a nop
0+00ec <[^>]*> 0001883a nop
0+00f0 <[^>]*> 0001883a nop
0+00f4 <[^>]*> 0001883a nop
0+00f8 <[^>]*> 0001883a nop
0+00fc <[^>]*> 0001883a nop
0+0100 <[^>]*> 0001883a nop
...

View file

@ -0,0 +1,13 @@
# Test for Nios II 32-bit relocations
.global globalfunc
.text
.set norelax
.set noat
start:
call localfunc
call globalfunc
.align 8
localfunc:
nop

View file

@ -0,0 +1,11 @@
# objdump: -dr --prefix-addresses --show-raw-insn
#name: NIOS2 call noat
.*: +file format elf32-littlenios2
Disassembly of section .text:
0+0000 <[^>]*> 00000000 call 00000000 <[^>]*>
[ ]*0: R_NIOS2_CALL26_NOAT .text\+0xc
0+0004 <[^>]*> 503ee83a callr r10
0+0008 <[^>]*> 00000000 call 00000000 <[^>]*>
[ ]*8: R_NIOS2_CALL26_NOAT external

View file

@ -0,0 +1,14 @@
# Source file used to test the call and callr instructions
.text
.set norelax
.set noat
foo:
call func1
callr r10
# use external symbol
.global external
call external
func1:

View file

@ -1,3 +1,7 @@
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* nios2.h (elf_nios2_reloc_type): Add R_NIOS2_CALL26_NOAT.
2014-01-30 Ulrich Weigand <uweigand@de.ibm.com>
* common.h (AT_HWCAP2): Define.

View file

@ -75,7 +75,8 @@ START_RELOC_NUMBERS (elf_nios2_reloc_type)
RELOC_NUMBER (R_NIOS2_JUMP_SLOT, 38)
RELOC_NUMBER (R_NIOS2_RELATIVE, 39)
RELOC_NUMBER (R_NIOS2_GOTOFF, 40)
RELOC_NUMBER (R_NIOS2_ILLEGAL, 41)
RELOC_NUMBER (R_NIOS2_CALL26_NOAT, 41)
RELOC_NUMBER (R_NIOS2_ILLEGAL, 42)
END_RELOC_NUMBERS (R_NIOS2_maxext)
/* Processor-specific section flags. */

View file

@ -1,3 +1,13 @@
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* Makefile.am (enios2elf.c, enios2linux.c): Update dependencies.
* Makefile.in: Regenerated.
* emulparams/nios2elf.sh (EXTRA_EM_FILE): Set.
* emulparams/nios2linux.sh (EXTRA_EM_FILE): Set.
* emultempl/nios2elf.em: New file.
* gen-doc.texi (NIOSII): Set.
* ld.texinfo (NIOSII): Set.
2014-01-28 Nick Clifton <nickc@redhat.com>
* Makefile.am: Remove obsolete MSP430 emulations.

View file

@ -1497,10 +1497,12 @@ enews.c: $(srcdir)/emulparams/news.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
${GENSCRIPTS} news "$(tdir_news)"
enios2elf.c: $(srcdir)/emulparams/nios2elf.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
$(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/nios2elf.em \
$(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} nios2elf "$(tdir_nios2elf)"
enios2linux.c: $(srcdir)/emulparams/nios2linux.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
$(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/nios2elf.em \
$(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} nios2linux "$(tdir_nios2linux)"
ens32knbsd.c: $(srcdir)/emulparams/ns32knbsd.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/emultempl/netbsd.em \

View file

@ -2929,10 +2929,12 @@ enews.c: $(srcdir)/emulparams/news.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
${GENSCRIPTS} news "$(tdir_news)"
enios2elf.c: $(srcdir)/emulparams/nios2elf.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
$(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/nios2elf.em \
$(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} nios2elf "$(tdir_nios2elf)"
enios2linux.c: $(srcdir)/emulparams/nios2linux.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
$(srcdir)/emultempl/elf32.em $(srcdir)/emultempl/nios2elf.em \
$(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} nios2linux "$(tdir_nios2linux)"
ens32knbsd.c: $(srcdir)/emulparams/ns32knbsd.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/emultempl/netbsd.em \

View file

@ -1,6 +1,6 @@
SCRIPT_NAME=elf
TEMPLATE_NAME=elf32
EXTRA_EM_FILE=
EXTRA_EM_FILE=nios2elf
OUTPUT_FORMAT="elf32-littlenios2"
LITTLE_OUTPUT_FORMAT="elf32-littlenios2"
BIG_OUTPUT_FORMAT="elf32-bignios2"

View file

@ -1,6 +1,6 @@
SCRIPT_NAME=elf
TEMPLATE_NAME=elf32
EXTRA_EM_FILE=
EXTRA_EM_FILE="nios2elf"
OUTPUT_FORMAT="elf32-littlenios2"
LITTLE_OUTPUT_FORMAT="elf32-littlenios2"
BIG_OUTPUT_FORMAT="elf32-bignios2"

317
ld/emultempl/nios2elf.em Normal file
View file

@ -0,0 +1,317 @@
# This shell script emits a C file. -*- C -*-
# Copyright (C) 2013, 2014 Free Software Foundation, Inc.
#
# This file is part of GNU Binutils.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# This file is sourced from elf32.em, and defines extra Nios II ELF
# specific routines. Taken from metagelf.em.
#
fragment <<EOF
#include "ldctor.h"
#include "elf32-nios2.h"
/* Fake input file for stubs. */
static lang_input_statement_type *stub_file;
/* Whether we need to call nios2_layout_sections_again. */
static int need_laying_out = 0;
/* This is called before the input files are opened. We create a new
fake input file to hold the stub sections. */
static void
nios2elf_create_output_section_statements (void)
{
extern const bfd_target bfd_elf32_littlenios2_vec, bfd_elf32_bignios2_vec;
if (link_info.output_bfd->xvec != &bfd_elf32_littlenios2_vec
&& link_info.output_bfd->xvec != &bfd_elf32_bignios2_vec)
return;
/* If --no-relax was not explicitly specified by the user, enable
relaxation. If it's not enabled (either explicitly or by default),
we're done, as we won't need to create any stubs. */
if (!link_info.relocatable && RELAXATION_DISABLED_BY_DEFAULT)
ENABLE_RELAXATION;
if (!RELAXATION_ENABLED)
return;
stub_file = lang_add_input_file ("linker stubs",
lang_input_file_is_fake_enum,
NULL);
stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
if (stub_file->the_bfd == NULL
|| ! bfd_set_arch_mach (stub_file->the_bfd,
bfd_get_arch (link_info.output_bfd),
bfd_get_mach (link_info.output_bfd)))
{
einfo ("%X%P: can not create BFD %E\n");
return;
}
stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
ldlang_add_file (stub_file);
}
struct hook_stub_info
{
lang_statement_list_type add;
asection *input_section;
};
/* Traverse the linker tree to find the spot where the stub goes. */
static bfd_boolean
hook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp,
bfd_boolean afterp)
{
lang_statement_union_type *l;
bfd_boolean ret;
for (; (l = *lp) != NULL; lp = &l->header.next)
{
switch (l->header.type)
{
case lang_constructors_statement_enum:
ret = hook_in_stub (info, &constructor_list.head, afterp);
if (ret)
return ret;
break;
case lang_output_section_statement_enum:
ret = hook_in_stub (info,
&l->output_section_statement.children.head,
afterp);
if (ret)
return ret;
break;
case lang_wild_statement_enum:
ret = hook_in_stub (info, &l->wild_statement.children.head, afterp);
if (ret)
return ret;
break;
case lang_group_statement_enum:
ret = hook_in_stub (info, &l->group_statement.children.head, afterp);
if (ret)
return ret;
break;
case lang_input_section_enum:
if (l->input_section.section == info->input_section)
{
/* We've found our section. Insert the stub immediately
before or after its associated input section. */
if (afterp)
{
*(info->add.tail) = l->header.next;
l->header.next = info->add.head;
}
else
{
*lp = info->add.head;
*(info->add.tail) = l;
}
return TRUE;
}
break;
case lang_data_statement_enum:
case lang_reloc_statement_enum:
case lang_object_symbols_statement_enum:
case lang_output_statement_enum:
case lang_target_statement_enum:
case lang_input_statement_enum:
case lang_assignment_statement_enum:
case lang_padding_statement_enum:
case lang_address_statement_enum:
case lang_fill_statement_enum:
break;
default:
FAIL ();
break;
}
}
return FALSE;
}
/* Call-back for elf32_nios2_size_stubs. */
/* Create a new stub section, and arrange for it to be linked
immediately before or after INPUT_SECTION, according to AFTERP. */
static asection *
nios2elf_add_stub_section (const char *stub_sec_name, asection *input_section,
bfd_boolean afterp)
{
asection *stub_sec;
flagword flags;
asection *output_section;
const char *secname;
lang_output_section_statement_type *os;
struct hook_stub_info info;
flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
| SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
stub_sec_name, flags);
if (stub_sec == NULL)
goto err_ret;
output_section = input_section->output_section;
secname = bfd_get_section_name (output_section->owner, output_section);
os = lang_output_section_find (secname);
info.input_section = input_section;
lang_list_init (&info.add);
lang_add_section (&info.add, stub_sec, NULL, os);
if (info.add.head == NULL)
goto err_ret;
if (hook_in_stub (&info, &os->children.head, afterp))
return stub_sec;
err_ret:
einfo ("%X%P: can not make stub section: %E\n");
return NULL;
}
/* Another call-back for elf32_nios2_size_stubs. */
static void
nios2elf_layout_sections_again (void)
{
/* If we have changed sizes of the stub sections, then we need
to recalculate all the section offsets. This may mean we need to
add even more stubs. */
gld${EMULATION_NAME}_map_segments (TRUE);
need_laying_out = -1;
}
static void
build_section_lists (lang_statement_union_type *statement)
{
if (statement->header.type == lang_input_section_enum)
{
asection *i = statement->input_section.section;
if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
&& (i->flags & SEC_EXCLUDE) == 0
&& i->output_section != NULL
&& i->output_section->owner == link_info.output_bfd)
{
nios2_elf32_next_input_section (&link_info, i);
}
}
}
/* For Nios II we use this opportunity to build linker stubs. */
static void
gld${EMULATION_NAME}_after_allocation (void)
{
/* bfd_elf_discard_info just plays with data and debugging sections,
ie. doesn't affect code size, so we can delay resizing the
sections. It's likely we'll resize everything in the process of
adding stubs. */
if (bfd_elf_discard_info (link_info.output_bfd, &link_info))
need_laying_out = 1;
/* If generating a relocatable output file, then we don't
have to examine the relocs. */
if (stub_file != NULL && !link_info.relocatable && RELAXATION_ENABLED)
{
int ret = nios2_elf32_setup_section_lists (link_info.output_bfd,
&link_info);
if (ret != 0)
{
if (ret < 0)
{
einfo ("%X%P: can not size stub section: %E\n");
return;
}
lang_for_each_statement (build_section_lists);
/* Call into the BFD backend to do the real work. */
if (! nios2_elf32_size_stubs (link_info.output_bfd,
stub_file->the_bfd,
&link_info,
&nios2elf_add_stub_section,
&nios2elf_layout_sections_again))
{
einfo ("%X%P: can not size stub section: %E\n");
return;
}
}
}
if (need_laying_out != -1)
gld${EMULATION_NAME}_map_segments (need_laying_out);
if (!link_info.relocatable && RELAXATION_ENABLED)
{
/* Now build the linker stubs. */
if (stub_file != NULL && stub_file->the_bfd->sections != NULL)
{
if (! nios2_elf32_build_stubs (&link_info))
einfo ("%X%P: can not build stubs: %E\n");
}
}
}
/* Avoid processing the fake stub_file in vercheck, stat_needed and
check_needed routines. */
static void (*real_func) (lang_input_statement_type *);
static void nios2_for_each_input_file_wrapper (lang_input_statement_type *l)
{
if (l != stub_file)
(*real_func) (l);
}
static void
nios2_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
{
real_func = func;
lang_for_each_input_file (&nios2_for_each_input_file_wrapper);
}
#define lang_for_each_input_file nios2_lang_for_each_input_file
EOF
# Put these extra nios2elf routines in ld_${EMULATION_NAME}_emulation
#
LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=nios2elf_create_output_section_statements

View file

@ -18,6 +18,7 @@
@set MMIX
@set MSP430
@set NDS32
@set NIOSII
@set POWERPC
@set POWERPC64
@set Renesas

View file

@ -30,6 +30,7 @@
@set MMIX
@set MSP430
@set NDS32
@set NIOSII
@set POWERPC
@set POWERPC64
@set Renesas
@ -1605,6 +1606,9 @@ This option is only supported on a few targets.
@ifset M68HC11
@xref{M68HC11/68HC12,,@command{ld} and the 68HC11 and 68HC12}.
@end ifset
@ifset NIOSII
@xref{Nios II,,@command{ld} and the Altera Nios II}.
@end ifset
@ifset POWERPC
@xref{PowerPC ELF32,,@command{ld} and PowerPC 32-bit ELF Support}.
@end ifset
@ -6105,6 +6109,9 @@ functionality are not listed.
@ifset NDS32
* NDS32:: @command{ld} and NDS32
@end ifset
@ifset NIOSII
* Nios II:: @command{ld} and the Altera Nios II
@end ifset
@ifset POWERPC
* PowerPC ELF32:: @command{ld} and PowerPC 32-bit ELF Support
@end ifset
@ -6743,6 +6750,43 @@ Avoid generating the IFC instruction inside the loop.
@end ifclear
@end ifset
@ifset NIOSII
@ifclear GENERIC
@raisesections
@end ifclear
@node Nios II
@section @command{ld} and the Altera Nios II
@cindex Nios II call relaxation
@kindex --relax on Nios II
Call and immediate jump instructions on Nios II processors are limited to
transferring control to addresses in the same 256MB memory segment,
which may result in @command{ld} giving
@samp{relocation truncated to fit} errors with very large programs.
The command-line option @option{--relax} enables the generation of
trampolines that can access the entire 32-bit address space for calls
outside the normal @code{call} and @code{jmpi} address range. These
trampolines are inserted at section boundaries, so may not themselves
be reachable if an input section and its associated call trampolines are
larger than 256MB.
The @option{--relax} option is enabled by default unless @option{-r}
is also specified. You can disable trampoline generation by using the
@option{--no-relax} linker option. You can also disable this optimization
locally by using the @samp{set .noat} directive in assembly-language
source files, as the linker-inserted trampolines use the @code{at}
register as a temporary.
Note that the linker @option{--relax} option is independent of assembler
relaxation options, and that using the GNU assembler's @option{-relax-all}
option interferes with the linker's more selective call instruction relaxation.
@ifclear GENERIC
@lowersections
@end ifclear
@end ifset
@ifset POWERPC
@ifclear GENERIC
@raisesections

View file

@ -1,3 +1,27 @@
2014-01-30 Sandra Loosemore <sandra@codesourcery.com>
* ld-nios2/relax_call26.s: New.
* ld-nios2/relax_call26_boundary.ld: New.
* ld-nios2/relax_call26_boundary.s: New.
* ld-nios2/relax_call26_boundary_c8.d: New.
* ld-nios2/relax_call26_boundary_cc.d: New.
* ld-nios2/relax_call26_boundary_d0.d: New.
* ld-nios2/relax_call26_boundary_d4.d: New.
* ld-nios2/relax_call26_boundary_d8.d: New.
* ld-nios2/relax_call26_boundary_dc.d: New.
* ld-nios2/relax_call26_boundary_f0.d: New.
* ld-nios2/relax_call26_boundary_f4.d: New.
* ld-nios2/relax_call26_boundary_f8.d: New.
* ld-nios2/relax_call26_boundary_fc.d: New.
* ld-nios2/relax_call26_cache.d: New.
* ld-nios2/relax_call26_cache.ld: New.
* ld-nios2/relax_call26_cache.s: New.
* ld-nios2/relax_call26_multi.d: New.
* ld-nios2/relax_call26_multi.ld: New.
* ld-nios2/relax_call26_norelax.d: New.
* ld-nios2/relax_call26_shared.d: New.
* ld-nios2/relax_call26_shared.ld: New.
2014-01-29 H.J. Lu <hongjiu.lu@intel.com>
* ld-elf/rdynamic-1.c: New file.

View file

@ -0,0 +1,27 @@
# test for call26 relaxation via linker stubs
.globl text0
.section text0, "ax", @progbits
call func0 # in same section
call func1 # in nearby section
call func2a # in distant section
jmpi func2b # also in distant section
func0:
ret
.section text1, "ax", @progbits
func1:
nop
nop
call func2a # in distant section
ret
.section text2, "ax", @progbits
func2a:
nop
nop
nop
ret
func2b:
nop

View file

@ -0,0 +1,14 @@
/* Simple script for testing call26 relaxation via linker stubs.
This script is used for a bunch of tests that vary the placement of
section text0 near a 256 memory segment boundary, by using
--section-start command-line options. */
OUTPUT_FORMAT("elf32-littlenios2", "elf32-littlenios2", "elf32-littlenios2")
OUTPUT_ARCH(nios2)
ENTRY(_start)
SECTIONS
{
_start = .;
text0 : { *(text0) *(text1) }
text2 0x40000000 : { *(text2) }
}

View file

@ -0,0 +1,29 @@
# Test for call26 relaxation via linker stubs.
# This .s file is used with several different linker scripts that vary the
# placement of the sections in the output.
# Section text0 is 32 bytes long and requires at least 2 linker stubs
# (12 bytes each) to reach the call destinations in text2. Another stub
# may be required to reach func0 if the section is laid out so that it crosses
# a 256MB memory segment boundary.
.globl text0
.section text0, "ax", @progbits
call func0 # in same section
call func2a # in distant section
nop
nop
nop
nop
jmpi func2b # in distant section
func0:
ret
.section text2, "ax", @progbits
func2a:
nop
nop
nop
ret
func2b:
nop

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_c8
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0fffffc8
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_cc
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0fffffcc
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_d0
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0fffffd0
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_d4
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0fffffd4
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_d8
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0fffffd8
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_dc
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0fffffdc
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_f0
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0ffffff0
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_f4
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0ffffff4
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_f8
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0ffffff8
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_boundary_fc
#ld: --relax -Trelax_call26_boundary.ld --section-start=text0=0x0ffffffc
#source: relax_call26_boundary.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,9 @@
#name: NIOS2 relax_call26_cache
#ld: --relax -Trelax_call26_cache.ld
#source: relax_call26_cache.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs. We don't need to
# check the exact layout of stubs for this test, only verify that it
# links without "relocation truncated to fit" errors.
#pass

View file

@ -0,0 +1,13 @@
/* Simple script for testing call26 relaxation via linker stubs.
In this case, input sections text0 and text1 are placed in the
same output section in the same 256MB segment, so they can share stubs. */
OUTPUT_FORMAT("elf32-littlenios2", "elf32-littlenios2", "elf32-littlenios2")
OUTPUT_ARCH(nios2)
ENTRY(_start)
SECTIONS
{
_start = .;
text0 0x0fffffe0 : { *(text0) *(text1) }
text2 0x40000000 : { *(text2) }
}

View file

@ -0,0 +1,28 @@
# test for call26 relaxation via linker stubs
#
# The purpose of this test is to ensure that, when section text0 straddles
# a 256MB memory segment boundary with calls to the same function on either
# side, the stub caching doesn't get confused and incorrectly use a stub
# on the wrong side.
.globl text0
.section text0, "ax", @progbits
call func2a # in distant section
call func2a # in distant section
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
call func2a # in distant section
call func2a # in distant section
.section text2, "ax", @progbits
.globl func2a
func2a:
ret

View file

@ -0,0 +1,36 @@
#name: NIOS2 relax_call26_multi
#ld: --relax -Trelax_call26_multi.ld
#source: relax_call26.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs
.*: +file format elf32-littlenios2
Disassembly of section text0:
00000000 <_start> call 00000010 <func0>
00000004 <[^>]*> call 0000002c <func1>
00000008 <[^>]*> call 00000020 <[^>]*>
0000000c <[^>]*> jmpi 00000014 <[^>]*>
00000010 <func0> ret
00000014 <[^>]*> movhi at,16384
00000018 <[^>]*> addi at,at,16
0000001c <[^>]*> jmp at
00000020 <[^>]*> movhi at,16384
00000024 <[^>]*> addi at,at,0
00000028 <[^>]*> jmp at
Disassembly of section text1:
0000002c <func1> nop
00000030 <[^>]*> nop
00000034 <[^>]*> call 0000003c <[^>]*>
00000038 <[^>]*> ret
0000003c <[^>]*> movhi at,16384
00000040 <[^>]*> addi at,at,0
00000044 <[^>]*> jmp at
Disassembly of section text2:
40000000 <func2a> nop
40000004 <[^>]*> nop
40000008 <[^>]*> nop
4000000c <[^>]*> ret
40000010 <func2b> nop

View file

@ -0,0 +1,14 @@
/* Simple script for testing call26 relaxation via linker stubs.
In this case, input sections text0 and text1 cannot share stubs
because they are in different output sections. */
OUTPUT_FORMAT("elf32-littlenios2", "elf32-littlenios2", "elf32-littlenios2")
OUTPUT_ARCH(nios2)
ENTRY(_start)
SECTIONS
{
_start = .;
text0 0 : { *(text0) }
text1 : { *(text1) }
text2 0x40000000 : { *(text2) }
}

View file

@ -0,0 +1,5 @@
#name: NIOS2 relax_call26_norelax
#ld: --no-relax -Trelax_call26_multi.ld
#source: relax_call26.s
#error: .*relocation truncated to fit: R_NIOS2_CALL26.*
# Test relaxation of call26 relocations via linker stubs

View file

@ -0,0 +1,31 @@
#name: NIOS2 relax_call26_shared
#ld: --relax -Trelax_call26_shared.ld
#source: relax_call26.s
#objdump: -dr --prefix-addresses
# Test relaxation of call26 relocations via linker stubs
.*: +file format elf32-littlenios2
Disassembly of section text0:
00000000 <_start> call 00000010 <func0>
00000004 <[^>]*> call 00000014 <func1>
00000008 <[^>]*> call 00000030 <[^>]*>
0000000c <[^>]*> jmpi 00000024 <[^>]*>
00000010 <func0> ret
00000014 <func1> nop
00000018 <[^>]*> nop
0000001c <[^>]*> call 00000030 <[^>]*>
00000020 <[^>]*> ret
00000024 <[^>]*> movhi at,16384
00000028 <[^>]*> addi at,at,16
0000002c <[^>]*> jmp at
00000030 <[^>]*> movhi at,16384
00000034 <[^>]*> addi at,at,0
00000038 <[^>]*> jmp at
Disassembly of section text2:
40000000 <func2a> nop
40000004 <[^>]*> nop
40000008 <[^>]*> nop
4000000c <[^>]*> ret
40000010 <func2b> nop

View file

@ -0,0 +1,13 @@
/* Simple script for testing call26 relaxation via linker stubs.
In this case, input sections text0 and text1 are placed in the
same output section in the same 256MB segment, so they can share stubs. */
OUTPUT_FORMAT("elf32-littlenios2", "elf32-littlenios2", "elf32-littlenios2")
OUTPUT_ARCH(nios2)
ENTRY(_start)
SECTIONS
{
_start = .;
text0 0 : { *(text0) *(text1) }
text2 0x40000000 : { *(text2) }
}