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 /gas/config | |
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 'gas/config')
-rw-r--r-- | gas/config/tc-mips.c | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 50e5024..b967663 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -1356,6 +1356,8 @@ static void s_cprestore (int); static void s_cpreturn (int); static void s_dtprelword (int); static void s_dtpreldword (int); +static void s_tprelword (int); +static void s_tpreldword (int); static void s_gpvalue (int); static void s_gpword (int); static void s_gpdword (int); @@ -1435,6 +1437,8 @@ static const pseudo_typeS mips_pseudo_table[] = {"cpreturn", s_cpreturn, 0}, {"dtprelword", s_dtprelword, 0}, {"dtpreldword", s_dtpreldword, 0}, + {"tprelword", s_tprelword, 0}, + {"tpreldword", s_tpreldword, 0}, {"gpvalue", s_gpvalue, 0}, {"gpword", s_gpword, 0}, {"gpdword", s_gpdword, 0}, @@ -14073,7 +14077,14 @@ static const struct percent_op_match mips16_percent_op[] = {"%gprel", BFD_RELOC_MIPS16_GPREL}, {"%got", BFD_RELOC_MIPS16_GOT16}, {"%call16", BFD_RELOC_MIPS16_CALL16}, - {"%hi", BFD_RELOC_MIPS16_HI16_S} + {"%hi", BFD_RELOC_MIPS16_HI16_S}, + {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD}, + {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM}, + {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16}, + {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16}, + {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16}, + {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16}, + {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL} }; @@ -15402,6 +15413,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) case BFD_RELOC_MIPS_TLS_DTPREL_HI16: case BFD_RELOC_MIPS_TLS_DTPREL_LO16: case BFD_RELOC_MIPS_TLS_GOTTPREL: + case BFD_RELOC_MIPS_TLS_TPREL32: + case BFD_RELOC_MIPS_TLS_TPREL64: case BFD_RELOC_MIPS_TLS_TPREL_HI16: case BFD_RELOC_MIPS_TLS_TPREL_LO16: case BFD_RELOC_MICROMIPS_TLS_GD: @@ -15411,6 +15424,13 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) case BFD_RELOC_MICROMIPS_TLS_GOTTPREL: case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16: case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16: + case BFD_RELOC_MIPS16_TLS_GD: + case BFD_RELOC_MIPS16_TLS_LDM: + case BFD_RELOC_MIPS16_TLS_DTPREL_HI16: + case BFD_RELOC_MIPS16_TLS_DTPREL_LO16: + case BFD_RELOC_MIPS16_TLS_GOTTPREL: + case BFD_RELOC_MIPS16_TLS_TPREL_HI16: + case BFD_RELOC_MIPS16_TLS_TPREL_LO16: S_SET_THREAD_LOCAL (fixP->fx_addsy); /* fall through */ @@ -16580,12 +16600,14 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED) demand_empty_rest_of_line (); } -/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate - a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for - use in DWARF debug information. */ +/* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword + pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size + DTP- or TP-relative relocation of type RTYPE, for use in either DWARF + debug information or MIPS16 TLS. */ static void -s_dtprel_internal (size_t bytes) +s_tls_rel_directive (const size_t bytes, const char *dirstr, + bfd_reloc_code_real_type rtype) { expressionS ex; char *p; @@ -16594,19 +16616,13 @@ s_dtprel_internal (size_t bytes) if (ex.X_op != O_symbol) { - as_bad (_("Unsupported use of %s"), (bytes == 8 - ? ".dtpreldword" - : ".dtprelword")); + as_bad (_("Unsupported use of %s"), dirstr); ignore_rest_of_line (); } p = frag_more (bytes); md_number_to_chars (p, 0, bytes); - fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, - (bytes == 8 - ? BFD_RELOC_MIPS_TLS_DTPREL64 - : BFD_RELOC_MIPS_TLS_DTPREL32)); - + fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype); demand_empty_rest_of_line (); } @@ -16615,7 +16631,7 @@ s_dtprel_internal (size_t bytes) static void s_dtprelword (int ignore ATTRIBUTE_UNUSED) { - s_dtprel_internal (4); + s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32); } /* Handle .dtpreldword. */ @@ -16623,7 +16639,23 @@ s_dtprelword (int ignore ATTRIBUTE_UNUSED) static void s_dtpreldword (int ignore ATTRIBUTE_UNUSED) { - s_dtprel_internal (8); + s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64); +} + +/* Handle .tprelword. */ + +static void +s_tprelword (int ignore ATTRIBUTE_UNUSED) +{ + s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32); +} + +/* Handle .tpreldword. */ + +static void +s_tpreldword (int ignore ATTRIBUTE_UNUSED) +{ + s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64); } /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC |