Improve TLS support on TILE-Gx/TILEPro:

- Add support for TLS LE references.
- Support linker optimization of TLS references.
- Delete relocations of GOT/tp relative offsets beyond 32-bits.

This brings binutils in line with the support expected in gcc 4.7, for
TILE-Gx/TILEPro.

bfd/
	* reloc.c: Add BFD_RELOC_TILEPRO_TLS_GD_CALL,
	BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD,
	BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD,
	BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD,
	BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD,
	BFD_RELOC_TILEPRO_TLS_IE_LOAD, BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE,
	BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE,
	BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO,
	BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO,
	BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI,
	BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI,
	BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA,
	BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA,
	BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE,
	BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE,
	BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE,
	BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE,
	BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE,
	BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE,
	BFD_RELOC_TILEGX_TLS_GD_CALL, BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD,
	BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD,
	BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD,
	BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD, BFD_RELOC_TILEGX_TLS_IE_LOAD,
	BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD,
	BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD,
	BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD, BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD.
	Delete BFD_RELOC_TILEGX_IMM16_X0_HW1_GOT,
	BFD_RELOC_TILEGX_IMM16_X1_HW1_GOT,
	BFD_RELOC_TILEGX_IMM16_X0_HW2_GOT,
	BFD_RELOC_TILEGX_IMM16_X1_HW2_GOT,
	BFD_RELOC_TILEGX_IMM16_X0_HW3_GOT,
	BFD_RELOC_TILEGX_IMM16_X1_HW3_GOT,
	BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_GOT,
	BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_GOT,
	BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_GD,
	BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_IE,
	BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_IE,
	BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_IE,
	BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_IE,
	BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_IE,
	BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_IE,
	BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_IE,
	BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_IE.
	* elf32-tilepro.c (tilepro_elf_howto_table): Update tilepro
	relocations.
	(tilepro_reloc_map): Ditto.
	(tilepro_info_to_howto_rela): Ditto.
	(reloc_to_create_func): Ditto.
	(tilepro_tls_translate_to_le): New.
	(tilepro_tls_translate_to_ie): New.
	(tilepro_elf_tls_transition): New.
	(tilepro_elf_check_relocs): Handle new tls relocations.
	(tilepro_elf_gc_sweep_hook): Ditto.
	(allocate_dynrelocs): Ditto.
	(tilepro_elf_relocate_section): Ditto.
	(tilepro_replace_insn): New.
	(insn_mask_X1): New.
	(insn_mask_X0_no_dest_no_srca): New
	(insn_mask_X1_no_dest_no_srca): New
	(insn_mask_Y0_no_dest_no_srca): New
	(insn_mask_Y1_no_dest_no_srca): New
	(srca_mask_X0): New
	(srca_mask_X1): New
	(insn_tls_le_move_X1): New
	(insn_tls_le_move_zero_X0X1): New
	(insn_tls_ie_lw_X1): New
	(insn_tls_ie_add_X0X1): New
	(insn_tls_ie_add_Y0Y1): New
	(insn_tls_gd_add_X0X1): New
	(insn_tls_gd_add_Y0Y1): New
	* elfxx-tilegx.c (tilegx_elf_howto_table): Update tilegx
	relocations.
	(tilegx_reloc_map): Ditto.
	(tilegx_info_to_howto_rela): Ditto.
	(reloc_to_create_func): Ditto.
	(tilegx_elf_link_hash_table): New field disable_le_transition.
	(tilegx_tls_translate_to_le): New.
	(tilegx_tls_translate_to_ie): New.
	(tilegx_elf_tls_transition): New.
	(tilegx_elf_check_relocs): Handle new tls relocations.
	(tilegx_elf_gc_sweep_hook): Ditto.
	(allocate_dynrelocs): Ditto.
	(tilegx_elf_relocate_section): Ditto.
	(tilegx_copy_bits): New.
	(tilegx_replace_insn): New.
	(insn_mask_X1): New.
	(insn_mask_X0_no_dest_no_srca): New.
	(insn_mask_X1_no_dest_no_srca): New.
	(insn_mask_Y0_no_dest_no_srca): New.
	(insn_mask_Y1_no_dest_no_srca): New.
	(insn_mask_X0_no_operand): New.
	(insn_mask_X1_no_operand): New.
	(insn_mask_Y0_no_operand): New.
	(insn_mask_Y1_no_operand): New.
	(insn_tls_ie_ld_X1): New.
	(insn_tls_ie_ld4s_X1): New.
	(insn_tls_ie_add_X0X1): New.
	(insn_tls_ie_add_Y0Y1): New.
	(insn_tls_ie_addx_X0X1): New.
	(insn_tls_ie_addx_Y0Y1): New.
	(insn_tls_gd_add_X0X1): New.
	(insn_tls_gd_add_Y0Y1): New.
	(insn_move_X0X1): New.
	(insn_move_Y0Y1): New.
	(insn_add_X0X1): New.
	(insn_add_Y0Y1): New.
	(insn_addx_X0X1): New.
	(insn_addx_Y0Y1): New.
	* libbfd.h: Regenerate.
	* bfd-in2.h: Regenerate.

gas/
	* tc-tilepro.c (O_tls_le): Define operator.
	(O_tls_le_lo16): Ditto.
	(O_tls_le_hi16): Ditto.
	(O_tls_le_ha16): Ditto.
	(O_tls_gd_call): Ditto.
	(O_tls_gd_add): Ditto.
	(O_tls_ie_load): Ditto.
	(md_begin): Delete old operators; handle new operators.
	(emit_tilepro_instruction): Ditto.
	(md_apply_fix): Ditto.
	* tc-tilegx.c (O_hw1_got): Delete operator.
	(O_hw2_got): Ditto.
	(O_hw3_got): Ditto.
	(O_hw2_last_got): Ditto.
	(O_hw1_tls_gd): Ditto.
	(O_hw2_tls_gd): Ditto.
	(O_hw3_tls_gd): Ditto.
	(O_hw2_last_tls_gd): Ditto.
	(O_hw1_tls_ie): Ditto.
	(O_hw2_tls_ie): Ditto.
	(O_hw3_tls_ie): Ditto.
	(O_hw2_last_tls_ie): Ditto.
	(O_hw0_tls_le): Define operator.
	(O_hw0_last_tls_le): Ditto.
	(O_hw1_last_tls_le): Ditto.
	(O_tls_gd_call): Ditto.
	(O_tls_gd_add): Ditto.
	(O_tls_ie_load): Ditto.
	(O_tls_add): Ditto.
	(md_begin): Delete old operators; handle new operators.
	(emit_tilegx_instruction): Ditto.
	(md_apply_fix): Ditto.
	* doc/c-tilegx.texi: Delete old operators; document new operators.
	* doc/c-tilepro.texi: Ditto.

include/elf/
	* tilegx.h (R_TILEGX_IMM16_X0_HW1_GOT): Delete.
	(R_TILEGX_IMM16_X1_HW1_GOT): Ditto.
	(R_TILEGX_IMM16_X0_HW2_GOT): Ditto.
	(R_TILEGX_IMM16_X1_HW2_GOT): Ditto.
	(R_TILEGX_IMM16_X0_HW3_GOT): Ditto.
	(R_TILEGX_IMM16_X1_HW3_GOT): Ditto.
	(R_TILEGX_IMM16_X0_HW2_LAST_GOT): Ditto.
	(R_TILEGX_IMM16_X1_HW2_LAST_GOT): Ditto.
	(R_TILEGX_IMM16_X0_HW1_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X1_HW1_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X0_HW2_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X1_HW2_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X0_HW3_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X1_HW3_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD): Ditto.
	(R_TILEGX_IMM16_X0_HW1_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X1_HW1_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X0_HW2_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X1_HW2_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X0_HW3_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X1_HW3_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE): Ditto.
	(R_TILEGX_IMM16_X0_HW0_TLS_LE): New relocation.
	(R_TILEGX_IMM16_X1_HW0_TLS_LE): Ditto.
	(R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE): Ditto.
	(R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE): Ditto.
	(R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE): Ditto.
	(R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE): Ditto.
	(R_TILEGX_TLS_GD_CALL): Ditto.
	(R_TILEGX_IMM8_X0_TLS_GD_ADD): Ditto.
	(R_TILEGX_IMM8_X1_TLS_GD_ADD): Ditto.
	(R_TILEGX_IMM8_Y0_TLS_GD_ADD): Ditto.
	(R_TILEGX_IMM8_Y1_TLS_GD_ADD): Ditto.
	(R_TILEGX_TLS_IE_LOAD): Ditto.
	(R_TILEGX_IMM8_X0_TLS_ADD): Ditto.
	(R_TILEGX_IMM8_X1_TLS_ADD): Ditto.
	(R_TILEGX_IMM8_Y0_TLS_ADD): Ditto.
	(R_TILEGX_IMM8_Y1_TLS_ADD): Ditto.
	* tilepro.h (R_TILEPRO_TLS_GD_CALL): New relocation.
	(R_TILEPRO_IMM8_X0_TLS_GD_ADD): Ditto.
	(R_TILEPRO_IMM8_X1_TLS_GD_ADD): Ditto.
	(R_TILEPRO_IMM8_Y0_TLS_GD_ADD): Ditto.
	(R_TILEPRO_IMM8_Y1_TLS_GD_ADD): Ditto.
	(R_TILEPRO_TLS_IE_LOAD): Ditto.
	(R_TILEPRO_IMM16_X0_TLS_LE): Ditto.
	(R_TILEPRO_IMM16_X1_TLS_LE): Ditto.
	(R_TILEPRO_IMM16_X0_TLS_LE_LO): Ditto.
	(R_TILEPRO_IMM16_X1_TLS_LE_LO): Ditto.
	(R_TILEPRO_IMM16_X0_TLS_LE_HI): Ditto.
	(R_TILEPRO_IMM16_X1_TLS_LE_HI): Ditto.
	(R_TILEPRO_IMM16_X0_TLS_LE_HA): Ditto.
	(R_TILEPRO_IMM16_X1_TLS_LE_HA): Ditto.

include/opcode/
	* tilegx.h (tilegx_mnemonic): Add TILEGX_OPC_LD4S_TLS,
	TILEGX_OPC_LD_TLS.
	* tilepro.h (tilepro_mnemonic): Add TILEPRO_OPC_LW_TLS,
	TILEPRO_OPC_LW_TLS_SN.

opcodes/
	* tilegx-opc.c: Handle TILEGX_OPC_LD4S_TLS and TILEGX_OPC_LD_TLS.
	* tilepro-opc.c: Handle TILEPRO_OPC_LW_TLS and
	TILEPRO_OPC_LW_TLS_SN.
This commit is contained in:
Walter Lee
2012-02-25 22:24:21 +00:00
parent 5414dbefea
commit 6f7be9592d
20 changed files with 2894 additions and 1560 deletions

View File

@ -1,3 +1,122 @@
2012-02-25 Walter Lee <walt@tilera.com>
* reloc.c: Add BFD_RELOC_TILEPRO_TLS_GD_CALL,
BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD,
BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD,
BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD,
BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD,
BFD_RELOC_TILEPRO_TLS_IE_LOAD, BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA,
BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE,
BFD_RELOC_TILEGX_TLS_GD_CALL, BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD,
BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD,
BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD,
BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD, BFD_RELOC_TILEGX_TLS_IE_LOAD,
BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD,
BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD,
BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD, BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD.
Delete BFD_RELOC_TILEGX_IMM16_X0_HW1_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW1_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW2_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW2_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW3_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW3_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_IE.
* elf32-tilepro.c (tilepro_elf_howto_table): Update tilepro
relocations.
(tilepro_reloc_map): Ditto.
(tilepro_info_to_howto_rela): Ditto.
(reloc_to_create_func): Ditto.
(tilepro_tls_translate_to_le): New.
(tilepro_tls_translate_to_ie): New.
(tilepro_elf_tls_transition): New.
(tilepro_elf_check_relocs): Handle new tls relocations.
(tilepro_elf_gc_sweep_hook): Ditto.
(allocate_dynrelocs): Ditto.
(tilepro_elf_relocate_section): Ditto.
(tilepro_replace_insn): New.
(insn_mask_X1): New.
(insn_mask_X0_no_dest_no_srca): New
(insn_mask_X1_no_dest_no_srca): New
(insn_mask_Y0_no_dest_no_srca): New
(insn_mask_Y1_no_dest_no_srca): New
(srca_mask_X0): New
(srca_mask_X1): New
(insn_tls_le_move_X1): New
(insn_tls_le_move_zero_X0X1): New
(insn_tls_ie_lw_X1): New
(insn_tls_ie_add_X0X1): New
(insn_tls_ie_add_Y0Y1): New
(insn_tls_gd_add_X0X1): New
(insn_tls_gd_add_Y0Y1): New
* elfxx-tilegx.c (tilegx_elf_howto_table): Update tilegx
relocations.
(tilegx_reloc_map): Ditto.
(tilegx_info_to_howto_rela): Ditto.
(reloc_to_create_func): Ditto.
(tilegx_elf_link_hash_table): New field disable_le_transition.
(tilegx_tls_translate_to_le): New.
(tilegx_tls_translate_to_ie): New.
(tilegx_elf_tls_transition): New.
(tilegx_elf_check_relocs): Handle new tls relocations.
(tilegx_elf_gc_sweep_hook): Ditto.
(allocate_dynrelocs): Ditto.
(tilegx_elf_relocate_section): Ditto.
(tilegx_copy_bits): New.
(tilegx_replace_insn): New.
(insn_mask_X1): New.
(insn_mask_X0_no_dest_no_srca): New.
(insn_mask_X1_no_dest_no_srca): New.
(insn_mask_Y0_no_dest_no_srca): New.
(insn_mask_Y1_no_dest_no_srca): New.
(insn_mask_X0_no_operand): New.
(insn_mask_X1_no_operand): New.
(insn_mask_Y0_no_operand): New.
(insn_mask_Y1_no_operand): New.
(insn_tls_ie_ld_X1): New.
(insn_tls_ie_ld4s_X1): New.
(insn_tls_ie_add_X0X1): New.
(insn_tls_ie_add_Y0Y1): New.
(insn_tls_ie_addx_X0X1): New.
(insn_tls_ie_addx_Y0Y1): New.
(insn_tls_gd_add_X0X1): New.
(insn_tls_gd_add_Y0Y1): New.
(insn_move_X0X1): New.
(insn_move_Y0Y1): New.
(insn_add_X0X1): New.
(insn_add_Y0Y1): New.
(insn_addx_X0X1): New.
(insn_addx_Y0Y1): New.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
2012-02-25 Walter Lee <walt@tilera.com> 2012-02-25 Walter Lee <walt@tilera.com>
* config.bfd (tilegx-*-*): rename little endian vector; add big * config.bfd (tilegx-*-*): rename little endian vector; add big

View File

@ -4959,6 +4959,12 @@ the dynamic object into the runtime process image. */
BFD_RELOC_TILEPRO_SHAMT_X1, BFD_RELOC_TILEPRO_SHAMT_X1,
BFD_RELOC_TILEPRO_SHAMT_Y0, BFD_RELOC_TILEPRO_SHAMT_Y0,
BFD_RELOC_TILEPRO_SHAMT_Y1, BFD_RELOC_TILEPRO_SHAMT_Y1,
BFD_RELOC_TILEPRO_TLS_GD_CALL,
BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD,
BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD,
BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD,
BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD,
BFD_RELOC_TILEPRO_TLS_IE_LOAD,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD, BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD, BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO, BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO,
@ -4978,6 +4984,14 @@ the dynamic object into the runtime process image. */
BFD_RELOC_TILEPRO_TLS_DTPMOD32, BFD_RELOC_TILEPRO_TLS_DTPMOD32,
BFD_RELOC_TILEPRO_TLS_DTPOFF32, BFD_RELOC_TILEPRO_TLS_DTPOFF32,
BFD_RELOC_TILEPRO_TLS_TPOFF32, BFD_RELOC_TILEPRO_TLS_TPOFF32,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI,
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA,
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA,
/* Tilera TILE-Gx Relocations. */ /* Tilera TILE-Gx Relocations. */
BFD_RELOC_TILEGX_HW0, BFD_RELOC_TILEGX_HW0,
@ -5037,52 +5051,44 @@ the dynamic object into the runtime process image. */
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL, BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL,
BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT, BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT, BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW1_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW1_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW2_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW2_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW3_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW3_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT, BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT, BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT, BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT, BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_GOT,
BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD, BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD, BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_GD, BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_GD, BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_GD, BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_GD, BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_GD, BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_GD, BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE,
BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_GD,
BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE, BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE, BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_IE,
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_IE,
BFD_RELOC_TILEGX_TLS_DTPMOD64, BFD_RELOC_TILEGX_TLS_DTPMOD64,
BFD_RELOC_TILEGX_TLS_DTPOFF64, BFD_RELOC_TILEGX_TLS_DTPOFF64,
BFD_RELOC_TILEGX_TLS_TPOFF64, BFD_RELOC_TILEGX_TLS_TPOFF64,
BFD_RELOC_TILEGX_TLS_DTPMOD32, BFD_RELOC_TILEGX_TLS_DTPMOD32,
BFD_RELOC_TILEGX_TLS_DTPOFF32, BFD_RELOC_TILEGX_TLS_DTPOFF32,
BFD_RELOC_TILEGX_TLS_TPOFF32, BFD_RELOC_TILEGX_TLS_TPOFF32,
BFD_RELOC_TILEGX_TLS_GD_CALL,
BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD,
BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD,
BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD,
BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD,
BFD_RELOC_TILEGX_TLS_IE_LOAD,
BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD,
BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD,
BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD,
BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD,
/* Adapteva EPIPHANY - 8 bit signed pc-relative displacement */ /* Adapteva EPIPHANY - 8 bit signed pc-relative displacement */
BFD_RELOC_EPIPHANY_SIMM8, BFD_RELOC_EPIPHANY_SIMM8,

View File

@ -380,12 +380,26 @@ static reloc_howto_type tilepro_elf_howto_table [] =
EMPTY_HOWTO (57), EMPTY_HOWTO (57),
EMPTY_HOWTO (58), EMPTY_HOWTO (58),
EMPTY_HOWTO (59), EMPTY_HOWTO (59),
EMPTY_HOWTO (60),
EMPTY_HOWTO (61), HOWTO (R_TILEPRO_TLS_GD_CALL, /* type */
EMPTY_HOWTO (62), TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
EMPTY_HOWTO (63), 2, /* size (0 = byte, 1 = short, 2 = long) */
EMPTY_HOWTO (64), 29, /* bitsize */
EMPTY_HOWTO (65), TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed,/* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_TILEPRO_TLS_GD_CALL", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
-1, /* dst_mask */
TRUE), /* pcrel_offset */
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X0_TLS_GD_ADD, 0, 8),
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X1_TLS_GD_ADD, 0, 8),
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y0_TLS_GD_ADD, 0, 8),
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y1_TLS_GD_ADD, 0, 8),
TILEPRO_IMM_HOWTO(R_TILEPRO_TLS_IE_LOAD, 0, 8),
/* Offsets into the GOT of TLS Descriptors. */ /* Offsets into the GOT of TLS Descriptors. */
@ -454,17 +468,12 @@ static reloc_howto_type tilepro_elf_howto_table [] =
-1, /* dst_mask */ -1, /* dst_mask */
TRUE), /* pcrel_offset */ TRUE), /* pcrel_offset */
#define TILEPRO_IMM16_HOWTO_TLS_IE(name, rshift) \ TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_IE_LO, 0),
HOWTO (name, rshift, 1, 16, FALSE, 0, \ TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_LO, 0),
complain_overflow_dont, bfd_elf_generic_reloc, \ TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_IE_HI, 16),
#name, FALSE, 0, 0xffff, TRUE) TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_HI, 16),
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_IE_HA, 16),
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_LO, 0), TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_HA, 16),
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_LO, 0),
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HI, 16),
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HI, 16),
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HA, 16),
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HA, 16),
/* These are common with the Solaris TLS implementation. */ /* These are common with the Solaris TLS implementation. */
HOWTO(R_TILEPRO_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont, HOWTO(R_TILEPRO_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
@ -475,8 +484,42 @@ static reloc_howto_type tilepro_elf_howto_table [] =
FALSE, 0, 0xFFFFFFFF, TRUE), FALSE, 0, 0xFFFFFFFF, TRUE),
HOWTO(R_TILEPRO_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont, HOWTO(R_TILEPRO_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
bfd_elf_generic_reloc, "R_TILEPRO_TLS_TPOFF32", bfd_elf_generic_reloc, "R_TILEPRO_TLS_TPOFF32",
FALSE, 0, 0, TRUE) FALSE, 0, 0, TRUE),
HOWTO (R_TILEPRO_IMM16_X0_TLS_LE,/* type */
0, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_TILEPRO_IMM16_X0_TLS_LE",/* name */
FALSE, /* partial_inplace */
0, /* src_mask */
-1, /* dst_mask */
TRUE), /* pcrel_offset */
HOWTO (R_TILEPRO_IMM16_X1_TLS_LE,/* type */
0, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_TILEPRO_IMM16_X1_TLS_LE",/* name */
FALSE, /* partial_inplace */
0, /* src_mask */
-1, /* dst_mask */
TRUE), /* pcrel_offset */
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_LE_LO, 0),
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_LE_LO, 0),
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_LE_HI, 16),
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_LE_HI, 16),
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_LE_HA, 16),
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_LE_HA, 16),
}; };
static reloc_howto_type tilepro_elf_howto_table2 [] = static reloc_howto_type tilepro_elf_howto_table2 [] =
@ -590,6 +633,13 @@ static const reloc_map tilepro_reloc_map [] =
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0, R_TILEPRO_SHAMT_Y0) TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0, R_TILEPRO_SHAMT_Y0)
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1, R_TILEPRO_SHAMT_Y1) TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1, R_TILEPRO_SHAMT_Y1)
TH_REMAP (BFD_RELOC_TILEPRO_TLS_GD_CALL, R_TILEPRO_TLS_GD_CALL)
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD, R_TILEPRO_IMM8_X0_TLS_GD_ADD)
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD, R_TILEPRO_IMM8_X1_TLS_GD_ADD)
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD, R_TILEPRO_IMM8_Y0_TLS_GD_ADD)
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD, R_TILEPRO_IMM8_Y1_TLS_GD_ADD)
TH_REMAP (BFD_RELOC_TILEPRO_TLS_IE_LOAD, R_TILEPRO_TLS_IE_LOAD)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD, R_TILEPRO_IMM16_X0_TLS_GD) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD, R_TILEPRO_IMM16_X0_TLS_GD)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD, R_TILEPRO_IMM16_X1_TLS_GD) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD, R_TILEPRO_IMM16_X1_TLS_GD)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO, R_TILEPRO_IMM16_X0_TLS_GD_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO, R_TILEPRO_IMM16_X0_TLS_GD_LO)
@ -612,6 +662,15 @@ static const reloc_map tilepro_reloc_map [] =
TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPOFF32, R_TILEPRO_TLS_DTPOFF32) TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPOFF32, R_TILEPRO_TLS_DTPOFF32)
TH_REMAP (BFD_RELOC_TILEPRO_TLS_TPOFF32, R_TILEPRO_TLS_TPOFF32) TH_REMAP (BFD_RELOC_TILEPRO_TLS_TPOFF32, R_TILEPRO_TLS_TPOFF32)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE, R_TILEPRO_IMM16_X0_TLS_LE)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE, R_TILEPRO_IMM16_X1_TLS_LE)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO, R_TILEPRO_IMM16_X0_TLS_LE_LO)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO, R_TILEPRO_IMM16_X1_TLS_LE_LO)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI, R_TILEPRO_IMM16_X0_TLS_LE_HI)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI, R_TILEPRO_IMM16_X1_TLS_LE_HI)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA, R_TILEPRO_IMM16_X0_TLS_LE_HA)
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA, R_TILEPRO_IMM16_X1_TLS_LE_HA)
#undef TH_REMAP #undef TH_REMAP
{ BFD_RELOC_VTABLE_INHERIT, R_TILEPRO_GNU_VTINHERIT, tilepro_elf_howto_table2 }, { BFD_RELOC_VTABLE_INHERIT, R_TILEPRO_GNU_VTINHERIT, tilepro_elf_howto_table2 },
@ -745,7 +804,7 @@ tilepro_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
{ {
unsigned int r_type = ELF32_R_TYPE (dst->r_info); unsigned int r_type = ELF32_R_TYPE (dst->r_info);
if (r_type <= (unsigned int) R_TILEPRO_TLS_TPOFF32) if (r_type <= (unsigned int) R_TILEPRO_IMM16_X1_TLS_LE_HA)
cache_ptr->howto = &tilepro_elf_howto_table [r_type]; cache_ptr->howto = &tilepro_elf_howto_table [r_type];
else if (r_type - R_TILEPRO_GNU_VTINHERIT else if (r_type - R_TILEPRO_GNU_VTINHERIT
<= (unsigned int) R_TILEPRO_GNU_VTENTRY) <= (unsigned int) R_TILEPRO_GNU_VTENTRY)
@ -845,7 +904,20 @@ static const tilepro_create_func reloc_to_create_func[] =
create_Imm16_X0, create_Imm16_X0,
create_Imm16_X1, create_Imm16_X1,
create_Imm16_X0, create_Imm16_X0,
create_Imm16_X1 create_Imm16_X1,
NULL,
NULL,
NULL,
create_Imm16_X0,
create_Imm16_X1,
create_Imm16_X0,
create_Imm16_X1,
create_Imm16_X0,
create_Imm16_X1,
create_Imm16_X0,
create_Imm16_X1,
}; };
#define NELEMS(a) ((int) (sizeof (a) / sizeof ((a)[0]))) #define NELEMS(a) ((int) (sizeof (a) / sizeof ((a)[0])))
@ -1288,6 +1360,99 @@ tilepro_elf_copy_indirect_symbol (struct bfd_link_info *info,
_bfd_elf_link_hash_copy_indirect (info, dir, ind); _bfd_elf_link_hash_copy_indirect (info, dir, ind);
} }
static int
tilepro_tls_translate_to_le (int r_type)
{
switch (r_type)
{
case R_TILEPRO_IMM16_X0_TLS_GD:
case R_TILEPRO_IMM16_X0_TLS_IE:
return R_TILEPRO_IMM16_X0_TLS_LE;
case R_TILEPRO_IMM16_X1_TLS_GD:
case R_TILEPRO_IMM16_X1_TLS_IE:
return R_TILEPRO_IMM16_X1_TLS_LE;
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
case R_TILEPRO_IMM16_X0_TLS_IE_LO:
return R_TILEPRO_IMM16_X0_TLS_LE_LO;
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
case R_TILEPRO_IMM16_X1_TLS_IE_LO:
return R_TILEPRO_IMM16_X1_TLS_LE_LO;
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
case R_TILEPRO_IMM16_X0_TLS_IE_HI:
return R_TILEPRO_IMM16_X0_TLS_LE_HI;
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
case R_TILEPRO_IMM16_X1_TLS_IE_HI:
return R_TILEPRO_IMM16_X1_TLS_LE_HI;
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
return R_TILEPRO_IMM16_X0_TLS_LE_HA;
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
return R_TILEPRO_IMM16_X1_TLS_LE_HA;
}
return r_type;
}
static int
tilepro_tls_translate_to_ie (int r_type)
{
switch (r_type)
{
case R_TILEPRO_IMM16_X0_TLS_GD:
case R_TILEPRO_IMM16_X0_TLS_IE:
return R_TILEPRO_IMM16_X0_TLS_IE;
case R_TILEPRO_IMM16_X1_TLS_GD:
case R_TILEPRO_IMM16_X1_TLS_IE:
return R_TILEPRO_IMM16_X1_TLS_IE;
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
case R_TILEPRO_IMM16_X0_TLS_IE_LO:
return R_TILEPRO_IMM16_X0_TLS_IE_LO;
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
case R_TILEPRO_IMM16_X1_TLS_IE_LO:
return R_TILEPRO_IMM16_X1_TLS_IE_LO;
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
case R_TILEPRO_IMM16_X0_TLS_IE_HI:
return R_TILEPRO_IMM16_X0_TLS_IE_HI;
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
case R_TILEPRO_IMM16_X1_TLS_IE_HI:
return R_TILEPRO_IMM16_X1_TLS_IE_HI;
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
return R_TILEPRO_IMM16_X0_TLS_IE_HA;
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
return R_TILEPRO_IMM16_X1_TLS_IE_HA;
}
return r_type;
}
static int
tilepro_elf_tls_transition (struct bfd_link_info *info, int r_type,
int is_local)
{
if (info->shared)
return r_type;
if (is_local)
return tilepro_tls_translate_to_le (r_type);
else
return tilepro_tls_translate_to_ie (r_type);
}
/* Look through the relocs for a section during the first phase, and /* Look through the relocs for a section during the first phase, and
allocate space in the global offset table or procedure linkage allocate space in the global offset table or procedure linkage
table. */ table. */
@ -1348,8 +1513,21 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
} }
r_type = tilepro_elf_tls_transition (info, r_type, h == NULL);
switch (r_type) switch (r_type)
{ {
case R_TILEPRO_IMM16_X0_TLS_LE:
case R_TILEPRO_IMM16_X1_TLS_LE:
case R_TILEPRO_IMM16_X0_TLS_LE_LO:
case R_TILEPRO_IMM16_X1_TLS_LE_LO:
case R_TILEPRO_IMM16_X0_TLS_LE_HI:
case R_TILEPRO_IMM16_X1_TLS_LE_HI:
case R_TILEPRO_IMM16_X0_TLS_LE_HA:
case R_TILEPRO_IMM16_X1_TLS_LE_HA:
if (info->shared)
goto r_tilepro_plt32;
break;
case R_TILEPRO_IMM16_X0_TLS_GD: case R_TILEPRO_IMM16_X0_TLS_GD:
case R_TILEPRO_IMM16_X1_TLS_GD: case R_TILEPRO_IMM16_X1_TLS_GD:
case R_TILEPRO_IMM16_X0_TLS_GD_LO: case R_TILEPRO_IMM16_X0_TLS_GD_LO:
@ -1358,6 +1536,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_TILEPRO_IMM16_X1_TLS_GD_HI: case R_TILEPRO_IMM16_X1_TLS_GD_HI:
case R_TILEPRO_IMM16_X0_TLS_GD_HA: case R_TILEPRO_IMM16_X0_TLS_GD_HA:
case R_TILEPRO_IMM16_X1_TLS_GD_HA: case R_TILEPRO_IMM16_X1_TLS_GD_HA:
BFD_ASSERT (info->shared);
tls_type = GOT_TLS_GD; tls_type = GOT_TLS_GD;
goto have_got_reference; goto have_got_reference;
@ -1454,6 +1633,24 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
} }
break; break;
case R_TILEPRO_TLS_GD_CALL:
if (info->shared)
{
/* These are basically R_TILEPRO_JOFFLONG_X1_PLT relocs
against __tls_get_addr. */
struct bfd_link_hash_entry *bh = NULL;
if (! _bfd_generic_link_add_one_symbol (info, abfd,
"__tls_get_addr", 0,
bfd_und_section_ptr, 0,
NULL, FALSE, FALSE,
&bh))
return FALSE;
h = (struct elf_link_hash_entry *) bh;
}
else
break;
/* Fall through */
case R_TILEPRO_JOFFLONG_X1_PLT: case R_TILEPRO_JOFFLONG_X1_PLT:
/* This symbol requires a procedure linkage table entry. We /* This symbol requires a procedure linkage table entry. We
actually build the entry in adjust_dynamic_symbol, actually build the entry in adjust_dynamic_symbol,
@ -1523,16 +1720,15 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_TILEPRO_SHAMT_Y0: case R_TILEPRO_SHAMT_Y0:
case R_TILEPRO_SHAMT_Y1: case R_TILEPRO_SHAMT_Y1:
if (h != NULL) if (h != NULL)
{
h->non_got_ref = 1; h->non_got_ref = 1;
if (!info->shared) r_tilepro_plt32:
if (h != NULL && !info->shared)
{ {
/* We may need a .plt entry if the function this reloc /* We may need a .plt entry if the function this reloc
refers to is in a shared lib. */ refers to is in a shared lib. */
h->plt.refcount += 1; h->plt.refcount += 1;
} }
}
/* If we are creating a shared library, and this is a reloc /* If we are creating a shared library, and this is a reloc
against a global symbol, or a non PC relative reloc against a global symbol, or a non PC relative reloc
@ -1725,6 +1921,7 @@ tilepro_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
} }
r_type = ELF32_R_TYPE (rel->r_info); r_type = ELF32_R_TYPE (rel->r_info);
r_type = tilepro_elf_tls_transition (info, r_type, h != NULL);
switch (r_type) switch (r_type)
{ {
case R_TILEPRO_IMM16_X0_GOT: case R_TILEPRO_IMM16_X0_GOT:
@ -1758,7 +1955,8 @@ tilepro_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
} }
else else
{ {
if (local_got_refcounts[r_symndx] > 0) if (local_got_refcounts &&
local_got_refcounts[r_symndx] > 0)
local_got_refcounts[r_symndx]--; local_got_refcounts[r_symndx]--;
} }
break; break;
@ -2040,7 +2238,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
h->needs_plt = 0; h->needs_plt = 0;
} }
if (h->got.refcount > 0) /* If a TLS_IE symbol is now local to the binary, make it a TLS_LE
requiring no TLS entry. */
if (h->got.refcount > 0
&& !info->shared
&& h->dynindx == -1
&& tilepro_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
h->got.offset = (bfd_vma) -1;
else if (h->got.refcount > 0)
{ {
asection *s; asection *s;
bfd_boolean dyn; bfd_boolean dyn;
@ -2467,6 +2672,87 @@ tpoff (struct bfd_link_info *info, bfd_vma address)
return (address - htab->tls_sec->vma); return (address - htab->tls_sec->vma);
} }
/* Replace the MASK bits in ADDR with those in INSN, for the next
TILEPRO_BUNDLE_SIZE_IN_BYTES bytes. */
static void
tilepro_replace_insn (bfd_byte *addr, const bfd_byte *mask,
const bfd_byte *insn)
{
int i;
for (i = 0; i < TILEPRO_BUNDLE_SIZE_IN_BYTES; i++)
{
addr[i] = (addr[i] & ~mask[i]) | (insn[i] & mask[i]);
}
}
/* Mask to extract the bits corresponding to an instruction in a
specific pipe of a bundle. */
static const bfd_byte insn_mask_X1[] = {
0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f
};
/* Mask to extract the bits corresponding to an instruction in a
specific pipe of a bundle, minus the destination operand and the
first source operand. */
static const bfd_byte insn_mask_X0_no_dest_no_srca[] = {
0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00
};
static const bfd_byte insn_mask_X1_no_dest_no_srca[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x7f
};
static const bfd_byte insn_mask_Y0_no_dest_no_srca[] = {
0x00, 0xf0, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00
};
static const bfd_byte insn_mask_Y1_no_dest_no_srca[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x78
};
/* Mask to extract the first source operand of an instruction. */
static const bfd_byte srca_mask_X0[] = {
0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const bfd_byte srca_mask_X1[] = {
0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00
};
/* Various instructions synthesized to support tls references. */
/* move r0, r0 in the X1 pipe, used for tls le. */
static const bfd_byte insn_tls_le_move_X1[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x33, 0x08
};
/* move r0, zero in the X0 and X1 pipe, used for tls le. */
static const bfd_byte insn_tls_le_move_zero_X0X1[] = {
0xc0, 0xff, 0xcf, 0x00, 0xe0, 0xff, 0x33, 0x08
};
/* lw r0, r0 in the X1 pipe, used for tls ie. */
static const bfd_byte insn_tls_ie_lw_X1[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0b, 0x40
};
/* add r0, r0, tp in various pipes, used for tls ie. */
static const bfd_byte insn_tls_ie_add_X0X1[] = {
0x00, 0x50, 0x0f, 0x00, 0x00, 0xa8, 0x07, 0x08
};
static const bfd_byte insn_tls_ie_add_Y0Y1[] = {
0x00, 0x50, 0x03, 0x08, 0x00, 0xa8, 0x01, 0x8c
};
/* move r0, r0 in various pipes, used for tls gd. */
static const bfd_byte insn_tls_gd_add_X0X1[] = {
0x00, 0xf0, 0xcf, 0x00, 0x00, 0xf8, 0x33, 0x08
};
static const bfd_byte insn_tls_gd_add_Y0Y1[] = {
0x00, 0xf0, 0x0b, 0x18, 0x00, 0xf8, 0x05, 0x9c
};
/* Relocate an TILEPRO ELF section. /* Relocate an TILEPRO ELF section.
The RELOCATE_SECTION function is called by the new ELF backend linker The RELOCATE_SECTION function is called by the new ELF backend linker
@ -2531,6 +2817,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
for (; rel < relend; rel++) for (; rel < relend; rel++)
{ {
int r_type, tls_type; int r_type, tls_type;
bfd_boolean is_tls_iele, is_tls_le;
reloc_howto_type *howto; reloc_howto_type *howto;
unsigned long r_symndx; unsigned long r_symndx;
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
@ -2611,6 +2898,118 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
name = bfd_section_name (input_bfd, sec); name = bfd_section_name (input_bfd, sec);
} }
switch (r_type)
{
case R_TILEPRO_TLS_GD_CALL:
case R_TILEPRO_IMM8_X0_TLS_GD_ADD:
case R_TILEPRO_IMM8_Y0_TLS_GD_ADD:
case R_TILEPRO_IMM8_X1_TLS_GD_ADD:
case R_TILEPRO_IMM8_Y1_TLS_GD_ADD:
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
tls_type = GOT_UNKNOWN;
if (h == NULL && local_got_offsets)
tls_type =
_bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx];
else if (h != NULL)
tls_type = tilepro_elf_hash_entry(h)->tls_type;
is_tls_iele = (! info->shared || tls_type == GOT_TLS_IE);
is_tls_le = is_tls_iele && (!info->shared
&& (h == NULL || h->dynindx == -1));
if (r_type == R_TILEPRO_TLS_GD_CALL)
{
if (is_tls_le)
{
/* GD -> LE */
tilepro_replace_insn (contents + rel->r_offset,
insn_mask_X1, insn_tls_le_move_X1);
continue;
}
else if (is_tls_iele)
{
/* GD -> IE */
tilepro_replace_insn (contents + rel->r_offset,
insn_mask_X1, insn_tls_ie_lw_X1);
continue;
}
/* GD -> GD */
h = (struct elf_link_hash_entry *)
bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
FALSE, TRUE);
BFD_ASSERT (h != NULL);
r_type = R_TILEPRO_JOFFLONG_X1_PLT;
howto = tilepro_elf_howto_table + r_type;
}
else if (r_type == R_TILEPRO_IMM16_X0_TLS_GD_HA
|| r_type == R_TILEPRO_IMM16_X0_TLS_IE_HA)
{
if (is_tls_le)
tilepro_replace_insn (contents + rel->r_offset, srca_mask_X0,
insn_tls_le_move_zero_X0X1);
}
else if (r_type == R_TILEPRO_IMM16_X1_TLS_GD_HA
|| r_type == R_TILEPRO_IMM16_X1_TLS_IE_HA)
{
if (is_tls_le)
tilepro_replace_insn (contents + rel->r_offset, srca_mask_X1,
insn_tls_le_move_zero_X0X1);
}
else
{
const bfd_byte *mask = NULL;
const bfd_byte *add_insn = NULL;
switch (r_type)
{
case R_TILEPRO_IMM8_X0_TLS_GD_ADD:
add_insn = is_tls_iele ? insn_tls_ie_add_X0X1
: insn_tls_gd_add_X0X1;
mask = insn_mask_X0_no_dest_no_srca;
break;
case R_TILEPRO_IMM8_X1_TLS_GD_ADD:
add_insn = is_tls_iele ? insn_tls_ie_add_X0X1
: insn_tls_gd_add_X0X1;
mask = insn_mask_X1_no_dest_no_srca;
break;
case R_TILEPRO_IMM8_Y0_TLS_GD_ADD:
add_insn = is_tls_iele ? insn_tls_ie_add_Y0Y1
: insn_tls_gd_add_Y0Y1;
mask = insn_mask_Y0_no_dest_no_srca;
break;
case R_TILEPRO_IMM8_Y1_TLS_GD_ADD:
add_insn = is_tls_iele ? insn_tls_ie_add_Y0Y1
: insn_tls_gd_add_Y0Y1;
mask = insn_mask_Y1_no_dest_no_srca;
break;
}
tilepro_replace_insn (contents + rel->r_offset, mask, add_insn);
continue;
}
break;
case R_TILEPRO_TLS_IE_LOAD:
if (!info->shared && (h == NULL || h->dynindx == -1))
/* IE -> LE */
tilepro_replace_insn (contents + rel->r_offset,
insn_mask_X1_no_dest_no_srca,
insn_tls_le_move_X1);
else
/* IE -> IE */
tilepro_replace_insn (contents + rel->r_offset,
insn_mask_X1_no_dest_no_srca,
insn_tls_ie_lw_X1);
continue;
break;
default:
break;
}
switch (r_type) switch (r_type)
{ {
case R_TILEPRO_IMM16_X0_GOT: case R_TILEPRO_IMM16_X0_GOT:
@ -2908,6 +3307,45 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
} }
break; break;
case R_TILEPRO_IMM16_X0_TLS_LE:
case R_TILEPRO_IMM16_X1_TLS_LE:
case R_TILEPRO_IMM16_X0_TLS_LE_LO:
case R_TILEPRO_IMM16_X1_TLS_LE_LO:
case R_TILEPRO_IMM16_X0_TLS_LE_HI:
case R_TILEPRO_IMM16_X1_TLS_LE_HI:
case R_TILEPRO_IMM16_X0_TLS_LE_HA:
case R_TILEPRO_IMM16_X1_TLS_LE_HA:
if (info->shared)
{
Elf_Internal_Rela outrel;
bfd_boolean skip;
BFD_ASSERT (sreloc != NULL);
skip = FALSE;
outrel.r_offset =
_bfd_elf_section_offset (output_bfd, info, input_section,
rel->r_offset);
if (outrel.r_offset == (bfd_vma) -1)
skip = TRUE;
else if (outrel.r_offset == (bfd_vma) -2)
skip = TRUE;
outrel.r_offset += (input_section->output_section->vma
+ input_section->output_offset);
if (skip)
memset (&outrel, 0, sizeof outrel);
else
{
outrel.r_info = ELF32_R_INFO (0, r_type);
outrel.r_addend = relocation - dtpoff_base (info)
+ rel->r_addend;
}
tilepro_elf_append_rela_32 (output_bfd, sreloc, &outrel);
continue;
}
relocation = tpoff (info, relocation);
break;
case R_TILEPRO_IMM16_X0_TLS_GD: case R_TILEPRO_IMM16_X0_TLS_GD:
case R_TILEPRO_IMM16_X1_TLS_GD: case R_TILEPRO_IMM16_X1_TLS_GD:
case R_TILEPRO_IMM16_X0_TLS_GD_LO: case R_TILEPRO_IMM16_X0_TLS_GD_LO:
@ -2916,9 +3354,6 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
case R_TILEPRO_IMM16_X1_TLS_GD_HI: case R_TILEPRO_IMM16_X1_TLS_GD_HI:
case R_TILEPRO_IMM16_X0_TLS_GD_HA: case R_TILEPRO_IMM16_X0_TLS_GD_HA:
case R_TILEPRO_IMM16_X1_TLS_GD_HA: case R_TILEPRO_IMM16_X1_TLS_GD_HA:
tls_type = GOT_TLS_GD;
goto have_tls_reference;
case R_TILEPRO_IMM16_X0_TLS_IE: case R_TILEPRO_IMM16_X0_TLS_IE:
case R_TILEPRO_IMM16_X1_TLS_IE: case R_TILEPRO_IMM16_X1_TLS_IE:
case R_TILEPRO_IMM16_X0_TLS_IE_LO: case R_TILEPRO_IMM16_X0_TLS_IE_LO:
@ -2927,43 +3362,30 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
case R_TILEPRO_IMM16_X1_TLS_IE_HI: case R_TILEPRO_IMM16_X1_TLS_IE_HI:
case R_TILEPRO_IMM16_X0_TLS_IE_HA: case R_TILEPRO_IMM16_X0_TLS_IE_HA:
case R_TILEPRO_IMM16_X1_TLS_IE_HA: case R_TILEPRO_IMM16_X1_TLS_IE_HA:
tls_type = GOT_TLS_IE; r_type = tilepro_elf_tls_transition (info, r_type, h == NULL);
/* Fall through. */ tls_type = GOT_UNKNOWN;
have_tls_reference:
if (h == NULL && local_got_offsets) if (h == NULL && local_got_offsets)
tls_type tls_type
= _bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx]; = _bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx];
else if (h != NULL) else if (h != NULL)
{ {
tls_type = tilepro_elf_hash_entry(h)->tls_type; tls_type = tilepro_elf_hash_entry(h)->tls_type;
if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
r_type = tilepro_tls_translate_to_le (r_type);
} }
if (tls_type == GOT_TLS_IE) if (tls_type == GOT_TLS_IE)
switch (r_type) r_type = tilepro_tls_translate_to_ie (r_type);
if (r_type == R_TILEPRO_IMM16_X0_TLS_LE
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE
|| r_type == R_TILEPRO_IMM16_X0_TLS_LE_LO
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE_LO
|| r_type == R_TILEPRO_IMM16_X0_TLS_LE_HI
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE_HI
|| r_type == R_TILEPRO_IMM16_X0_TLS_LE_HA
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE_HA)
{ {
case R_TILEPRO_IMM16_X0_TLS_GD: relocation = tpoff (info, relocation);
r_type = R_TILEPRO_IMM16_X0_TLS_IE;
break;
case R_TILEPRO_IMM16_X1_TLS_GD:
r_type = R_TILEPRO_IMM16_X1_TLS_IE;
break;
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
r_type = R_TILEPRO_IMM16_X0_TLS_IE_LO;
break;
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
r_type = R_TILEPRO_IMM16_X1_TLS_IE_LO;
break;
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
r_type = R_TILEPRO_IMM16_X0_TLS_IE_HI;
break;
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
r_type = R_TILEPRO_IMM16_X1_TLS_IE_HI;
break;
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
r_type = R_TILEPRO_IMM16_X0_TLS_IE_HA;
break;
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
r_type = R_TILEPRO_IMM16_X1_TLS_IE_HA;
break; break;
} }

File diff suppressed because it is too large Load Diff

View File

@ -2406,6 +2406,12 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_TILEPRO_SHAMT_X1", "BFD_RELOC_TILEPRO_SHAMT_X1",
"BFD_RELOC_TILEPRO_SHAMT_Y0", "BFD_RELOC_TILEPRO_SHAMT_Y0",
"BFD_RELOC_TILEPRO_SHAMT_Y1", "BFD_RELOC_TILEPRO_SHAMT_Y1",
"BFD_RELOC_TILEPRO_TLS_GD_CALL",
"BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD",
"BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD",
"BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD",
"BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD",
"BFD_RELOC_TILEPRO_TLS_IE_LOAD",
"BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD", "BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD",
"BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD", "BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD",
"BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO", "BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO",
@ -2425,6 +2431,14 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_TILEPRO_TLS_DTPMOD32", "BFD_RELOC_TILEPRO_TLS_DTPMOD32",
"BFD_RELOC_TILEPRO_TLS_DTPOFF32", "BFD_RELOC_TILEPRO_TLS_DTPOFF32",
"BFD_RELOC_TILEPRO_TLS_TPOFF32", "BFD_RELOC_TILEPRO_TLS_TPOFF32",
"BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE",
"BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE",
"BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO",
"BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO",
"BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI",
"BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI",
"BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA",
"BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA",
"BFD_RELOC_TILEGX_HW0", "BFD_RELOC_TILEGX_HW0",
"BFD_RELOC_TILEGX_HW1", "BFD_RELOC_TILEGX_HW1",
"BFD_RELOC_TILEGX_HW2", "BFD_RELOC_TILEGX_HW2",
@ -2482,52 +2496,44 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL", "BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL",
"BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT", "BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT",
"BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT", "BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT",
"BFD_RELOC_TILEGX_IMM16_X0_HW1_GOT",
"BFD_RELOC_TILEGX_IMM16_X1_HW1_GOT",
"BFD_RELOC_TILEGX_IMM16_X0_HW2_GOT",
"BFD_RELOC_TILEGX_IMM16_X1_HW2_GOT",
"BFD_RELOC_TILEGX_IMM16_X0_HW3_GOT",
"BFD_RELOC_TILEGX_IMM16_X1_HW3_GOT",
"BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT", "BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT",
"BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT", "BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_GOT",
"BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT", "BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT",
"BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT", "BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT",
"BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_GOT",
"BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_GOT",
"BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE",
"BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE",
"BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE",
"BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE",
"BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE",
"BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE",
"BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD", "BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_GD",
"BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE", "BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE", "BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE", "BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE", "BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE", "BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE", "BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_IE",
"BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_IE",
"BFD_RELOC_TILEGX_TLS_DTPMOD64", "BFD_RELOC_TILEGX_TLS_DTPMOD64",
"BFD_RELOC_TILEGX_TLS_DTPOFF64", "BFD_RELOC_TILEGX_TLS_DTPOFF64",
"BFD_RELOC_TILEGX_TLS_TPOFF64", "BFD_RELOC_TILEGX_TLS_TPOFF64",
"BFD_RELOC_TILEGX_TLS_DTPMOD32", "BFD_RELOC_TILEGX_TLS_DTPMOD32",
"BFD_RELOC_TILEGX_TLS_DTPOFF32", "BFD_RELOC_TILEGX_TLS_DTPOFF32",
"BFD_RELOC_TILEGX_TLS_TPOFF32", "BFD_RELOC_TILEGX_TLS_TPOFF32",
"BFD_RELOC_TILEGX_TLS_GD_CALL",
"BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD",
"BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD",
"BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD",
"BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD",
"BFD_RELOC_TILEGX_TLS_IE_LOAD",
"BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD",
"BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD",
"BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD",
"BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD",
"BFD_RELOC_EPIPHANY_SIMM8", "BFD_RELOC_EPIPHANY_SIMM8",
"BFD_RELOC_EPIPHANY_SIMM24", "BFD_RELOC_EPIPHANY_SIMM24",
"BFD_RELOC_EPIPHANY_HIGH", "BFD_RELOC_EPIPHANY_HIGH",

