From 741d6ea85b096ca043859a71ae022ad160a64eec Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Mon, 2 Jul 2007 10:49:42 +0000 Subject: [PATCH] bfd: * elfxx-mips.c (mips_elf_calculate_relocation): Handle R_MIPS_TLS_DTPREL32 and R_MIPS_TLS_DTPREL64. * elf64-mips.c (mips_elf64_howto_table_rela): Support R_MIPS_TLS_DTPREL64. gas: * config/tc-mips.c (s_dtprelword, s_dtpreldword, s_dtprel_internal): New. (mips_pseudo_table): Add .dtprelword and .dtpreldword. (md_apply_fix): Handle BFD_RELOC_MIPS_TLS_DTPREL32 and BFD_RELOC_MIPS_TLS_DTPREL64. --- bfd/ChangeLog | 7 ++++++ bfd/elf64-mips.c | 15 +++++++++++- bfd/elfxx-mips.c | 2 ++ gas/ChangeLog | 8 +++++++ gas/config/tc-mips.c | 55 +++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 85 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5b8bbfd33dc..e006595f969 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2007-07-02 Joseph Myers + + * elfxx-mips.c (mips_elf_calculate_relocation): Handle + R_MIPS_TLS_DTPREL32 and R_MIPS_TLS_DTPREL64. + * elf64-mips.c (mips_elf64_howto_table_rela): Support + R_MIPS_TLS_DTPREL64. + 2007-07-02 Alan Modra * Makefile.am: Run "make dep-am". diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 608168f9bd5..e64b50caed0 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -1327,7 +1327,20 @@ static reloc_howto_type mips_elf64_howto_table_rela[] = EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32), EMPTY_HOWTO (R_MIPS_TLS_DTPREL32), EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64), - EMPTY_HOWTO (R_MIPS_TLS_DTPREL64), + + HOWTO (R_MIPS_TLS_DTPREL64, /* type */ + 0, /* rightshift */ + 4, /* size (0 = byte, 1 = short, 2 = long) */ + 64, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont, /* complain_on_overflow */ + _bfd_mips_elf_generic_reloc, /* special_function */ + "R_MIPS_TLS_DTPREL64", /* name */ + TRUE, /* partial_inplace */ + MINUS_ONE, /* src_mask */ + MINUS_ONE, /* dst_mask */ + FALSE), /* pcrel_offset */ /* TLS general dynamic variable reference. */ HOWTO (R_MIPS_TLS_GD, /* type */ diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index d368d41095c..28a4e8b333b 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -4355,6 +4355,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, break; case R_MIPS_TLS_DTPREL_LO16: + case R_MIPS_TLS_DTPREL32: + case R_MIPS_TLS_DTPREL64: value = (symbol + addend - dtprel_base (info)) & howto->dst_mask; break; diff --git a/gas/ChangeLog b/gas/ChangeLog index 6b02119f111..a1b434a1e10 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2007-07-02 Joseph Myers + + * config/tc-mips.c (s_dtprelword, s_dtpreldword, + s_dtprel_internal): New. + (mips_pseudo_table): Add .dtprelword and .dtpreldword. + (md_apply_fix): Handle BFD_RELOC_MIPS_TLS_DTPREL32 and + BFD_RELOC_MIPS_TLS_DTPREL64. + 2007-07-02 Alan Modra * Makefile.am: Run "make dep-am". diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 39f681e14be..c2867bec72b 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -1024,6 +1024,8 @@ static void s_cpsetup (int); static void s_cplocal (int); static void s_cprestore (int); static void s_cpreturn (int); +static void s_dtprelword (int); +static void s_dtpreldword (int); static void s_gpvalue (int); static void s_gpword (int); static void s_gpdword (int); @@ -1097,6 +1099,8 @@ static const pseudo_typeS mips_pseudo_table[] = {"cplocal", s_cplocal, 0}, {"cprestore", s_cprestore, 0}, {"cpreturn", s_cpreturn, 0}, + {"dtprelword", s_dtprelword, 0}, + {"dtpreldword", s_dtpreldword, 0}, {"gpvalue", s_gpvalue, 0}, {"gpword", s_gpword, 0}, {"gpdword", s_gpdword, 0}, @@ -11812,7 +11816,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) || fixP->fx_r_type == BFD_RELOC_CTOR || fixP->fx_r_type == BFD_RELOC_MIPS_SUB || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY); + || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY + || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64); buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where); @@ -11835,6 +11840,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) { case BFD_RELOC_MIPS_TLS_GD: case BFD_RELOC_MIPS_TLS_LDM: + case BFD_RELOC_MIPS_TLS_DTPREL32: + case BFD_RELOC_MIPS_TLS_DTPREL64: case BFD_RELOC_MIPS_TLS_DTPREL_HI16: case BFD_RELOC_MIPS_TLS_DTPREL_LO16: case BFD_RELOC_MIPS_TLS_GOTTPREL: @@ -12918,6 +12925,52 @@ 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. */ + +static void +s_dtprel_internal (size_t bytes) +{ + expressionS ex; + char *p; + + expression (&ex); + + if (ex.X_op != O_symbol) + { + as_bad (_("Unsupported use of %s"), (bytes == 8 + ? ".dtpreldword" + : ".dtprelword")); + 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)); + + demand_empty_rest_of_line (); +} + +/* Handle .dtprelword. */ + +static void +s_dtprelword (int ignore ATTRIBUTE_UNUSED) +{ + s_dtprel_internal (4); +} + +/* Handle .dtpreldword. */ + +static void +s_dtpreldword (int ignore ATTRIBUTE_UNUSED) +{ + s_dtprel_internal (8); +} + /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC code. It sets the offset to use in gp_rel relocations. */ -- 2.30.2