diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 10 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 30 |
2 files changed, 36 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 48b179e..705ef53 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2002-09-26 Jakub Jelinek <jakub@redhat.com> + + * config/tc-i386.c (tc_i386_fix_adjustable): Add x86-64 TLS relocs. + Define them if not BFD_ASSEMBLER. + (lex_got): Handle @tlsgd, @dtpoff and @tpoff in 64-bit mode, add + @tlsld. + (md_apply_fix3): No addend for BFD_RELOC_X86_64_TLSGD, + BFD_RELOC_X86_64_TLSLD and BFD_RELOC_X86_64_GOTTPOFF. + (tc_gen_reloc): Handle x86-64 TLS relocs. + 2002-09-27 Alan Modra <amodra@bigpond.net.au> * config/tc-avr.c (md_apply_fix3): Reinstate code handling pcrel diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 4db65b8..b91b2bb 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -1235,6 +1235,11 @@ tc_i386_fix_adjustable (fixP) || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL + || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD + || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD + || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32 + || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF + || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) return 0; @@ -1263,6 +1268,11 @@ tc_i386_fix_adjustable (fixP) #define BFD_RELOC_X86_64_PLT32 0 #define BFD_RELOC_X86_64_GOT32 0 #define BFD_RELOC_X86_64_GOTPCREL 0 +#define BFD_RELOC_X86_64_TLSGD 0 +#define BFD_RELOC_X86_64_TLSLD 0 +#define BFD_RELOC_X86_64_DTPOFF32 0 +#define BFD_RELOC_X86_64_GOTTPOFF 0 +#define BFD_RELOC_X86_64_TPOFF32 0 #endif static int intel_float_operand PARAMS ((const char *mnemonic)); @@ -3484,12 +3494,13 @@ lex_got (reloc, adjust) { "PLT", { BFD_RELOC_386_PLT32, 0, BFD_RELOC_X86_64_PLT32 } }, { "GOTOFF", { BFD_RELOC_386_GOTOFF, 0, 0 } }, { "GOTPCREL", { 0, 0, BFD_RELOC_X86_64_GOTPCREL } }, - { "TLSGD", { BFD_RELOC_386_TLS_GD, 0, 0 } }, + { "TLSGD", { BFD_RELOC_386_TLS_GD, 0, BFD_RELOC_X86_64_TLSGD } }, { "TLSLDM", { BFD_RELOC_386_TLS_LDM, 0, 0 } }, - { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32, 0, 0 } }, - { "TPOFF", { BFD_RELOC_386_TLS_LE_32, 0, 0 } }, + { "TLSLD", { 0, 0, BFD_RELOC_X86_64_TLSLD } }, + { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32, 0, BFD_RELOC_X86_64_GOTTPOFF } }, + { "TPOFF", { BFD_RELOC_386_TLS_LE_32, 0, BFD_RELOC_X86_64_TPOFF32 } }, { "NTPOFF", { BFD_RELOC_386_TLS_LE, 0, 0 } }, - { "DTPOFF", { BFD_RELOC_386_TLS_LDO_32, 0, 0 } }, + { "DTPOFF", { BFD_RELOC_386_TLS_LDO_32, 0, BFD_RELOC_X86_64_DTPOFF32 } }, { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE, 0, 0 } }, { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE, 0, 0 } }, { "GOT", { BFD_RELOC_386_GOT32, 0, BFD_RELOC_X86_64_GOT32 } } @@ -4665,6 +4676,9 @@ md_apply_fix3 (fixP, valP, seg) case BFD_RELOC_386_TLS_IE: case BFD_RELOC_386_TLS_GOTIE: case BFD_RELOC_X86_64_GOT32: + case BFD_RELOC_X86_64_TLSGD: + case BFD_RELOC_X86_64_TLSLD: + case BFD_RELOC_X86_64_GOTTPOFF: value = 0; /* Fully resolved at runtime. No addend. */ break; @@ -5149,6 +5163,11 @@ tc_gen_reloc (section, fixp) case BFD_RELOC_386_TLS_LE_32: case BFD_RELOC_386_TLS_LE: case BFD_RELOC_X86_64_32S: + case BFD_RELOC_X86_64_TLSGD: + case BFD_RELOC_X86_64_TLSLD: + case BFD_RELOC_X86_64_DTPOFF32: + case BFD_RELOC_X86_64_GOTTPOFF: + case BFD_RELOC_X86_64_TPOFF32: case BFD_RELOC_RVA: case BFD_RELOC_VTABLE_ENTRY: case BFD_RELOC_VTABLE_INHERIT: @@ -5226,6 +5245,9 @@ tc_gen_reloc (section, fixp) case BFD_RELOC_X86_64_PLT32: case BFD_RELOC_X86_64_GOT32: case BFD_RELOC_X86_64_GOTPCREL: + case BFD_RELOC_X86_64_TLSGD: + case BFD_RELOC_X86_64_TLSLD: + case BFD_RELOC_X86_64_GOTTPOFF: rel->addend = fixp->fx_offset - fixp->fx_size; break; default: |