binutils-gdb/ld/testsuite/ld-mips-elf/mips16-local-stubs-1.d
Richard Sandiford 738e53487d bfd/
* reloc.c (BFD_RELOC_MIPS16_GOT16, BFD_RELOC_MIPS16_CALL16): Declare.
	* libbfd.h, bfd-in2.h: Regenerate.
	* elf32-mips.c (elf_mips16_howto_table_rel): Fill in reserved
	R_MIPS16_GOT16 and R_MIPS16_CALL16 entries.
	(mips16_reloc_map): Add mappings.
	* elf64-mips.c (mips16_elf64_howto_table_rel): Fill in reserved
	R_MIPS16_GOT16 and R_MIPS16_CALL16 entries.
	(mips16_elf64_howto_table_rela): Likewise.
	(mips16_reloc_map): Add mappings.
	* elfn32-mips.c (elf_mips16_howto_table_rel): Fill in reserved
	R_MIPS16_GOT16 and R_MIPS16_CALL16 entries.
	(elf_mips16_howto_table_rela): Likewise.
	(mips16_reloc_map): Add mappings.
	* elfxx-mips.c (mips_elf_create_shadow_symbol): New function.
	(section_allows_mips16_refs_p): Likewise.
	(mips16_stub_symndx): Likewise.
	(mips_elf_check_mips16_stubs): Treat the data argument as a
	bfd_link_info.  Mark every dynamic symbol as needing MIPS16 stubs
	and create a "shadow" symbol for the original MIPS16 definition.
	(mips16_reloc_p, got16_reloc_p, call16_reloc_p, hi16_reloc_p)
	(lo16_reloc_p, mips16_call_reloc_p): New functions.
	(_bfd_mips16_elf_reloc_unshuffle): Use mips16_reloc_p to generalize
	relocation checks.
	(_bfd_mips16_elf_reloc_shuffle): Likewise.
	(_bfd_mips_elf_lo16_reloc): Handle R_MIPS16_GOT16.
	(mips_elf_got16_entry): Add comment.
	(mips_elf_calculate_relocation): Use hi16_reloc_p,
	lo16_reloc_p, mips16_call_reloc_p, call16_reloc_p and got16_reloc_p
	to generalize relocation checks.  Use section_allows_mips16_refs_p
	instead of mips16_stub_section_p.   Handle R_MIPS16_CALL16 and
	R_MIPS16_GOT16, allowing the former to refer directly to a
	MIPS16 function if its stub is not needed.
	(mips16_stub_section_p): Delete.
	(_bfd_mips_elf_symbol_processing): Convert odd-valued function
	symbols into even MIPS16 symbols.
	(mips_elf_add_lo16_rel_addend): Use mips16_reloc_p to generalize
	a relocation check.
	(_bfd_mips_elf_check_relocs): Calculate "bed" and "rel_end"
	earlier in the function.  Use mips16_stub_symndx to identify
	the target function.  Avoid out-of-bounds accesses when the
	stub has no relocations; report an error instead.  Use
	section_allows_mips16_refs_p instead of mips16_stub_section_p.
	Use mips16_call_reloc_p and got16_reloc_p to generalize relocation
	checks.  Handle R_MIPS16_CALL16 and R_MIPS16_GOT16.  Don't create
	dynamic relocations for absolute references to __gnu_local_gp.
	(_bfd_mips_elf_always_size_sections): Pass a bfd_link_info as
	the argument to mips_elf_check_mips16_stubs.  Generalize comment.
	(_bfd_mips_elf_relocate_section): Use hi16_reloc_p and got16_reloc_p
	to generalize relocation checks.
	(_bfd_mips_elf_finish_dynamic_symbol): If a dynamic MIPS16 function
	symbol has a non-MIPS16 stub, redirect the symbol to the stub.
	Fix an overly long line.  Don't give dynamic symbols type STO_MIPS16.
	(_bfd_mips_elf_gc_sweep_hook): Handle R_MIPS16_CALL16 and
	R_MIPS16_GOT16.

gas/
	* config/tc-mips.c (mips16_reloc_p, got16_reloc_p, hi16_reloc_p)
	(lo16_reloc_p): New functions.
	(reloc_needs_lo_p): Use hi16_reloc_p and got16_reloc_p to
	generalize relocation checks.
	(matching_lo_reloc): New function.
	(fixup_has_matching_lo_p): Use it.
	(mips16_mark_labels): Don't clobber a symbol's visibility.
	(append_insn): Use hi16_reloc_p and lo16_reloc_p.
	(mips16_ip): Handle BFD_RELOC_MIPS16_GOT16 and BFD_RELOC_MIPS16_CALL16.
	(md_apply_fix): Likewise.
	(mips16_percent_op): Add %got and %call16.
	(mips_frob_file): Use got16_reloc_p to generalize relocation checks.
	Use matching_lo_reloc.
	(mips_force_relocation): Use hi16_reloc_p and lo16_reloc_p to
	generalize relocation checks.
	(mips_fix_adjustable): Use lo16_reloc_p to generalize relocation
	checks.

gas/testsuite/
	* gas/mips/elf-rel8-mips16.d, gas/mips/elf-rel8-mips16.s,
	* gas/mips/elf-rel9-mips16.d, gas/mips/elf-rel9-mips16.s,
	* gas/mips/elf-rel13-mips16.d, gas/mips/elf-rel13-mips16.s: New tests.
	* gas/mips/mips.exp: Run them.

ld/testsuite/
	* ld-mips-elf/mips16-local-stubs-1.d: Remove stub_for_h3,
	which was only referenced by the .pdr section, and was not
	actually needed by code.
	* ld-mips-elf/mips16-intermix.d: Remove unused static function stubs.
	* ld-mips-elf/mips16-pic-1a.s,
	ld-mips-elf/mips16-pic-1b.s,
	ld-mips-elf/mips16-pic-1-dummy.s,
	ld-mips-elf/mips16-pic-1.dd,
	ld-mips-elf/mips16-pic-1.gd,
	ld-mips-elf/mips16-pic-1.inc,
	ld-mips-elf/mips16-pic-1.ld,
	ld-mips-elf/mips16-pic-2a.s,
	ld-mips-elf/mips16-pic-2b.s,
	ld-mips-elf/mips16-pic-2.ad,
	ld-mips-elf/mips16-pic-2.dd,
	ld-mips-elf/mips16-pic-2.gd,
	ld-mips-elf/mips16-pic-2.nd,
	ld-mips-elf/mips16-pic-2.rd: New tests.
	* ld-mips-elf/mips-elf.exp: Run them.
2008-08-06 19:44:47 +00:00

108 lines
2.4 KiB
Makefile

#name: MIPS16 interlinking for local functions 1
#source: mips16-local-stubs-1.s
#as: -mips4
#ld: -Ttext 0x20000000 -e caller1
#objdump: -dr
#...
Disassembly of section \.text:
20000000 <f1>:
20000000: 03e00008 jr ra
20000004: 00000000 nop
20000008 <g1>:
20000008: 03e00008 jr ra
2000000c: 00000000 nop
20000010 <h1>:
20000010: e820 jr ra
20000012: 6500 nop
20000014 <f2>:
20000014: 03e00008 jr ra
20000018: 00000000 nop
2000001c <g2>:
2000001c: 03e00008 jr ra
20000020: 00000000 nop
20000024 <h2>:
20000024: e820 jr ra
20000026: 6500 nop
20000028 <f3>:
20000028: 03e00008 jr ra
2000002c: 00000000 nop
20000030 <g3>:
20000030: 03e00008 jr ra
20000034: 00000000 nop
20000038 <h3>:
20000038: e820 jr ra
2000003a: 6500 nop
2000003c <caller1>:
2000003c: 0c000000 jal 20000000 <f1>
20000040: 00000000 nop
20000044: 0c000005 jal 20000014 <f2>
20000048: 00000000 nop
2000004c: 0c000002 jal 20000008 <g1>
20000050: 00000000 nop
20000054: 0c000007 jal 2000001c <g2>
20000058: 00000000 nop
2000005c: 0c000024 jal 20000090 <stub_for_h1>
20000060: 00000000 nop
20000064: 0c000028 jal 200000a0 <stub_for_h2>
20000068: 00000000 nop
2000006c <caller2>:
2000006c: 1c00 002c jalx 200000b0 <stub_for_f1>
20000070: 6500 nop
20000072: 1c00 0034 jalx 200000d0 <stub_for_f2>
20000076: 6500 nop
20000078: 1c00 0030 jalx 200000c0 <stub_for_g1>
2000007c: 6500 nop
2000007e: 1c00 0038 jalx 200000e0 <stub_for_g2>
20000082: 6500 nop
20000084: 1800 0004 jal 20000010 <h1>
20000088: 6500 nop
2000008a: 1800 0009 jal 20000024 <h2>
2000008e: 6500 nop
20000090 <stub_for_h1>:
20000090: 3c012000 lui at,0x2000
20000094: 24210011 addiu at,at,17
20000098: 00200008 jr at
2000009c: 00000000 nop
200000a0 <stub_for_h2>:
200000a0: 3c012000 lui at,0x2000
200000a4: 24210025 addiu at,at,37
200000a8: 00200008 jr at
200000ac: 00000000 nop
200000b0 <stub_for_f1>:
200000b0: 3c012000 lui at,0x2000
200000b4: 24210000 addiu at,at,0
200000b8: 00200008 jr at
200000bc: 00000000 nop
200000c0 <stub_for_g1>:
200000c0: 3c012000 lui at,0x2000
200000c4: 24210008 addiu at,at,8
200000c8: 00200008 jr at
200000cc: 00000000 nop
200000d0 <stub_for_f2>:
200000d0: 3c012000 lui at,0x2000
200000d4: 24210014 addiu at,at,20
200000d8: 00200008 jr at
200000dc: 00000000 nop
200000e0 <stub_for_g2>:
200000e0: 3c012000 lui at,0x2000
200000e4: 2421001c addiu at,at,28
200000e8: 00200008 jr at
200000ec: 00000000 nop