binutils-gdb/ld/testsuite/ld-mips-elf/mips16-pic-1.inc
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

148 lines
3.0 KiB
PHP

# Declare a function called NAME and an __fn_NAME stub for it.
# Make the stub use la_TYPE to load the the target address into $2.
.macro stub,name,type
.set nomips16
.section .mips16.fn.\name, "ax", @progbits
.ent __fn_\name
__fn_\name:
la_\type \name
mfc1 $4,$f12
jr $2
nop
.end __fn_\name
.set mips16
.text
.ent \name
\name:
__fn_local_\name:
jr $31
nop
.end \name
.endm
# Like stub, but ensure NAME is a local symbol.
.macro lstub,name,type
stub \name, \type
.equ local_\name,1
.endm
# Like stub, but ensure NAME is a hidden symbol.
.macro hstub,name,type
.globl \name
.hidden \name
stub \name, \type
.endm
# Like lstub, but make the MIPS16 function global rather than local.
.macro gstub,name,type
.globl \name
stub \name, \type
.endm
# Use an absolute sequence to load NAME into a register.
.macro la_noshared,name
lui $2,%hi(\name)
addiu $2,$2,%lo(\name)
.endm
# Use the normal PIC sequence to load __fn_local_NAME into $2
# and emit a dummy relocation against NAME. This macro is always
# used at the start of a function.
.macro la_shared,name
.reloc 0,R_MIPS_NONE,\name
.cpload $25
la $2,__fn_local_\name
.endm
# Use TYPE (either LSTUB, HSTUB or GSTUB) to define functions
# called a_NAME and b_NAME. The former uses absolute accesses
# and the latter uses PIC accesses.
.macro decl,name,type
\type a_\name, noshared
\type b_\name, shared
.endm
# Emit the MIPS16 PIC sequence for setting $28 from $25.
# Make the value of $25 available in $2 as well.
.macro cpload_mips16
li $2,%hi(_gp_disp)
addiu $3,$pc,%lo(_gp_disp)
sll $2,16
addu $2,$2,$3
move $28,$2
.endm
# Likewise, but for non-MIPS16 code.
.macro cpload_nomips16
.cpload $25
move $2,$28
.endm
# Start a PIC function in ISA mode MODE, which is either "mips16"
# or "nomips16".
.macro pic_prologue,mode
cpload_\mode
addiu $sp,$sp,-32
sw $2,16($sp)
sw $31,20($sp)
.endm
# Use a PIC function to call NAME.
.macro pic_call,name,mode
.ifdef local_\name
.ifc \mode,mips16
lw $2,%got(__fn_local_\name)($2)
addiu $2,%lo(__fn_local_\name)
.else
lw $2,%got(\name)($2)
addiu $2,%lo(\name)
.endif
.else
lw $2,%call16(\name)($2)
.endif
jalr $2
move $25,$2
lw $2,16($sp)
move $28,$2
.endm
# Finish a PIC function started by pic_prologue.
.macro pic_epilogue
lw $2,20($sp)
jr $2
addiu $sp,$sp,32
.endm
# Use PIC %call16 sequences to call a_NAME and b_NAME.
# MODE selects the ISA mode of the code: either "mips16"
# or "nomips16".
.macro callpic,name,mode
.text
.set \mode
.ent callpic_\name\()_\mode
callpic_\name\()_\mode:
pic_prologue \mode
pic_call a_\name,\mode
pic_call b_\name,\mode
pic_epilogue
.end callpic_\name\()_\mode
.endm
# Use absolute jals to call a_NAME and b_NAME. MODE selects the
# ISA mode of the code: either "mips16" or "nomips16".
.macro jals,name,mode
.text
.set \mode
.ent jals_\name\()_\mode
jals_\name\()_\mode:
.option pic0
jal a_\name
nop
jal b_\name
nop
.option pic2
.end jals_\name\()_\mode
.endm