View File

@ -5798,6 +5798,18 @@ ENUMX
BFD_RELOC_TILEPRO_SHAMT_Y0 BFD_RELOC_TILEPRO_SHAMT_Y0
ENUMX ENUMX
BFD_RELOC_TILEPRO_SHAMT_Y1 BFD_RELOC_TILEPRO_SHAMT_Y1
ENUMX
BFD_RELOC_TILEPRO_TLS_GD_CALL
ENUMX
BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEPRO_TLS_IE_LOAD
ENUMX ENUMX
BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD
ENUMX ENUMX
@ -5836,6 +5848,22 @@ ENUMX
BFD_RELOC_TILEPRO_TLS_DTPOFF32 BFD_RELOC_TILEPRO_TLS_DTPOFF32
ENUMX ENUMX
BFD_RELOC_TILEPRO_TLS_TPOFF32 BFD_RELOC_TILEPRO_TLS_TPOFF32
ENUMX
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE
ENUMX
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE
ENUMX
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO
ENUMX
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO
ENUMX
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI
ENUMX
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI
ENUMX
BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA
ENUMX
BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA
ENUMDOC ENUMDOC
Tilera TILEPro Relocations. Tilera TILEPro Relocations.
@ -5953,18 +5981,6 @@ ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT BFD_RELOC_TILEGX_IMM16_X0_HW0_GOT
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT BFD_RELOC_TILEGX_IMM16_X1_HW0_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW1_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW1_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW2_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW2_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW3_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW3_GOT
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_GOT
ENUMX ENUMX
@ -5973,26 +5989,22 @@ ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_GOT
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_GOT
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_GOT
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_GD BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_GD BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_GD BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_GD BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_GD BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_GD BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD
ENUMX ENUMX
@ -6001,26 +6013,10 @@ ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_GD
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_GD
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_IE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE
ENUMX ENUMX
@ -6029,10 +6025,6 @@ ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE
ENUMX ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_IE
ENUMX
BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_IE
ENUMX ENUMX
BFD_RELOC_TILEGX_TLS_DTPMOD64 BFD_RELOC_TILEGX_TLS_DTPMOD64
ENUMX ENUMX
@ -6045,6 +6037,26 @@ ENUMX
BFD_RELOC_TILEGX_TLS_DTPOFF32 BFD_RELOC_TILEGX_TLS_DTPOFF32
ENUMX ENUMX
BFD_RELOC_TILEGX_TLS_TPOFF32 BFD_RELOC_TILEGX_TLS_TPOFF32
ENUMX
BFD_RELOC_TILEGX_TLS_GD_CALL
ENUMX
BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD
ENUMX
BFD_RELOC_TILEGX_TLS_IE_LOAD
ENUMX
BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD
ENUMX
BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD
ENUMX
BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD
ENUMX
BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD
ENUMDOC ENUMDOC
Tilera TILE-Gx Relocations. Tilera TILE-Gx Relocations.

View File

@ -1,3 +1,40 @@
2012-02-25 Walter Lee <walt@tilera.com>
* tc-tilepro.c (O_tls_le): Define operator.
(O_tls_le_lo16): Ditto.
(O_tls_le_hi16): Ditto.
(O_tls_le_ha16): Ditto.
(O_tls_gd_call): Ditto.
(O_tls_gd_add): Ditto.
(O_tls_ie_load): Ditto.
(md_begin): Delete old operators; handle new operators.
(emit_tilepro_instruction): Ditto.
(md_apply_fix): Ditto.
* tc-tilegx.c (O_hw1_got): Delete operator.
(O_hw2_got): Ditto.
(O_hw3_got): Ditto.
(O_hw2_last_got): Ditto.
(O_hw1_tls_gd): Ditto.
(O_hw2_tls_gd): Ditto.
(O_hw3_tls_gd): Ditto.
(O_hw2_last_tls_gd): Ditto.
(O_hw1_tls_ie): Ditto.
(O_hw2_tls_ie): Ditto.
(O_hw3_tls_ie): Ditto.
(O_hw2_last_tls_ie): Ditto.
(O_hw0_tls_le): Define operator.
(O_hw0_last_tls_le): Ditto.
(O_hw1_last_tls_le): Ditto.
(O_tls_gd_call): Ditto.
(O_tls_gd_add): Ditto.
(O_tls_ie_load): Ditto.
(O_tls_add): Ditto.
(md_begin): Delete old operators; handle new operators.
(emit_tilegx_instruction): Ditto.
(md_apply_fix): Ditto.
* doc/c-tilegx.texi: Delete old operators; document new operators.
* doc/c-tilepro.texi: Ditto.
2012-02-25 Walter Lee <walt@tilera.com> 2012-02-25 Walter Lee <walt@tilera.com>
* tc-tilepro.c (apply_special_operator): delete cases for * tc-tilepro.c (apply_special_operator): delete cases for

View File

@ -157,27 +157,22 @@ md_show_usage (FILE *stream)
#define O_hw1_last O_md6 #define O_hw1_last O_md6
#define O_hw2_last O_md7 #define O_hw2_last O_md7
#define O_hw0_got O_md8 #define O_hw0_got O_md8
#define O_hw1_got O_md9 #define O_hw0_last_got O_md9
#define O_hw2_got O_md10 #define O_hw1_last_got O_md10
#define O_hw3_got O_md11 #define O_plt O_md11
#define O_hw0_last_got O_md12 #define O_hw0_tls_gd O_md12
#define O_hw1_last_got O_md13 #define O_hw0_last_tls_gd O_md13
#define O_hw2_last_got O_md14 #define O_hw1_last_tls_gd O_md14
#define O_plt O_md15 #define O_hw0_tls_ie O_md15
#define O_hw0_tls_gd O_md16 #define O_hw0_last_tls_ie O_md16
#define O_hw1_tls_gd O_md17 #define O_hw1_last_tls_ie O_md17
#define O_hw2_tls_gd O_md18 #define O_hw0_tls_le O_md18
#define O_hw3_tls_gd O_md19 #define O_hw0_last_tls_le O_md19
#define O_hw0_last_tls_gd O_md20 #define O_hw1_last_tls_le O_md20
#define O_hw1_last_tls_gd O_md21 #define O_tls_gd_call O_md21
#define O_hw2_last_tls_gd O_md22 #define O_tls_gd_add O_md22
#define O_hw0_tls_ie O_md23 #define O_tls_ie_load O_md23
#define O_hw1_tls_ie O_md24 #define O_tls_add O_md24
#define O_hw2_tls_ie O_md25
#define O_hw3_tls_ie O_md26
#define O_hw0_last_tls_ie O_md27
#define O_hw1_last_tls_ie O_md28
#define O_hw2_last_tls_ie O_md29
static struct hash_control *special_operator_hash; static struct hash_control *special_operator_hash;
@ -289,27 +284,22 @@ md_begin (void)
/* hw3_last is a convenience alias for the equivalent hw3. */ /* hw3_last is a convenience alias for the equivalent hw3. */
hash_insert (special_operator_hash, "hw3_last", (void*)O_hw3); hash_insert (special_operator_hash, "hw3_last", (void*)O_hw3);
INSERT_SPECIAL_OP (hw0_got); INSERT_SPECIAL_OP (hw0_got);
INSERT_SPECIAL_OP (hw1_got);
INSERT_SPECIAL_OP (hw2_got);
INSERT_SPECIAL_OP (hw3_got);
INSERT_SPECIAL_OP (hw0_last_got); INSERT_SPECIAL_OP (hw0_last_got);
INSERT_SPECIAL_OP (hw1_last_got); INSERT_SPECIAL_OP (hw1_last_got);
INSERT_SPECIAL_OP (hw2_last_got);
INSERT_SPECIAL_OP(plt); INSERT_SPECIAL_OP(plt);
INSERT_SPECIAL_OP (hw0_tls_gd); INSERT_SPECIAL_OP (hw0_tls_gd);
INSERT_SPECIAL_OP (hw1_tls_gd);
INSERT_SPECIAL_OP (hw2_tls_gd);
INSERT_SPECIAL_OP (hw3_tls_gd);
INSERT_SPECIAL_OP (hw0_last_tls_gd); INSERT_SPECIAL_OP (hw0_last_tls_gd);
INSERT_SPECIAL_OP (hw1_last_tls_gd); INSERT_SPECIAL_OP (hw1_last_tls_gd);
INSERT_SPECIAL_OP (hw2_last_tls_gd);
INSERT_SPECIAL_OP (hw0_tls_ie); INSERT_SPECIAL_OP (hw0_tls_ie);
INSERT_SPECIAL_OP (hw1_tls_ie);
INSERT_SPECIAL_OP (hw2_tls_ie);
INSERT_SPECIAL_OP (hw3_tls_ie);
INSERT_SPECIAL_OP (hw0_last_tls_ie); INSERT_SPECIAL_OP (hw0_last_tls_ie);
INSERT_SPECIAL_OP (hw1_last_tls_ie); INSERT_SPECIAL_OP (hw1_last_tls_ie);
INSERT_SPECIAL_OP (hw2_last_tls_ie); INSERT_SPECIAL_OP (hw0_tls_le);
INSERT_SPECIAL_OP (hw0_last_tls_le);
INSERT_SPECIAL_OP (hw1_last_tls_le);
INSERT_SPECIAL_OP (tls_gd_call);
INSERT_SPECIAL_OP (tls_gd_add);
INSERT_SPECIAL_OP (tls_ie_load);
INSERT_SPECIAL_OP (tls_add);
#undef INSERT_SPECIAL_OP #undef INSERT_SPECIAL_OP
/* Initialize op_hash hash table. */ /* Initialize op_hash hash table. */
@ -566,21 +556,6 @@ emit_tilegx_instruction (tilegx_bundle_bits bits,
require_symbol = 1; require_symbol = 1;
break; break;
case O_hw1_got:
HANDLE_OP16 (HW1_GOT);
require_symbol = 1;
break;
case O_hw2_got:
HANDLE_OP16 (HW2_GOT);
require_symbol = 1;
break;
case O_hw3_got:
HANDLE_OP16 (HW3_GOT);
require_symbol = 1;
break;
case O_hw0_last_got: case O_hw0_last_got:
HANDLE_OP16 (HW0_LAST_GOT); HANDLE_OP16 (HW0_LAST_GOT);
require_symbol = 1; require_symbol = 1;
@ -591,31 +566,11 @@ emit_tilegx_instruction (tilegx_bundle_bits bits,
require_symbol = 1; require_symbol = 1;
break; break;
case O_hw2_last_got:
HANDLE_OP16 (HW2_LAST_GOT);
require_symbol = 1;
break;
case O_hw0_tls_gd: case O_hw0_tls_gd:
HANDLE_OP16 (HW0_TLS_GD); HANDLE_OP16 (HW0_TLS_GD);
require_symbol = 1; require_symbol = 1;
break; break;
case O_hw1_tls_gd:
HANDLE_OP16 (HW1_TLS_GD);
require_symbol = 1;
break;
case O_hw2_tls_gd:
HANDLE_OP16 (HW2_TLS_GD);
require_symbol = 1;
break;
case O_hw3_tls_gd:
HANDLE_OP16 (HW3_TLS_GD);
require_symbol = 1;
break;
case O_hw0_last_tls_gd: case O_hw0_last_tls_gd:
HANDLE_OP16 (HW0_LAST_TLS_GD); HANDLE_OP16 (HW0_LAST_TLS_GD);
require_symbol = 1; require_symbol = 1;
@ -626,31 +581,11 @@ emit_tilegx_instruction (tilegx_bundle_bits bits,
require_symbol = 1; require_symbol = 1;
break; break;
case O_hw2_last_tls_gd:
HANDLE_OP16 (HW2_LAST_TLS_GD);
require_symbol = 1;
break;
case O_hw0_tls_ie: case O_hw0_tls_ie:
HANDLE_OP16 (HW0_TLS_IE); HANDLE_OP16 (HW0_TLS_IE);
require_symbol = 1; require_symbol = 1;
break; break;
case O_hw1_tls_ie:
HANDLE_OP16 (HW1_TLS_IE);
require_symbol = 1;
break;
case O_hw2_tls_ie:
HANDLE_OP16 (HW2_TLS_IE);
require_symbol = 1;
break;
case O_hw3_tls_ie:
HANDLE_OP16 (HW3_TLS_IE);
require_symbol = 1;
break;
case O_hw0_last_tls_ie: case O_hw0_last_tls_ie:
HANDLE_OP16 (HW0_LAST_TLS_IE); HANDLE_OP16 (HW0_LAST_TLS_IE);
require_symbol = 1; require_symbol = 1;
@ -661,8 +596,18 @@ emit_tilegx_instruction (tilegx_bundle_bits bits,
require_symbol = 1; require_symbol = 1;
break; break;
case O_hw2_last_tls_ie: case O_hw0_tls_le:
HANDLE_OP16 (HW2_LAST_TLS_IE); HANDLE_OP16 (HW0_TLS_LE);
require_symbol = 1;
break;
case O_hw0_last_tls_le:
HANDLE_OP16 (HW0_LAST_TLS_LE);
require_symbol = 1;
break;
case O_hw1_last_tls_le:
HANDLE_OP16 (HW1_LAST_TLS_LE);
require_symbol = 1; require_symbol = 1;
break; break;
@ -682,6 +627,80 @@ emit_tilegx_instruction (tilegx_bundle_bits bits,
require_symbol = 1; require_symbol = 1;
break; break;
case O_tls_gd_call:
switch (reloc)
{
case BFD_RELOC_TILEGX_JUMPOFF_X1:
reloc = BFD_RELOC_TILEGX_TLS_GD_CALL;
break;
default:
die = 1;
break;
}
use_subexp = 1;
require_symbol = 1;
break;
case O_tls_gd_add:
switch (reloc)
{
case BFD_RELOC_TILEGX_IMM8_X0:
reloc = BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD;
break;
case BFD_RELOC_TILEGX_IMM8_X1:
reloc = BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD;
break;
case BFD_RELOC_TILEGX_IMM8_Y0:
reloc = BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD;
break;
case BFD_RELOC_TILEGX_IMM8_Y1:
reloc = BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD;
break;
default:
die = 1;
break;
}
use_subexp = 1;
require_symbol = 1;
break;
case O_tls_ie_load:
switch (reloc)
{
case BFD_RELOC_TILEGX_IMM8_X1:
reloc = BFD_RELOC_TILEGX_TLS_IE_LOAD;
break;
default:
die = 1;
break;
}
use_subexp = 1;
require_symbol = 1;
break;
case O_tls_add:
switch (reloc)
{
case BFD_RELOC_TILEGX_IMM8_X0:
reloc = BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD;
break;
case BFD_RELOC_TILEGX_IMM8_X1:
reloc = BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD;
break;
case BFD_RELOC_TILEGX_IMM8_Y0:
reloc = BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD;
break;
case BFD_RELOC_TILEGX_IMM8_Y1:
reloc = BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD;
break;
default:
die = 1;
break;
}
use_subexp = 1;
require_symbol = 1;
break;
default: default:
/* Do nothing. */ /* Do nothing. */
break; break;
@ -1486,34 +1505,34 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
#ifdef OBJ_ELF #ifdef OBJ_ELF
switch (fixP->fx_r_type) switch (fixP->fx_r_type)
{ {
case BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD:
case BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD:
case BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD:
case BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD:
case BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD:
case BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD:
case BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD:
case BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD:
case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X0_HW1_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X1_HW1_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE: case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE: case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE:
case BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE:
case BFD_RELOC_TILEGX_IMM16_X0_HW2_TLS_IE: case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
case BFD_RELOC_TILEGX_IMM16_X1_HW2_TLS_IE: case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_GD: case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_TLS_IE: case BFD_RELOC_TILEGX_TLS_GD_CALL:
case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_TLS_IE: case BFD_RELOC_TILEGX_TLS_IE_LOAD:
case BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_GD:
case BFD_RELOC_TILEGX_IMM16_X0_HW3_TLS_IE:
case BFD_RELOC_TILEGX_IMM16_X1_HW3_TLS_IE:
case BFD_RELOC_TILEGX_TLS_DTPMOD64: case BFD_RELOC_TILEGX_TLS_DTPMOD64:
case BFD_RELOC_TILEGX_TLS_DTPOFF64: case BFD_RELOC_TILEGX_TLS_DTPOFF64:
case BFD_RELOC_TILEGX_TLS_TPOFF64: case BFD_RELOC_TILEGX_TLS_TPOFF64:

View File

@ -119,6 +119,13 @@ md_show_usage (FILE *stream)
#define O_tls_ie_lo16 O_md14 #define O_tls_ie_lo16 O_md14
#define O_tls_ie_hi16 O_md15 #define O_tls_ie_hi16 O_md15
#define O_tls_ie_ha16 O_md16 #define O_tls_ie_ha16 O_md16
#define O_tls_le O_md17
#define O_tls_le_lo16 O_md18
#define O_tls_le_hi16 O_md19
#define O_tls_le_ha16 O_md20
#define O_tls_gd_call O_md21
#define O_tls_gd_add O_md22
#define O_tls_ie_load O_md23
static struct hash_control *special_operator_hash; static struct hash_control *special_operator_hash;
@ -230,6 +237,13 @@ md_begin (void)
INSERT_SPECIAL_OP(tls_ie_lo16); INSERT_SPECIAL_OP(tls_ie_lo16);
INSERT_SPECIAL_OP(tls_ie_hi16); INSERT_SPECIAL_OP(tls_ie_hi16);
INSERT_SPECIAL_OP(tls_ie_ha16); INSERT_SPECIAL_OP(tls_ie_ha16);
INSERT_SPECIAL_OP(tls_le);
INSERT_SPECIAL_OP(tls_le_lo16);
INSERT_SPECIAL_OP(tls_le_hi16);
INSERT_SPECIAL_OP(tls_le_ha16);
INSERT_SPECIAL_OP(tls_gd_call);
INSERT_SPECIAL_OP(tls_gd_add);
INSERT_SPECIAL_OP(tls_ie_load);
#undef INSERT_SPECIAL_OP #undef INSERT_SPECIAL_OP
/* Initialize op_hash hash table. */ /* Initialize op_hash hash table. */
@ -516,6 +530,26 @@ emit_tilepro_instruction (tilepro_bundle_bits bits,
require_symbol = 1; require_symbol = 1;
break; break;
case O_tls_le:
HANDLE_OP16 (TLS_LE);
require_symbol = 1;
break;
case O_tls_le_lo16:
HANDLE_OP16 (TLS_LE_LO);
require_symbol = 1;
break;
case O_tls_le_hi16:
HANDLE_OP16 (TLS_LE_HI);
require_symbol = 1;
break;
case O_tls_le_ha16:
HANDLE_OP16 (TLS_LE_HA);
require_symbol = 1;
break;
#undef HANDLE_OP16 #undef HANDLE_OP16
case O_plt: case O_plt:
@ -532,6 +566,57 @@ emit_tilepro_instruction (tilepro_bundle_bits bits,
require_symbol = 1; require_symbol = 1;
break; break;
case O_tls_gd_call:
switch (reloc)
{
case BFD_RELOC_TILEPRO_JOFFLONG_X1:
reloc = BFD_RELOC_TILEPRO_TLS_GD_CALL;
break;
default:
die = 1;
break;
}
use_subexp = 1;
require_symbol = 1;
break;
case O_tls_gd_add:
switch (reloc)
{
case BFD_RELOC_TILEPRO_IMM8_X0:
reloc = BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD;
break;
case BFD_RELOC_TILEPRO_IMM8_X1:
reloc = BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD;
break;
case BFD_RELOC_TILEPRO_IMM8_Y0:
reloc = BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD;
break;
case BFD_RELOC_TILEPRO_IMM8_Y1:
reloc = BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD;
break;
default:
die = 1;
break;
}
use_subexp = 1;
require_symbol = 1;
break;
case O_tls_ie_load:
switch (reloc)
{
case BFD_RELOC_TILEPRO_IMM8_X1:
reloc = BFD_RELOC_TILEPRO_TLS_IE_LOAD;
break;
default:
die = 1;
break;
}
use_subexp = 1;
require_symbol = 1;
break;
default: default:
/* Do nothing. */ /* Do nothing. */
break; break;
@ -1298,22 +1383,36 @@ md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
#ifdef OBJ_ELF #ifdef OBJ_ELF
switch (fixP->fx_r_type) switch (fixP->fx_r_type)
{ {
case BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD:
case BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD:
case BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD:
case BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA: case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA: case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI:
case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA:
case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA:
case BFD_RELOC_TILEPRO_TLS_GD_CALL:
case BFD_RELOC_TILEPRO_TLS_IE_LOAD:
case BFD_RELOC_TILEPRO_TLS_DTPMOD32: case BFD_RELOC_TILEPRO_TLS_DTPMOD32:
case BFD_RELOC_TILEPRO_TLS_DTPOFF32: case BFD_RELOC_TILEPRO_TLS_DTPOFF32:
case BFD_RELOC_TILEPRO_TLS_TPOFF32: case BFD_RELOC_TILEPRO_TLS_TPOFF32:

View File

@ -218,21 +218,6 @@ shl16insli r0, r0, hw0(sym)
This modifier is used to load bits 0-15 of the symbol's offset in the This modifier is used to load bits 0-15 of the symbol's offset in the
GOT entry corresponding to the symbol. GOT entry corresponding to the symbol.
@item hw1_got
This modifier is used to load bits 16-31 of the symbol's offset in the
GOT entry corresponding to the symbol.
@item hw2_got
This modifier is used to load bits 32-47 of the symbol's offset in the
GOT entry corresponding to the symbol.
@item hw3_got
This modifier is used to load bits 48-63 of the symbol's offset in the
GOT entry corresponding to the symbol.
@item hw0_last_got @item hw0_last_got
This modifier yields the same value as @code{hw0_got}, but it also This modifier yields the same value as @code{hw0_got}, but it also
@ -240,13 +225,9 @@ checks that the value does not overflow.
@item hw1_last_got @item hw1_last_got
This modifier yields the same value as @code{hw1_got}, but it also This modifier is used to load bits 16-31 of the symbol's offset in the
checks that the value does not overflow. GOT entry corresponding to the symbol, and it also checks that the
value does not overflow.
@item hw2_last_got
This modifier yields the same value as @code{hw2_got}, but it also
checks that the value does not overflow.
@item plt @item plt
@ -267,24 +248,6 @@ This modifier is used to load bits 0-15 of the offset of the GOT entry
of the symbol's TLS descriptor, to be used for general-dynamic TLS of the symbol's TLS descriptor, to be used for general-dynamic TLS
accesses. accesses.
@item hw1_tls_gd
This modifier is used to load bits 16-31 of the offset of the GOT
entry of the symbol's TLS descriptor, to be used for general-dynamic
TLS accesses.
@item hw2_tls_gd
This modifier is used to load bits 32-47 of the offset of the GOT
entry of the symbol's TLS descriptor, to be used for general-dynamic
TLS accesses.
@item hw3_tls_gd
This modifier is used to load bits 48-63 of the offset of the GOT
entry of the symbol's TLS descriptor, to be used for general-dynamic
TLS accesses.
@item hw0_last_tls_gd @item hw0_last_tls_gd
This modifier yields the same value as @code{hw0_tls_gd}, but it also This modifier yields the same value as @code{hw0_tls_gd}, but it also
@ -292,13 +255,9 @@ checks that the value does not overflow.
@item hw1_last_tls_gd @item hw1_last_tls_gd
This modifier yields the same value as @code{hw1_tls_gd}, but it also This modifier is used to load bits 16-31 of the offset of the GOT
checks that the value does not overflow. entry of the symbol's TLS descriptor, to be used for general-dynamic
TLS accesses. It also checks that the value does not overflow.
@item hw2_last_tls_gd
This modifier yields the same value as @code{hw2_tls_gd}, but it also
checks that the value does not overflow.
@item hw0_tls_ie @item hw0_tls_ie
@ -306,24 +265,6 @@ This modifier is used to load bits 0-15 of the offset of the GOT entry
containing the offset of the symbol's address from the TCB, to be used containing the offset of the symbol's address from the TCB, to be used
for initial-exec TLS accesses. for initial-exec TLS accesses.
@item hw1_tls_ie
This modifier is used to load bits 16-31 of the offset of the GOT
entry containing the offset of the symbol's address from the TCB, to
be used for initial-exec TLS accesses.
@item hw2_tls_ie
This modifier is used to load bits 32-47 of the offset of the GOT entry
containing the offset of the symbol's address from the TCB, to be used
for initial-exec TLS accesses.
@item hw3_tls_ie
This modifier is used to load bits 48-63 of the offset of the GOT
entry containing the offset of the symbol's address from the TCB, to
be used for initial-exec TLS accesses.
@item hw0_last_tls_ie @item hw0_last_tls_ie
This modifier yields the same value as @code{hw0_tls_ie}, but it also This modifier yields the same value as @code{hw0_tls_ie}, but it also
@ -331,13 +272,41 @@ checks that the value does not overflow.
@item hw1_last_tls_ie @item hw1_last_tls_ie
This modifier yields the same value as @code{hw1_tls_ie}, but it also This modifier is used to load bits 16-31 of the offset of the GOT
entry containing the offset of the symbol's address from the TCB, to
be used for initial-exec TLS accesses. It also checks that the value
does not overflow.
@item hw0_tls_le
This modifier is used to load bits 0-15 of the offset of the symbol's
address from the TCB, to be used for local-exec TLS accesses.
@item hw0_last_tls_le
This modifier yields the same value as @code{hw0_tls_le}, but it also
checks that the value does not overflow. checks that the value does not overflow.
@item hw2_last_tls_ie @item hw1_last_tls_le
This modifier yields the same value as @code{hw2_tls_ie}, but it also This modifier is used to load bits 16-31 of the offset of the symbol's
checks that the value does not overflow. address from the TCB, to be used for local-exec TLS accesses. It
also checks that the value does not overflow.
@item tls_gd_call
This modifier is used to tag an instrution as the ``call'' part of a
calling sequence for a TLS GD reference of its operand.
@item tls_gd_add
This modifier is used to tag an instruction as the ``add'' part of a
calling sequence for a TLS GD reference of its operand.
@item tls_ie_load
This modifier is used to tag an instruction as the ``load'' part of a
calling sequence for a TLS IE reference of its operand.
@end table @end table

View File

@ -261,6 +261,41 @@ to be used for initial-exec TLS accesses.
This modifier is like @code{tls_ie_hi16}, but it adds one to the value This modifier is like @code{tls_ie_hi16}, but it adds one to the value
if @code{tls_ie_lo16} of the input value is negative. if @code{tls_ie_lo16} of the input value is negative.
@item tls_le
This modifier is used to load the offset of the symbol's address from
the TCB, to be used for local-exec TLS accesses.
@item tls_le_lo16
This modifier is used to load the low 16 bits of the offset of the
symbol's address from the TCB, to be used for local-exec TLS accesses.
@item tls_le_hi16
This modifier is used to load the high 16 bits of the offset of the
symbol's address from the TCB, to be used for local-exec TLS accesses.
@item tls_le_ha16
This modifier is like @code{tls_le_hi16}, but it adds one to the value
if @code{tls_le_lo16} of the input value is negative.
@item tls_gd_call
This modifier is used to tag an instrution as the ``call'' part of a
calling sequence for a TLS GD reference of its operand.
@item tls_gd_add
This modifier is used to tag an instruction as the ``add'' part of a
calling sequence for a TLS GD reference of its operand.
@item tls_ie_load
This modifier is used to tag an instruction as the ``load'' part of a
calling sequence for a TLS IE reference of its operand.
@end table @end table
@node TILEPro Directives @node TILEPro Directives

View File

@ -1,3 +1,60 @@
2012-02-25 Walter Lee <walt@tilera.com>
* tilegx.h (R_TILEGX_IMM16_X0_HW1_GOT): Delete.
(R_TILEGX_IMM16_X1_HW1_GOT): Ditto.
(R_TILEGX_IMM16_X0_HW2_GOT): Ditto.
(R_TILEGX_IMM16_X1_HW2_GOT): Ditto.
(R_TILEGX_IMM16_X0_HW3_GOT): Ditto.
(R_TILEGX_IMM16_X1_HW3_GOT): Ditto.
(R_TILEGX_IMM16_X0_HW2_LAST_GOT): Ditto.
(R_TILEGX_IMM16_X1_HW2_LAST_GOT): Ditto.
(R_TILEGX_IMM16_X0_HW1_TLS_GD): Ditto.
(R_TILEGX_IMM16_X1_HW1_TLS_GD): Ditto.
(R_TILEGX_IMM16_X0_HW2_TLS_GD): Ditto.
(R_TILEGX_IMM16_X1_HW2_TLS_GD): Ditto.
(R_TILEGX_IMM16_X0_HW3_TLS_GD): Ditto.
(R_TILEGX_IMM16_X1_HW3_TLS_GD): Ditto.
(R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD): Ditto.
(R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD): Ditto.
(R_TILEGX_IMM16_X0_HW1_TLS_IE): Ditto.
(R_TILEGX_IMM16_X1_HW1_TLS_IE): Ditto.
(R_TILEGX_IMM16_X0_HW2_TLS_IE): Ditto.
(R_TILEGX_IMM16_X1_HW2_TLS_IE): Ditto.
(R_TILEGX_IMM16_X0_HW3_TLS_IE): Ditto.
(R_TILEGX_IMM16_X1_HW3_TLS_IE): Ditto.
(R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE): Ditto.
(R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE): Ditto.
(R_TILEGX_IMM16_X0_HW0_TLS_LE): New relocation.
(R_TILEGX_IMM16_X1_HW0_TLS_LE): Ditto.
(R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE): Ditto.
(R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE): Ditto.
(R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE): Ditto.
(R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE): Ditto.
(R_TILEGX_TLS_GD_CALL): Ditto.
(R_TILEGX_IMM8_X0_TLS_GD_ADD): Ditto.
(R_TILEGX_IMM8_X1_TLS_GD_ADD): Ditto.
(R_TILEGX_IMM8_Y0_TLS_GD_ADD): Ditto.
(R_TILEGX_IMM8_Y1_TLS_GD_ADD): Ditto.
(R_TILEGX_TLS_IE_LOAD): Ditto.
(R_TILEGX_IMM8_X0_TLS_ADD): Ditto.
(R_TILEGX_IMM8_X1_TLS_ADD): Ditto.
(R_TILEGX_IMM8_Y0_TLS_ADD): Ditto.
(R_TILEGX_IMM8_Y1_TLS_ADD): Ditto.
* tilepro.h (R_TILEPRO_TLS_GD_CALL): New relocation.
(R_TILEPRO_IMM8_X0_TLS_GD_ADD): Ditto.
(R_TILEPRO_IMM8_X1_TLS_GD_ADD): Ditto.
(R_TILEPRO_IMM8_Y0_TLS_GD_ADD): Ditto.
(R_TILEPRO_IMM8_Y1_TLS_GD_ADD): Ditto.
(R_TILEPRO_TLS_IE_LOAD): Ditto.
(R_TILEPRO_IMM16_X0_TLS_LE): Ditto.
(R_TILEPRO_IMM16_X1_TLS_LE): Ditto.
(R_TILEPRO_IMM16_X0_TLS_LE_LO): Ditto.
(R_TILEPRO_IMM16_X1_TLS_LE_LO): Ditto.
(R_TILEPRO_IMM16_X0_TLS_LE_HI): Ditto.
(R_TILEPRO_IMM16_X1_TLS_LE_HI): Ditto.
(R_TILEPRO_IMM16_X0_TLS_LE_HA): Ditto.
(R_TILEPRO_IMM16_X1_TLS_LE_HA): Ditto.
2011-12-22 DJ Delorie <dj@redhat.com> 2011-12-22 DJ Delorie <dj@redhat.com>
* rl78.h (R_RL78_RH_RELAX, R_RL78_RH_SFR, R_RL78_RH_SADDR): New. * rl78.h (R_RL78_RH_RELAX, R_RL78_RH_SFR, R_RL78_RH_SADDR): New.

View File

@ -104,48 +104,37 @@ START_RELOC_NUMBERS (elf_tilegx_reloc_type)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_GOT, 64) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_GOT, 64)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_GOT, 65) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_GOT, 65)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_GOT, 66) /* Relocs 66-71 are currently not defined. */
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_GOT, 67)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_GOT, 68)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_GOT, 69)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3_GOT, 70)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3_GOT, 71)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 72) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 72)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 73) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 73)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 74) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 74)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 75) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 75)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST_GOT, 76) /* Relocs 76-77 are currently not defined. */
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST_GOT, 77)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_GD, 78) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_GD, 78)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_GD, 79) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_GD, 79)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_TLS_GD, 80) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_LE, 80)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_TLS_GD, 81) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_LE, 81)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_TLS_GD, 82) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE, 82)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_TLS_GD, 83) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE, 83)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3_TLS_GD, 84) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE, 84)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3_TLS_GD, 85) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE, 85)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 86) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 86)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 87) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 87)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 88) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 88)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 89) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 89)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD, 90) /* Relocs 90-91 are currently not defined. */
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD, 91)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_IE, 92) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_IE, 92)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_IE, 93) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_IE, 93)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_TLS_IE, 94) /* Relocs 94-99 are currently not defined. */
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_TLS_IE, 95)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_TLS_IE, 96)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_TLS_IE, 97)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3_TLS_IE, 98)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3_TLS_IE, 99)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 100) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 100)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 101) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 101)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 102) RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 102)
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 103) RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 103)
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE, 104) /* Relocs 104-105 are currently not defined. */
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE, 105)
RELOC_NUMBER (R_TILEGX_TLS_DTPMOD64, 106) RELOC_NUMBER (R_TILEGX_TLS_DTPMOD64, 106)
RELOC_NUMBER (R_TILEGX_TLS_DTPOFF64, 107) RELOC_NUMBER (R_TILEGX_TLS_DTPOFF64, 107)
@ -154,6 +143,17 @@ START_RELOC_NUMBERS (elf_tilegx_reloc_type)
RELOC_NUMBER (R_TILEGX_TLS_DTPOFF32, 110) RELOC_NUMBER (R_TILEGX_TLS_DTPOFF32, 110)
RELOC_NUMBER (R_TILEGX_TLS_TPOFF32, 111) RELOC_NUMBER (R_TILEGX_TLS_TPOFF32, 111)
RELOC_NUMBER (R_TILEGX_TLS_GD_CALL, 112)
RELOC_NUMBER (R_TILEGX_IMM8_X0_TLS_GD_ADD, 113)
RELOC_NUMBER (R_TILEGX_IMM8_X1_TLS_GD_ADD, 114)
RELOC_NUMBER (R_TILEGX_IMM8_Y0_TLS_GD_ADD, 115)
RELOC_NUMBER (R_TILEGX_IMM8_Y1_TLS_GD_ADD, 116)
RELOC_NUMBER (R_TILEGX_TLS_IE_LOAD, 117)
RELOC_NUMBER (R_TILEGX_IMM8_X0_TLS_ADD, 118)
RELOC_NUMBER (R_TILEGX_IMM8_X1_TLS_ADD, 119)
RELOC_NUMBER (R_TILEGX_IMM8_Y0_TLS_ADD, 120)
RELOC_NUMBER (R_TILEGX_IMM8_Y1_TLS_ADD, 121)
/* These are GNU extensions to enable C++ vtable garbage collection. */ /* These are GNU extensions to enable C++ vtable garbage collection. */
RELOC_NUMBER (R_TILEGX_GNU_VTINHERIT, 128) RELOC_NUMBER (R_TILEGX_GNU_VTINHERIT, 128)
RELOC_NUMBER (R_TILEGX_GNU_VTENTRY, 129) RELOC_NUMBER (R_TILEGX_GNU_VTENTRY, 129)

View File

@ -96,7 +96,14 @@ START_RELOC_NUMBERS (elf_tilepro_reloc_type)
RELOC_NUMBER (R_TILEPRO_DEST_IMM8_X1, 55) RELOC_NUMBER (R_TILEPRO_DEST_IMM8_X1, 55)
/* Relocs 56-65 are currently not defined. */ /* Relocs 56-59 are currently not defined. */
RELOC_NUMBER (R_TILEPRO_TLS_GD_CALL, 60)
RELOC_NUMBER (R_TILEPRO_IMM8_X0_TLS_GD_ADD, 61)
RELOC_NUMBER (R_TILEPRO_IMM8_X1_TLS_GD_ADD, 62)
RELOC_NUMBER (R_TILEPRO_IMM8_Y0_TLS_GD_ADD, 63)
RELOC_NUMBER (R_TILEPRO_IMM8_Y1_TLS_GD_ADD, 64)
RELOC_NUMBER (R_TILEPRO_TLS_IE_LOAD, 65)
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD, 66) RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD, 66)
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD, 67) RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD, 67)
@ -120,6 +127,15 @@ START_RELOC_NUMBERS (elf_tilepro_reloc_type)
RELOC_NUMBER (R_TILEPRO_TLS_DTPOFF32, 83) RELOC_NUMBER (R_TILEPRO_TLS_DTPOFF32, 83)
RELOC_NUMBER (R_TILEPRO_TLS_TPOFF32, 84) RELOC_NUMBER (R_TILEPRO_TLS_TPOFF32, 84)
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE, 85)
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE, 86)
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_LO, 87)
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_LO, 88)
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_HI, 89)
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_HI, 90)
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_HA, 91)
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_HA, 92)
/* These are GNU extensions to enable C++ vtable garbage collection. */ /* These are GNU extensions to enable C++ vtable garbage collection. */
RELOC_NUMBER (R_TILEPRO_GNU_VTINHERIT, 128) RELOC_NUMBER (R_TILEPRO_GNU_VTINHERIT, 128)
RELOC_NUMBER (R_TILEPRO_GNU_VTENTRY, 129) RELOC_NUMBER (R_TILEPRO_GNU_VTENTRY, 129)

View File

@ -1,3 +1,10 @@
2012-02-25 Walter Lee <walt@tilera.com>
* tilegx.h (tilegx_mnemonic): Add TILEGX_OPC_LD4S_TLS,
TILEGX_OPC_LD_TLS.
* tilepro.h (tilepro_mnemonic): Add TILEPRO_OPC_LW_TLS,
TILEPRO_OPC_LW_TLS_SN.
2012-02-08 H.J. Lu <hongjiu.lu@intel.com> 2012-02-08 H.J. Lu <hongjiu.lu@intel.com>
* i386.h (XACQUIRE_PREFIX_OPCODE): New. * i386.h (XACQUIRE_PREFIX_OPCODE): New.

View File

@ -34,6 +34,8 @@ typedef enum
TILEGX_OPC_BPT, TILEGX_OPC_BPT,
TILEGX_OPC_INFO, TILEGX_OPC_INFO,
TILEGX_OPC_INFOL, TILEGX_OPC_INFOL,
TILEGX_OPC_LD4S_TLS,
TILEGX_OPC_LD_TLS,
TILEGX_OPC_MOVE, TILEGX_OPC_MOVE,
TILEGX_OPC_MOVEI, TILEGX_OPC_MOVEI,
TILEGX_OPC_MOVELI, TILEGX_OPC_MOVELI,

View File

@ -36,6 +36,8 @@ typedef enum
TILEPRO_OPC_INFOL, TILEPRO_OPC_INFOL,
TILEPRO_OPC_J, TILEPRO_OPC_J,
TILEPRO_OPC_JAL, TILEPRO_OPC_JAL,
TILEPRO_OPC_LW_TLS,
TILEPRO_OPC_LW_TLS_SN,
TILEPRO_OPC_MOVE, TILEPRO_OPC_MOVE,
TILEPRO_OPC_MOVE_SN, TILEPRO_OPC_MOVE_SN,
TILEPRO_OPC_MOVEI, TILEPRO_OPC_MOVEI,

View File

@ -1,3 +1,9 @@
2012-02-25 Walter Lee <walt@tilera.com>
* tilegx-opc.c: Handle TILEGX_OPC_LD4S_TLS and TILEGX_OPC_LD_TLS.
* tilepro-opc.c: Handle TILEPRO_OPC_LW_TLS and
TILEPRO_OPC_LW_TLS_SN.
2012-02-21 H.J. Lu <hongjiu.lu@intel.com> 2012-02-21 H.J. Lu <hongjiu.lu@intel.com>
* i386-opc.h (HLEPrefixNone): New. * i386-opc.h (HLEPrefixNone): New.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff