diff options
author | Chung-Lin Tang <cltang@codesourcery.com> | 2011-12-19 07:58:02 +0000 |
---|---|---|
committer | Chung-Lin Tang <cltang@codesourcery.com> | 2011-12-19 07:58:02 +0000 |
commit | d0f136821434fa55b5c8099a83dd91672f01e579 (patch) | |
tree | 661fbb566fa896a8a43caa6b02c0cd2f35f6fe28 /bfd/elfxx-mips.c | |
parent | 8f0c309a212a5097dec0cbc9678ffec286702968 (diff) | |
download | gdb-d0f136821434fa55b5c8099a83dd91672f01e579.zip gdb-d0f136821434fa55b5c8099a83dd91672f01e579.tar.gz gdb-d0f136821434fa55b5c8099a83dd91672f01e579.tar.bz2 |
2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
gas/
* config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword
entries.
(mips16_percent_op): Add MIPS16 TLS relocation ops.
(md_apply_fix): Add BFD_RELOC_MIPS16_TLS_* switch cases.
(s_tls_rel_directive): Rename from s_dtprel_internal(). Abstract out
directive string and reloc type as function parameters. Update
comments.
(s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive().
(s_tprelword,s_tpreldword): New functions.
include/
* elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries.
bfd/
* reloc.c (BFD_RELOC_MIPS16_TLS_GD,BFD_RELOC_MIPS16_TLS_LDM,
BFD_RELOC_MIPS16_TLS_DTPREL_HI16,BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
BFD_RELOC_MIPS16_TLS_GOTTPREL,BFD_RELOC_MIPS16_TLS_TPREL_HI16,
BFD_RELOC_MIPS16_TLS_TPREL_LO16): New relocations for MIPS16 TLS.
* bfd-in2.h (bfd_reloc_code_real): Regenerate.
* libbfd.h (bfd_reloc_code_real_names): Regenerate.
* elf32-mips.c (elf_mips16_howto_table_rel): Add R_MIPS16_TLS_*
entries.
(mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
mappings.
* elfn32-mips.c (elf_mips16_howto_table_rel,
elf_mips16_howto_table_rela): Add R_MIPS16_TLS_* entries.
(mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
mappings.
* elf64-mips.c (mips16_elf64_howto_table_rel,
mips16_elf64_howto_table_rela): Add R_MIPS16_TLS_* entries.
(mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
mappings.
* elfxx-mips.c (TLS_RELOC_P,mips16_reloc_p,
_bfd_mips_elf_check_relocs): Add cases for R_MIPS16_TLS_* relocations.
(tls_gd_reloc_p): Add R_MIPS16_TLS_GD case.
(tls_ldm_reloc_p): Add R_MIPS16_TLS_LDM case.
(tls_gottprel_reloc_p): Add R_MIPS16_TLS_GOTTPREL case.
(mips_elf_calculate_relocation): Add cases for R_MIPS16_TLS_*,
R_MIPS_TLS_DTPREL32/64, and R_MIPS_TLS_TPREL32/64 relocations.
Diffstat (limited to 'bfd/elfxx-mips.c')
-rw-r--r-- | bfd/elfxx-mips.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index bd343be..7401d1f 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -529,6 +529,13 @@ struct mips_htab_traverse_info || r_type == R_MIPS_TLS_TPREL64 \ || r_type == R_MIPS_TLS_TPREL_HI16 \ || r_type == R_MIPS_TLS_TPREL_LO16 \ + || r_type == R_MIPS16_TLS_GD \ + || r_type == R_MIPS16_TLS_LDM \ + || r_type == R_MIPS16_TLS_DTPREL_HI16 \ + || r_type == R_MIPS16_TLS_DTPREL_LO16 \ + || r_type == R_MIPS16_TLS_GOTTPREL \ + || r_type == R_MIPS16_TLS_TPREL_HI16 \ + || r_type == R_MIPS16_TLS_TPREL_LO16 \ || r_type == R_MICROMIPS_TLS_GD \ || r_type == R_MICROMIPS_TLS_LDM \ || r_type == R_MICROMIPS_TLS_DTPREL_HI16 \ @@ -1885,6 +1892,13 @@ mips16_reloc_p (int r_type) case R_MIPS16_CALL16: case R_MIPS16_HI16: case R_MIPS16_LO16: + case R_MIPS16_TLS_GD: + case R_MIPS16_TLS_LDM: + case R_MIPS16_TLS_DTPREL_HI16: + case R_MIPS16_TLS_DTPREL_LO16: + case R_MIPS16_TLS_GOTTPREL: + case R_MIPS16_TLS_TPREL_HI16: + case R_MIPS16_TLS_TPREL_LO16: return TRUE; default: @@ -2012,19 +2026,25 @@ micromips_branch_reloc_p (int r_type) static inline bfd_boolean tls_gd_reloc_p (unsigned int r_type) { - return r_type == R_MIPS_TLS_GD || r_type == R_MICROMIPS_TLS_GD; + return (r_type == R_MIPS_TLS_GD + || r_type == R_MIPS16_TLS_GD + || r_type == R_MICROMIPS_TLS_GD); } static inline bfd_boolean tls_ldm_reloc_p (unsigned int r_type) { - return r_type == R_MIPS_TLS_LDM || r_type == R_MICROMIPS_TLS_LDM; + return (r_type == R_MIPS_TLS_LDM + || r_type == R_MIPS16_TLS_LDM + || r_type == R_MICROMIPS_TLS_LDM); } static inline bfd_boolean tls_gottprel_reloc_p (unsigned int r_type) { - return r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MICROMIPS_TLS_GOTTPREL; + return (r_type == R_MIPS_TLS_GOTTPREL + || r_type == R_MIPS16_TLS_GOTTPREL + || r_type == R_MICROMIPS_TLS_GOTTPREL); } void @@ -5361,6 +5381,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, case R_MIPS_TLS_GD: case R_MIPS_TLS_GOTTPREL: case R_MIPS_TLS_LDM: + case R_MIPS16_TLS_GD: + case R_MIPS16_TLS_GOTTPREL: + case R_MIPS16_TLS_LDM: case R_MICROMIPS_TLS_GD: case R_MICROMIPS_TLS_GOTTPREL: case R_MICROMIPS_TLS_LDM: @@ -5530,6 +5553,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, break; case R_MIPS_TLS_DTPREL_HI16: + case R_MIPS16_TLS_DTPREL_HI16: case R_MICROMIPS_TLS_DTPREL_HI16: value = (mips_elf_high (addend + symbol - dtprel_base (info)) & howto->dst_mask); @@ -5538,17 +5562,22 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, case R_MIPS_TLS_DTPREL_LO16: case R_MIPS_TLS_DTPREL32: case R_MIPS_TLS_DTPREL64: + case R_MIPS16_TLS_DTPREL_LO16: case R_MICROMIPS_TLS_DTPREL_LO16: value = (symbol + addend - dtprel_base (info)) & howto->dst_mask; break; case R_MIPS_TLS_TPREL_HI16: + case R_MIPS16_TLS_TPREL_HI16: case R_MICROMIPS_TLS_TPREL_HI16: value = (mips_elf_high (addend + symbol - tprel_base (info)) & howto->dst_mask); break; case R_MIPS_TLS_TPREL_LO16: + case R_MIPS_TLS_TPREL32: + case R_MIPS_TLS_TPREL64: + case R_MIPS16_TLS_TPREL_LO16: case R_MICROMIPS_TLS_TPREL_LO16: value = (symbol + addend - tprel_base (info)) & howto->dst_mask; break; @@ -5681,6 +5710,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, case R_MIPS_TLS_GOTTPREL: case R_MIPS_TLS_LDM: case R_MIPS_GOT_DISP: + case R_MIPS16_TLS_GD: + case R_MIPS16_TLS_GOTTPREL: + case R_MIPS16_TLS_LDM: case R_MICROMIPS_TLS_GD: case R_MICROMIPS_TLS_GOTTPREL: case R_MICROMIPS_TLS_LDM: @@ -7814,8 +7846,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, can_make_dynamic_p = FALSE; switch (r_type) { - case R_MIPS16_GOT16: - case R_MIPS16_CALL16: case R_MIPS_GOT16: case R_MIPS_CALL16: case R_MIPS_CALL_HI16: @@ -7828,6 +7858,11 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_MIPS_TLS_GOTTPREL: case R_MIPS_TLS_GD: case R_MIPS_TLS_LDM: + case R_MIPS16_GOT16: + case R_MIPS16_CALL16: + case R_MIPS16_TLS_GOTTPREL: + case R_MIPS16_TLS_GD: + case R_MIPS16_TLS_LDM: case R_MICROMIPS_GOT16: case R_MICROMIPS_CALL16: case R_MICROMIPS_CALL_HI16: @@ -8064,12 +8099,14 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, break; case R_MIPS_TLS_GOTTPREL: + case R_MIPS16_TLS_GOTTPREL: case R_MICROMIPS_TLS_GOTTPREL: if (info->shared) info->flags |= DF_STATIC_TLS; /* Fall through */ case R_MIPS_TLS_LDM: + case R_MIPS16_TLS_LDM: case R_MICROMIPS_TLS_LDM: if (tls_ldm_reloc_p (r_type)) { @@ -8079,6 +8116,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, /* Fall through */ case R_MIPS_TLS_GD: + case R_MIPS16_TLS_GD: case R_MICROMIPS_TLS_GD: /* This symbol requires a global offset table entry, or two for TLS GD relocations. */ |