aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-mips.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2005-03-02 21:23:33 +0000
committerDaniel Jacobowitz <drow@false.org>2005-03-02 21:23:33 +0000
commit3f98094e75080ad0de055e5935abb1765a27b468 (patch)
tree73ea5cba926c1644cb6669719a3b49a25623eade /gas/config/tc-mips.c
parent0f20cc3522e7ec042e7c4dde886c1b99725316a9 (diff)
downloadgdb-3f98094e75080ad0de055e5935abb1765a27b468.zip
gdb-3f98094e75080ad0de055e5935abb1765a27b468.tar.gz
gdb-3f98094e75080ad0de055e5935abb1765a27b468.tar.bz2
* config/tc-mips.c (percent_op): Add %tlsgd, %tlsldm, %dtprel_hi,
%dtprel_lo, %tprel_hi, %tprel_lo, and %gottprel. (parse_relocation): Check for a word break after a relocation operator. (md_apply_fix3): Handle TLS relocations, and mark thread-local symbols.
Diffstat (limited to 'gas/config/tc-mips.c')
-rw-r--r--gas/config/tc-mips.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 02ff10a..940dd8f 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -9856,6 +9856,13 @@ static const struct percent_op_match mips_percent_op[] =
{"%highest", BFD_RELOC_MIPS_HIGHEST},
{"%higher", BFD_RELOC_MIPS_HIGHER},
{"%neg", BFD_RELOC_MIPS_SUB},
+ {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
+ {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
+ {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
+ {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
+ {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
+ {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
+ {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
#endif
{"%hi", BFD_RELOC_HI16_S}
};
@@ -9892,6 +9899,11 @@ parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
for (i = 0; i < limit; i++)
if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
{
+ int len = strlen (percent_op[i].str);
+
+ if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
+ continue;
+
*str += strlen (percent_op[i].str);
*reloc = percent_op[i].reloc;
@@ -11028,6 +11040,16 @@ md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
switch (fixP->fx_r_type)
{
+ case BFD_RELOC_MIPS_TLS_GD:
+ case BFD_RELOC_MIPS_TLS_LDM:
+ 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_TPREL_HI16:
+ case BFD_RELOC_MIPS_TLS_TPREL_LO16:
+ S_SET_THREAD_LOCAL (fixP->fx_addsy);
+ /* fall through */
+
case BFD_RELOC_MIPS_JMP:
case BFD_RELOC_MIPS_SHIFT5:
case BFD_RELOC_MIPS_SHIFT6: