mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:54:41 +08:00
2008-08-20 Bob Wilson <bob.wilson@acm.org>
bfd/ * elf-bfd.h (elf_object_id): Add XTENSA_ELF_TDATA. * elf32-xtensa.c (elf_howto_table): Add TLS relocations. (elf_xtensa_reloc_type_lookup): Likewise. (TCB_SIZE): Define. (elf_xtensa_link_hash_entry): New. (GOT_UNKNOWN, GOT_NORMAL, GOT_TLS_GD, GOT_TLS_IE, GOT_TLS_ANY): Define. (elf_xtensa_hash_entry): Define. (elf_xtensa_obj_tdata): New. (elf_xtensa_tdata): Define. (elf_xtensa_local_got_tls_type): Define. (elf_xtensa_local_tlsfunc_refcounts): Define. (is_xtensa_elf): Define. (elf_xtensa_mkobject): New. (elf_xtensa_link_hash_table): Add tlsbase field. (elf_xtensa_link_hash_newfunc): New. (elf_xtensa_link_hash_table_create): Use elf_xtensa_link_hash_newfunc. Create an entry for "_TLS_MODULE_BASE_" and save it in tlsbase field. (elf_xtensa_copy_indirect_symbol): New. (elf_xtensa_check_relocs): Rewrite to handle TLS relocations. (elf_xtensa_gc_sweep_hook): Likewise. (elf_xtensa_allocate_dynrelocs): Optimize away GOT entries for TLSDESC_FN relocations when an IE reference is seen. (elf_xtensa_allocate_local_got_size): Likewise. (elf_xtensa_always_size_sections): New. (dtpoff_base, tpoff): New. (elf_xtensa_do_reloc): Handle TLS relocations. (replace_tls_insn): New. (IS_XTENSA_TLS_RELOC): Define. (elf_xtensa_relocate_section): Handle TLS relocations. (get_indirect_call_dest_reg): New. (bfd_elf32_mkobject): Define. (elf_backend_always_size_sections): New. (elf_backend_copy_indirect_symbol): New. * reloc.c (BFD_RELOC_XTENSA_TLSDESC_FN, BFD_RELOC_XTENSA_TLSDESC_ARG) (BFD_RELOC_XTENSA_TLS_DTPOFF, BFD_RELOC_XTENSA_TLS_TPOFF) (BFD_RELOC_XTENSA_TLS_FUNC, BFD_RELOC_XTENSA_TLS_ARG) (BFD_RELOC_XTENSA_TLS_CALL): New. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. gas/ * config/tc-xtensa.c (O_tlsfunc, O_tlsarg, O_tlscall): Define. (O_tpoff, O_dtpoff): Define. (suffix_relocs): Add entries for TLS suffixes. (xtensa_elf_cons): Check for invalid use of TLS relocations. (map_operator_to_reloc): Add is_literal parameter and use it to control translating TLS instruction relocations to the corresponding literal relocations. (xg_valid_literal_expression): Allow TLS operators. (xg_build_to_insn): Copy TLS operators from pseudo-instruction operands to generated literals. (xg_assemble_literal): Handle TLS operators. Update call to map_operator_to_reloc. (md_assemble): Handle CALLXn.TLS pseudo-instruction. (md_apply_fix): Handle TLS relocations. (emit_single_op): Handle TLS operators. (convert_frag_immed): Update call to map_operator_to_reloc. (vinsn_to_insnbuf): Emit relocations for TLS-related instructions. * config/xtensa-istack.h (tinsn_struct): Add tls_reloc field. * config/xtensa-relax.c (append_literal_op): Add src_op parameter to initialize the op_data field of the BuildOp. (build_transition): Use it here to record the source operand corresponding to a generated literal. * config/xtensa-relax.h (build_op): Comment op_data use for literals. include/elf/ * xtensa.h (R_XTENSA_TLSDESC_FN, R_XTENSA_TLSDESC_ARG) (R_XTENSA_TLS_DTPOFF, R_XTENSA_TLS_TPOFF, R_XTENSA_TLS_FUNC) (R_XTENSA_TLS_ARG, R_XTENSA_TLS_CALL): New. ld/testsuite/ * ld-xtensa/tlsbin.dd, ld-xtensa/tlsbin.rd, ld-xtensa/tlsbin.s, ld-xtensa/tlsbin.sd, ld-xtensa/tlsbin.td, ld-xtensa/tlslib.s, ld-xtensa/tlspic.dd, ld-xtensa/tlspic.rd, ld-xtensa/tlspic.sd, ld-xtensa/tlspic.td, ld-xtensa/tlspic1.s, ld-xtensa/tlspic2.s: New. * ld-xtensa/xtensa.exp: Run them.
This commit is contained in:
parent
f2f0e013fc
commit
28dbbc0203
@ -1,3 +1,45 @@
|
||||
2008-08-20 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* elf-bfd.h (elf_object_id): Add XTENSA_ELF_TDATA.
|
||||
* elf32-xtensa.c (elf_howto_table): Add TLS relocations.
|
||||
(elf_xtensa_reloc_type_lookup): Likewise.
|
||||
(TCB_SIZE): Define.
|
||||
(elf_xtensa_link_hash_entry): New.
|
||||
(GOT_UNKNOWN, GOT_NORMAL, GOT_TLS_GD, GOT_TLS_IE, GOT_TLS_ANY): Define.
|
||||
(elf_xtensa_hash_entry): Define.
|
||||
(elf_xtensa_obj_tdata): New.
|
||||
(elf_xtensa_tdata): Define.
|
||||
(elf_xtensa_local_got_tls_type): Define.
|
||||
(elf_xtensa_local_tlsfunc_refcounts): Define.
|
||||
(is_xtensa_elf): Define.
|
||||
(elf_xtensa_mkobject): New.
|
||||
(elf_xtensa_link_hash_table): Add tlsbase field.
|
||||
(elf_xtensa_link_hash_newfunc): New.
|
||||
(elf_xtensa_link_hash_table_create): Use elf_xtensa_link_hash_newfunc.
|
||||
Create an entry for "_TLS_MODULE_BASE_" and save it in tlsbase field.
|
||||
(elf_xtensa_copy_indirect_symbol): New.
|
||||
(elf_xtensa_check_relocs): Rewrite to handle TLS relocations.
|
||||
(elf_xtensa_gc_sweep_hook): Likewise.
|
||||
(elf_xtensa_allocate_dynrelocs): Optimize away GOT entries for
|
||||
TLSDESC_FN relocations when an IE reference is seen.
|
||||
(elf_xtensa_allocate_local_got_size): Likewise.
|
||||
(elf_xtensa_always_size_sections): New.
|
||||
(dtpoff_base, tpoff): New.
|
||||
(elf_xtensa_do_reloc): Handle TLS relocations.
|
||||
(replace_tls_insn): New.
|
||||
(IS_XTENSA_TLS_RELOC): Define.
|
||||
(elf_xtensa_relocate_section): Handle TLS relocations.
|
||||
(get_indirect_call_dest_reg): New.
|
||||
(bfd_elf32_mkobject): Define.
|
||||
(elf_backend_always_size_sections): New.
|
||||
(elf_backend_copy_indirect_symbol): New.
|
||||
* reloc.c (BFD_RELOC_XTENSA_TLSDESC_FN, BFD_RELOC_XTENSA_TLSDESC_ARG)
|
||||
(BFD_RELOC_XTENSA_TLS_DTPOFF, BFD_RELOC_XTENSA_TLS_TPOFF)
|
||||
(BFD_RELOC_XTENSA_TLS_FUNC, BFD_RELOC_XTENSA_TLS_ARG)
|
||||
(BFD_RELOC_XTENSA_TLS_CALL): New.
|
||||
* bfd-in2.h: Regenerate.
|
||||
* libbfd.h: Regenerate.
|
||||
|
||||
2008-08-18 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* elfxx-mips.c (_bfd_mips_elf_copy_indirect_symbol): Copy MIPS16
|
||||
|
@ -4369,6 +4369,15 @@ internally by the linker after analysis of a
|
||||
BFD_RELOC_XTENSA_ASM_EXPAND. */
|
||||
BFD_RELOC_XTENSA_ASM_SIMPLIFY,
|
||||
|
||||
/* Xtensa TLS relocations. */
|
||||
BFD_RELOC_XTENSA_TLSDESC_FN,
|
||||
BFD_RELOC_XTENSA_TLSDESC_ARG,
|
||||
BFD_RELOC_XTENSA_TLS_DTPOFF,
|
||||
BFD_RELOC_XTENSA_TLS_TPOFF,
|
||||
BFD_RELOC_XTENSA_TLS_FUNC,
|
||||
BFD_RELOC_XTENSA_TLS_ARG,
|
||||
BFD_RELOC_XTENSA_TLS_CALL,
|
||||
|
||||
/* 8 bit signed offset in (ix+d) or (iy+d). */
|
||||
BFD_RELOC_Z80_DISP8,
|
||||
|
||||
|
@ -1418,6 +1418,7 @@ enum elf_object_id
|
||||
SH_ELF_TDATA,
|
||||
SPARC_ELF_TDATA,
|
||||
X86_64_ELF_TDATA,
|
||||
XTENSA_ELF_TDATA,
|
||||
GENERIC_ELF_TDATA
|
||||
};
|
||||
|
||||
|
1018
bfd/elf32-xtensa.c
1018
bfd/elf32-xtensa.c
File diff suppressed because it is too large
Load Diff
@ -2001,6 +2001,13 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
||||
"BFD_RELOC_XTENSA_OP2",
|
||||
"BFD_RELOC_XTENSA_ASM_EXPAND",
|
||||
"BFD_RELOC_XTENSA_ASM_SIMPLIFY",
|
||||
"BFD_RELOC_XTENSA_TLSDESC_FN",
|
||||
"BFD_RELOC_XTENSA_TLSDESC_ARG",
|
||||
"BFD_RELOC_XTENSA_TLS_DTPOFF",
|
||||
"BFD_RELOC_XTENSA_TLS_TPOFF",
|
||||
"BFD_RELOC_XTENSA_TLS_FUNC",
|
||||
"BFD_RELOC_XTENSA_TLS_ARG",
|
||||
"BFD_RELOC_XTENSA_TLS_CALL",
|
||||
"BFD_RELOC_Z80_DISP8",
|
||||
"BFD_RELOC_Z8K_DISP7",
|
||||
"BFD_RELOC_Z8K_CALLR",
|
||||
|
18
bfd/reloc.c
18
bfd/reloc.c
@ -1,6 +1,6 @@
|
||||
/* BFD support for handling relocation entries.
|
||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
@ -5015,6 +5015,22 @@ ENUMDOC
|
||||
assembler-expanded instructions. This is commonly used
|
||||
internally by the linker after analysis of a
|
||||
BFD_RELOC_XTENSA_ASM_EXPAND.
|
||||
ENUM
|
||||
BFD_RELOC_XTENSA_TLSDESC_FN
|
||||
ENUMX
|
||||
BFD_RELOC_XTENSA_TLSDESC_ARG
|
||||
ENUMX
|
||||
BFD_RELOC_XTENSA_TLS_DTPOFF
|
||||
ENUMX
|
||||
BFD_RELOC_XTENSA_TLS_TPOFF
|
||||
ENUMX
|
||||
BFD_RELOC_XTENSA_TLS_FUNC
|
||||
ENUMX
|
||||
BFD_RELOC_XTENSA_TLS_ARG
|
||||
ENUMX
|
||||
BFD_RELOC_XTENSA_TLS_CALL
|
||||
ENUMDOC
|
||||
Xtensa TLS relocations.
|
||||
|
||||
ENUM
|
||||
BFD_RELOC_Z80_DISP8
|
||||
|
@ -1,3 +1,29 @@
|
||||
2008-08-20 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* config/tc-xtensa.c (O_tlsfunc, O_tlsarg, O_tlscall): Define.
|
||||
(O_tpoff, O_dtpoff): Define.
|
||||
(suffix_relocs): Add entries for TLS suffixes.
|
||||
(xtensa_elf_cons): Check for invalid use of TLS relocations.
|
||||
(map_operator_to_reloc): Add is_literal parameter and use it to
|
||||
control translating TLS instruction relocations to the corresponding
|
||||
literal relocations.
|
||||
(xg_valid_literal_expression): Allow TLS operators.
|
||||
(xg_build_to_insn): Copy TLS operators from pseudo-instruction
|
||||
operands to generated literals.
|
||||
(xg_assemble_literal): Handle TLS operators. Update call to
|
||||
map_operator_to_reloc.
|
||||
(md_assemble): Handle CALLXn.TLS pseudo-instruction.
|
||||
(md_apply_fix): Handle TLS relocations.
|
||||
(emit_single_op): Handle TLS operators.
|
||||
(convert_frag_immed): Update call to map_operator_to_reloc.
|
||||
(vinsn_to_insnbuf): Emit relocations for TLS-related instructions.
|
||||
* config/xtensa-istack.h (tinsn_struct): Add tls_reloc field.
|
||||
* config/xtensa-relax.c (append_literal_op): Add src_op parameter
|
||||
to initialize the op_data field of the BuildOp.
|
||||
(build_transition): Use it here to record the source operand
|
||||
corresponding to a generated literal.
|
||||
* config/xtensa-relax.h (build_op): Comment op_data use for literals.
|
||||
|
||||
2008-08-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
AVX Programming Reference (August, 2008)
|
||||
|
@ -356,6 +356,11 @@ op_placement_info_table op_placement_table;
|
||||
#define O_hi16 O_md2 /* use high 16 bits of symbolic value */
|
||||
#define O_lo16 O_md3 /* use low 16 bits of symbolic value */
|
||||
#define O_pcrel O_md4 /* value is a PC-relative offset */
|
||||
#define O_tlsfunc O_md5 /* TLS_FUNC/TLSDESC_FN relocation */
|
||||
#define O_tlsarg O_md6 /* TLS_ARG/TLSDESC_ARG relocation */
|
||||
#define O_tlscall O_md7 /* TLS_CALL relocation */
|
||||
#define O_tpoff O_md8 /* TPOFF relocation */
|
||||
#define O_dtpoff O_md9 /* DTPOFF relocation */
|
||||
|
||||
struct suffix_reloc_map
|
||||
{
|
||||
@ -373,6 +378,11 @@ static struct suffix_reloc_map suffix_relocs[] =
|
||||
SUFFIX_MAP ("h", BFD_RELOC_HI16, O_hi16),
|
||||
SUFFIX_MAP ("plt", BFD_RELOC_XTENSA_PLT, O_pltrel),
|
||||
SUFFIX_MAP ("pcrel", BFD_RELOC_32_PCREL, O_pcrel),
|
||||
SUFFIX_MAP ("tlsfunc", BFD_RELOC_XTENSA_TLS_FUNC, O_tlsfunc),
|
||||
SUFFIX_MAP ("tlsarg", BFD_RELOC_XTENSA_TLS_ARG, O_tlsarg),
|
||||
SUFFIX_MAP ("tlscall", BFD_RELOC_XTENSA_TLS_CALL, O_tlscall),
|
||||
SUFFIX_MAP ("tpoff", BFD_RELOC_XTENSA_TLS_TPOFF, O_tpoff),
|
||||
SUFFIX_MAP ("dtpoff", BFD_RELOC_XTENSA_TLS_DTPOFF, O_dtpoff),
|
||||
{ (char *) 0, 0, BFD_RELOC_UNUSED, 0 }
|
||||
};
|
||||
|
||||
@ -1553,6 +1563,10 @@ xtensa_elf_cons (int nbytes)
|
||||
else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
|
||||
as_bad (_("%s relocations do not fit in %d bytes"),
|
||||
reloc_howto->name, nbytes);
|
||||
else if (reloc == BFD_RELOC_XTENSA_TLS_FUNC
|
||||
|| reloc == BFD_RELOC_XTENSA_TLS_ARG
|
||||
|| reloc == BFD_RELOC_XTENSA_TLS_CALL)
|
||||
as_bad (_("invalid use of %s relocation"), reloc_howto->name);
|
||||
else
|
||||
{
|
||||
char *p = frag_more ((int) nbytes);
|
||||
@ -1665,7 +1679,7 @@ map_suffix_reloc_to_operator (bfd_reloc_code_real_type reloc)
|
||||
|
||||
/* Find the matching reloc type. */
|
||||
static bfd_reloc_code_real_type
|
||||
map_operator_to_reloc (unsigned char operator)
|
||||
map_operator_to_reloc (unsigned char operator, bfd_boolean is_literal)
|
||||
{
|
||||
struct suffix_reloc_map *sfx;
|
||||
bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
|
||||
@ -1679,6 +1693,14 @@ map_operator_to_reloc (unsigned char operator)
|
||||
}
|
||||
}
|
||||
|
||||
if (is_literal)
|
||||
{
|
||||
if (reloc == BFD_RELOC_XTENSA_TLS_FUNC)
|
||||
return BFD_RELOC_XTENSA_TLSDESC_FN;
|
||||
else if (reloc == BFD_RELOC_XTENSA_TLS_ARG)
|
||||
return BFD_RELOC_XTENSA_TLSDESC_ARG;
|
||||
}
|
||||
|
||||
if (reloc == BFD_RELOC_UNUSED)
|
||||
return BFD_RELOC_32;
|
||||
|
||||
@ -3149,6 +3171,10 @@ xg_valid_literal_expression (const expressionS *exp)
|
||||
case O_subtract:
|
||||
case O_pltrel:
|
||||
case O_pcrel:
|
||||
case O_tlsfunc:
|
||||
case O_tlsarg:
|
||||
case O_tpoff:
|
||||
case O_dtpoff:
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
@ -3347,6 +3373,9 @@ xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
|
||||
case OP_LITERAL:
|
||||
sym = get_special_literal_symbol ();
|
||||
set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
|
||||
if (insn->tok[op_data].X_op == O_tlsfunc
|
||||
|| insn->tok[op_data].X_op == O_tlsarg)
|
||||
copy_expr (&targ->tls_reloc, &insn->tok[op_data]);
|
||||
break;
|
||||
case OP_LABEL:
|
||||
sym = get_special_label_symbol ();
|
||||
@ -4062,9 +4091,13 @@ xg_assemble_literal (/* const */ TInsn *insn)
|
||||
pcrel = TRUE;
|
||||
/* fall through */
|
||||
case O_pltrel:
|
||||
case O_tlsfunc:
|
||||
case O_tlsarg:
|
||||
case O_tpoff:
|
||||
case O_dtpoff:
|
||||
p = frag_more (litsize);
|
||||
xtensa_set_frag_assembly_state (frag_now);
|
||||
reloc = map_operator_to_reloc (emit_val->X_op);
|
||||
reloc = map_operator_to_reloc (emit_val->X_op, TRUE);
|
||||
if (emit_val->X_add_symbol)
|
||||
emit_val->X_op = O_symbol;
|
||||
else
|
||||
@ -5310,8 +5343,58 @@ md_assemble (char *str)
|
||||
orig_insn.insn_type = ITYPE_INSN;
|
||||
orig_insn.ntok = 0;
|
||||
orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
|
||||
|
||||
orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
|
||||
|
||||
/* Special case: Check for "CALLXn.TLS" psuedo op. If found, grab its
|
||||
extra argument and set the opcode to "CALLXn". */
|
||||
if (orig_insn.opcode == XTENSA_UNDEFINED
|
||||
&& strncasecmp (opname, "callx", 5) == 0)
|
||||
{
|
||||
unsigned long window_size;
|
||||
char *suffix;
|
||||
|
||||
window_size = strtoul (opname + 5, &suffix, 10);
|
||||
if (suffix != opname + 5
|
||||
&& (window_size == 0
|
||||
|| window_size == 4
|
||||
|| window_size == 8
|
||||
|| window_size == 12)
|
||||
&& strcasecmp (suffix, ".tls") == 0)
|
||||
{
|
||||
switch (window_size)
|
||||
{
|
||||
case 0: orig_insn.opcode = xtensa_callx0_opcode; break;
|
||||
case 4: orig_insn.opcode = xtensa_callx4_opcode; break;
|
||||
case 8: orig_insn.opcode = xtensa_callx8_opcode; break;
|
||||
case 12: orig_insn.opcode = xtensa_callx12_opcode; break;
|
||||
}
|
||||
|
||||
if (num_args != 2)
|
||||
as_bad (_("wrong number of operands for '%s'"), opname);
|
||||
else
|
||||
{
|
||||
bfd_reloc_code_real_type reloc;
|
||||
char *old_input_line_pointer;
|
||||
expressionS *tok = &orig_insn.tls_reloc;
|
||||
segT t;
|
||||
|
||||
old_input_line_pointer = input_line_pointer;
|
||||
input_line_pointer = arg_strings[num_args - 1];
|
||||
|
||||
t = expression (tok);
|
||||
if (tok->X_op == O_symbol
|
||||
&& ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
|
||||
== BFD_RELOC_XTENSA_TLS_CALL))
|
||||
tok->X_op = map_suffix_reloc_to_operator (reloc);
|
||||
else
|
||||
as_bad (_("bad relocation expression for '%s'"), opname);
|
||||
|
||||
input_line_pointer = old_input_line_pointer;
|
||||
num_args -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (orig_insn.opcode == XTENSA_UNDEFINED)
|
||||
{
|
||||
xtensa_format fmt = xtensa_format_lookup (isa, opname);
|
||||
@ -5726,6 +5809,15 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
|
||||
fixP->fx_no_overflow = 0; /* Use the standard overflow check. */
|
||||
break;
|
||||
|
||||
case BFD_RELOC_XTENSA_TLSDESC_FN:
|
||||
case BFD_RELOC_XTENSA_TLSDESC_ARG:
|
||||
case BFD_RELOC_XTENSA_TLS_TPOFF:
|
||||
case BFD_RELOC_XTENSA_TLS_DTPOFF:
|
||||
S_SET_THREAD_LOCAL (fixP->fx_addsy);
|
||||
md_number_to_chars (fixpos, 0, fixP->fx_size);
|
||||
fixP->fx_no_overflow = 0; /* Use the standard overflow check. */
|
||||
break;
|
||||
|
||||
case BFD_RELOC_XTENSA_SLOT0_OP:
|
||||
case BFD_RELOC_XTENSA_SLOT1_OP:
|
||||
case BFD_RELOC_XTENSA_SLOT2_OP:
|
||||
@ -5766,6 +5858,9 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
|
||||
break;
|
||||
|
||||
case BFD_RELOC_XTENSA_ASM_EXPAND:
|
||||
case BFD_RELOC_XTENSA_TLS_FUNC:
|
||||
case BFD_RELOC_XTENSA_TLS_ARG:
|
||||
case BFD_RELOC_XTENSA_TLS_CALL:
|
||||
case BFD_RELOC_XTENSA_SLOT0_ALT:
|
||||
case BFD_RELOC_XTENSA_SLOT1_ALT:
|
||||
case BFD_RELOC_XTENSA_SLOT2_ALT:
|
||||
@ -6663,7 +6758,11 @@ emit_single_op (TInsn *orig_insn)
|
||||
|| orig_insn->opcode == xtensa_movi_n_opcode)
|
||||
&& !cur_vinsn.inside_bundle
|
||||
&& (orig_insn->tok[1].X_op == O_symbol
|
||||
|| orig_insn->tok[1].X_op == O_pltrel)
|
||||
|| orig_insn->tok[1].X_op == O_pltrel
|
||||
|| orig_insn->tok[1].X_op == O_tlsfunc
|
||||
|| orig_insn->tok[1].X_op == O_tlsarg
|
||||
|| orig_insn->tok[1].X_op == O_tpoff
|
||||
|| orig_insn->tok[1].X_op == O_dtpoff)
|
||||
&& !orig_insn->is_specific_opcode && use_transform ())
|
||||
xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
|
||||
else
|
||||
@ -9527,7 +9626,7 @@ convert_frag_immed (segT segP,
|
||||
/* Add a fixup. */
|
||||
target_seg = S_GET_SEGMENT (lit_sym);
|
||||
assert (target_seg);
|
||||
reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op);
|
||||
reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op, TRUE);
|
||||
fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
|
||||
&tinsn->tok[0], FALSE, reloc_type);
|
||||
break;
|
||||
@ -11527,12 +11626,29 @@ vinsn_to_insnbuf (vliw_insn *vinsn,
|
||||
for (slot = 0; slot < vinsn->num_slots; slot++)
|
||||
{
|
||||
TInsn *tinsn = &vinsn->slots[slot];
|
||||
expressionS *tls_reloc = &tinsn->tls_reloc;
|
||||
bfd_boolean tinsn_has_fixup =
|
||||
tinsn_to_slotbuf (vinsn->format, slot, tinsn,
|
||||
vinsn->slotbuf[slot]);
|
||||
|
||||
xtensa_format_set_slot (isa, fmt, slot,
|
||||
insnbuf, vinsn->slotbuf[slot]);
|
||||
if (tls_reloc->X_op != O_illegal)
|
||||
{
|
||||
if (vinsn->num_slots != 1)
|
||||
as_bad (_("TLS relocation not allowed in FLIX bundle"));
|
||||
else if (record_fixup)
|
||||
/* Instructions that generate TLS relocations should always be
|
||||
relaxed in the front-end. If "record_fixup" is set, then this
|
||||
function is being called during back-end relaxation, so flag
|
||||
the unexpected behavior as an error. */
|
||||
as_bad (_("unexpected TLS relocation"));
|
||||
else
|
||||
fix_new (fragP, frag_offset - fragP->fr_literal,
|
||||
xtensa_format_length (isa, fmt),
|
||||
tls_reloc->X_add_symbol, tls_reloc->X_add_number,
|
||||
FALSE, map_operator_to_reloc (tls_reloc->X_op, FALSE));
|
||||
}
|
||||
if (tinsn_has_fixup)
|
||||
{
|
||||
int i;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Declarations for stacks of tokenized Xtensa instructions.
|
||||
Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GAS, the GNU Assembler.
|
||||
|
||||
@ -49,6 +49,8 @@ typedef struct tinsn_struct
|
||||
bfd_boolean loc_directive_seen;
|
||||
struct dwarf2_line_info debug_line;
|
||||
|
||||
expressionS tls_reloc;
|
||||
|
||||
/* Filled out by relaxation_requirements: */
|
||||
enum xtensa_relax_statesE subtype;
|
||||
int literal_space;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Table of relaxations for Xtensa assembly.
|
||||
Copyright 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GAS, the GNU Assembler.
|
||||
|
||||
@ -645,13 +645,13 @@ append_op (BuildInstr *bi, BuildOp *b_op)
|
||||
|
||||
|
||||
static void
|
||||
append_literal_op (BuildInstr *bi, unsigned op1)
|
||||
append_literal_op (BuildInstr *bi, unsigned op1, unsigned src_op)
|
||||
{
|
||||
BuildOp *b_op = (BuildOp *) xmalloc (sizeof (BuildOp));
|
||||
|
||||
b_op->op_num = op1;
|
||||
b_op->typ = OP_LITERAL;
|
||||
b_op->op_data = 0;
|
||||
b_op->op_data = src_op;
|
||||
b_op->next = NULL;
|
||||
append_op (bi, b_op);
|
||||
}
|
||||
@ -1594,6 +1594,7 @@ build_transition (insn_pattern *initial_insn,
|
||||
TransitionRule *tr = NULL;
|
||||
xtensa_opcode opcode;
|
||||
xtensa_isa isa = xtensa_default_isa;
|
||||
BuildInstr *literal_bi;
|
||||
|
||||
opname_map_e *op1;
|
||||
opname_map_e *op2;
|
||||
@ -1706,6 +1707,7 @@ build_transition (insn_pattern *initial_insn,
|
||||
can be used before they are defined. Also there are a number of
|
||||
special operands (e.g., HI24S). */
|
||||
|
||||
literal_bi = NULL;
|
||||
for (r = replace_insns->head; r != NULL; r = r->next)
|
||||
{
|
||||
BuildInstr *bi;
|
||||
@ -1730,6 +1732,7 @@ build_transition (insn_pattern *initial_insn,
|
||||
bi->typ = INSTR_LITERAL_DEF;
|
||||
if (operand_count != 1)
|
||||
as_fatal (_("expected one operand for generated literal"));
|
||||
literal_bi = bi;
|
||||
}
|
||||
else if (strcmp (opcode_name, "LABEL") == 0)
|
||||
{
|
||||
@ -1768,7 +1771,13 @@ build_transition (insn_pattern *initial_insn,
|
||||
if (op_is_constant (op))
|
||||
append_constant_op (bi, op->operand_num, op_get_constant (op));
|
||||
else if (strcmp (op->operand_name, "%LITERAL") == 0)
|
||||
append_literal_op (bi, op->operand_num);
|
||||
{
|
||||
if (! literal_bi || ! literal_bi->ops || literal_bi->ops->next)
|
||||
as_fatal (_("opcode '%s': cannot find literal definition"),
|
||||
opcode_name);
|
||||
append_literal_op (bi, op->operand_num,
|
||||
literal_bi->ops->op_data);
|
||||
}
|
||||
else if (strcmp (op->operand_name, "%LABEL") == 0)
|
||||
append_label_op (bi, op->operand_num);
|
||||
else if (op->operand_name[0] == 'a'
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Table of relaxations for Xtensa assembly.
|
||||
Copyright 2003, 2004, 2007 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GAS, the GNU Assembler.
|
||||
|
||||
@ -135,7 +135,9 @@ struct build_op
|
||||
OPERAND: op_data is the field in the
|
||||
source instruction to take the value from
|
||||
and encode in the op_num field here.
|
||||
LITERAL or LABEL: unused. */
|
||||
LITERAL: op_data is field in the source
|
||||
instruction that is stored in the literal.
|
||||
LABEL: unused. */
|
||||
BuildOp *next;
|
||||
};
|
||||
|
||||
|
@ -1,3 +1,9 @@
|
||||
2008-08-20 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* xtensa.h (R_XTENSA_TLSDESC_FN, R_XTENSA_TLSDESC_ARG)
|
||||
(R_XTENSA_TLS_DTPOFF, R_XTENSA_TLS_TPOFF, R_XTENSA_TLS_FUNC)
|
||||
(R_XTENSA_TLS_ARG, R_XTENSA_TLS_CALL): New.
|
||||
|
||||
2008-08-08 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
Daniel Jacobowitz <dan@codesourcery.com>
|
||||
Catherine Moore <clm@codesourcery.com>
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Xtensa ELF support for BFD.
|
||||
Copyright 2003, 2004, 2007 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
|
||||
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
@ -76,6 +76,13 @@ START_RELOC_NUMBERS (elf_xtensa_reloc_type)
|
||||
RELOC_NUMBER (R_XTENSA_SLOT12_ALT, 47)
|
||||
RELOC_NUMBER (R_XTENSA_SLOT13_ALT, 48)
|
||||
RELOC_NUMBER (R_XTENSA_SLOT14_ALT, 49)
|
||||
RELOC_NUMBER (R_XTENSA_TLSDESC_FN, 50)
|
||||
RELOC_NUMBER (R_XTENSA_TLSDESC_ARG, 51)
|
||||
RELOC_NUMBER (R_XTENSA_TLS_DTPOFF, 52)
|
||||
RELOC_NUMBER (R_XTENSA_TLS_TPOFF, 53)
|
||||
RELOC_NUMBER (R_XTENSA_TLS_FUNC, 54)
|
||||
RELOC_NUMBER (R_XTENSA_TLS_ARG, 55)
|
||||
RELOC_NUMBER (R_XTENSA_TLS_CALL, 56)
|
||||
END_RELOC_NUMBERS (R_XTENSA_max)
|
||||
|
||||
/* Processor-specific flags for the ELF header e_flags field. */
|
||||
|
65
ld/testsuite/ld-xtensa/tlsbin.dd
Normal file
65
ld/testsuite/ld-xtensa/tlsbin.dd
Normal file
@ -0,0 +1,65 @@
|
||||
#source: tlsbin.s
|
||||
#as:
|
||||
#ld: -melf32xtensa
|
||||
#objdump: -drj.text --start-address=0x400238
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
.*: +file format elf32-xtensa-.e
|
||||
|
||||
Disassembly of section \.text:
|
||||
|
||||
0+400238 <_start>:
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+entry a1, 32
|
||||
# GD -> IE because variable is not defined in executable
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 4001ec <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# GD -> IE because variable is not defined in executable where
|
||||
# the variable is referenced through IE too
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 4001f4 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# GD -> LE with global variable defined in executable
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 4001fc <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# GD -> LE with local variable defined in executable
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 400204 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# GD -> LE with hidden variable defined in executable
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 40020c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# LD -> LE
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+nop.*
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+nop.*
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a10
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 400218 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 40021c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
|
||||
# LD -> LE against hidden variables
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 400220 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 400224 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
|
||||
#
|
||||
# IE against global var
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a2
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a3, 400228 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a3, a3, a2
|
||||
# IE -> LE against global var defined in exec
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a4
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a5, 40022c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a5, a5, a4
|
||||
# IE -> LE against local var
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a6
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a7, 400230 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a7, a7, a6
|
||||
# IE -> LE against hidden var
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a9, 400234 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a9, a9, a8
|
||||
#
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+retw.*
|
118
ld/testsuite/ld-xtensa/tlsbin.rd
Normal file
118
ld/testsuite/ld-xtensa/tlsbin.rd
Normal file
@ -0,0 +1,118 @@
|
||||
#source: tlsbin.s
|
||||
#as:
|
||||
#ld: -melf32xtensa
|
||||
#readelf: -WSsrl
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
|
||||
|
||||
Section Headers:
|
||||
\[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
|
||||
+\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
|
||||
+\[[ 0-9]+\] .interp +.*
|
||||
+\[[ 0-9]+\] .hash +.*
|
||||
+\[[ 0-9]+\] .dynsym +.*
|
||||
+\[[ 0-9]+\] .dynstr +.*
|
||||
+\[[ 0-9]+\] .rela.dyn +.*
|
||||
+\[[ 0-9]+\] .text +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +AX +0 +0 +4
|
||||
+\[[ 0-9]+\] .got.loc +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +A +0 +0 +4
|
||||
+\[[ 0-9]+\] .tdata +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WAT +0 +0 +4
|
||||
+\[[ 0-9]+\] .dynamic +DYNAMIC +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 08 +WA +4 +0 +4
|
||||
+\[[ 0-9]+\] .got +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WA +0 +0 +4
|
||||
+\[[ 0-9]+\] .xt.lit +PROGBITS +0+ .*
|
||||
+\[[ 0-9]+\] .xt.prop +PROGBITS +0+ .*
|
||||
+\[[ 0-9]+\] .xtensa.info +NOTE +0+ .*
|
||||
+\[[ 0-9]+\] .shstrtab +.*
|
||||
+\[[ 0-9]+\] .symtab +.*
|
||||
+\[[ 0-9]+\] .strtab +.*
|
||||
Key to Flags:
|
||||
.*
|
||||
.*
|
||||
.*
|
||||
|
||||
Elf file type is EXEC \(Executable file\)
|
||||
Entry point 0x[0-9a-f]+
|
||||
There are [0-9]+ program headers, starting at offset [0-9]+
|
||||
|
||||
Program Headers:
|
||||
Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
|
||||
PHDR.*
|
||||
INTERP.*
|
||||
.*Requesting program interpreter.*
|
||||
LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x1000
|
||||
LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW 0x1000
|
||||
DYNAMIC +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW +0x4
|
||||
TLS +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R +0x4
|
||||
|
||||
Section to Segment mapping:
|
||||
Segment Sections...
|
||||
00 *
|
||||
01 +.interp *
|
||||
02 +.interp .hash .dynsym .dynstr .rela.dyn .text .got.loc *
|
||||
03 +.tdata .dynamic .got *
|
||||
04 +.dynamic *
|
||||
05 +.tdata *
|
||||
|
||||
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 3 entries:
|
||||
+Offset +Info +Type +Sym\. Value Symbol's Name \+ Addend
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+ +sG1 \+ 0
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+ +sG2 \+ 0
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+ +sG2 \+ 0
|
||||
|
||||
Symbol table '\.dynsym' contains [0-9]+ entries:
|
||||
+Num: +Value +Size Type +Bind +Vis +Ndx Name
|
||||
+[0-9]+: 0+ +0 NOTYPE LOCAL DEFAULT UND *
|
||||
+[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT UND sG2
|
||||
+[0-9]+: 0+[0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
|
||||
+[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT UND sG1
|
||||
+[0-9]+: 0+[0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
|
||||
+[0-9]+: 0+[0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
|
||||
|
||||
Symbol table '\.symtab' contains [0-9]+ entries:
|
||||
+Num: +Value +Size Type +Bind +Vis +Ndx Name
|
||||
+[0-9]+: 0+ +0 NOTYPE LOCAL DEFAULT UND *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +1 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +2 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +3 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +4 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +5 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +6 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +7 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +8 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +9 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +10 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +11 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +12 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +13 *
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl1
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl2
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl3
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl4
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl5
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl6
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl7
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +LOCAL DEFAULT +8 sl8
|
||||
+[0-9]+: 0+ +0 TLS +LOCAL HIDDEN +8 _TLS_MODULE_BASE_
|
||||
+[0-9]+: [0-9a-f]+ +0 OBJECT +LOCAL +HIDDEN +9 _DYNAMIC
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg8
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg3
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh3
|
||||
+[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT UND sG2
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg4
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg5
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh7
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh8
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg1
|
||||
+[0-9]+: [0-9a-f]+ +0 FUNC +GLOBAL DEFAULT +6 _start
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh4
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh5
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg2
|
||||
+[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT UND sG1
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh1
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg6
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL DEFAULT +8 sg7
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh2
|
||||
+[0-9]+: [0-9a-f]+ +0 TLS +GLOBAL HIDDEN +8 sh6
|
98
ld/testsuite/ld-xtensa/tlsbin.s
Normal file
98
ld/testsuite/ld-xtensa/tlsbin.s
Normal file
@ -0,0 +1,98 @@
|
||||
.section ".tdata", "awT", @progbits
|
||||
.global sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
|
||||
.global sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
|
||||
.hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
|
||||
.align 4
|
||||
sg1: .long 17
|
||||
sg2: .long 18
|
||||
sg3: .long 19
|
||||
sg4: .long 20
|
||||
sg5: .long 21
|
||||
sg6: .long 22
|
||||
sg7: .long 23
|
||||
sg8: .long 24
|
||||
sl1: .long 65
|
||||
sl2: .long 66
|
||||
sl3: .long 67
|
||||
sl4: .long 68
|
||||
sl5: .long 69
|
||||
sl6: .long 70
|
||||
sl7: .long 71
|
||||
sl8: .long 72
|
||||
sh1: .long 157
|
||||
sh2: .long 158
|
||||
sh3: .long 159
|
||||
sh4: .long 160
|
||||
sh5: .long 161
|
||||
sh6: .long 162
|
||||
sh7: .long 163
|
||||
sh8: .long 164
|
||||
|
||||
.text
|
||||
.global _start
|
||||
.type _start, @function
|
||||
_start:
|
||||
entry sp, 32
|
||||
|
||||
/* GD -> IE because variable is not defined in executable */
|
||||
movi a8, sG1@tlsfunc
|
||||
movi a10, sG1@tlsarg
|
||||
callx8.tls a8, sG1@tlscall
|
||||
|
||||
/* GD -> IE because variable is not defined in executable where
|
||||
the variable is referenced through IE too */
|
||||
movi a8, sG2@tlsfunc
|
||||
movi a10, sG2@tlsarg
|
||||
callx8.tls a8, sG2@tlscall
|
||||
|
||||
/* GD -> LE with global variable defined in executable */
|
||||
movi a8, sg1@tlsfunc
|
||||
movi a10, sg1@tlsarg
|
||||
callx8.tls a8, sg1@tlscall
|
||||
|
||||
/* GD -> LE with local variable defined in executable */
|
||||
movi a8, sl1@tlsfunc
|
||||
movi a10, sl1@tlsarg
|
||||
callx8.tls a8, sl1@tlscall
|
||||
|
||||
/* GD -> LE with hidden variable defined in executable */
|
||||
movi a8, sh1@tlsfunc
|
||||
movi a10, sh1@tlsarg
|
||||
callx8.tls a8, sh1@tlscall
|
||||
|
||||
/* LD -> LE */
|
||||
movi a8, _TLS_MODULE_BASE_@tlsfunc
|
||||
movi a10, _TLS_MODULE_BASE_@tlsarg
|
||||
callx8.tls a8, _TLS_MODULE_BASE_@tlscall
|
||||
movi a12, 1+sl1@dtpoff
|
||||
add a12, a12, a10
|
||||
movi a13, sl2@dtpoff+2
|
||||
add a13, a13, a10
|
||||
|
||||
/* LD -> LE against hidden variables */
|
||||
movi a12, sh1@dtpoff
|
||||
add a12, a12, a10
|
||||
movi a13, 3+sh2@dtpoff
|
||||
add a13, a13, a10
|
||||
|
||||
/* IE against global var */
|
||||
rur a2, THREADPTR
|
||||
movi a3, sG2@tpoff
|
||||
add a3, a3, a2
|
||||
|
||||
/* IE -> LE against global var defined in exec */
|
||||
rur a4, THREADPTR
|
||||
movi a5, sg1@tpoff
|
||||
add a5, a5, a4
|
||||
|
||||
/* IE -> LE against local var */
|
||||
rur a6, THREADPTR
|
||||
movi a7, sl1@tpoff
|
||||
add a7, a7, a6
|
||||
|
||||
/* IE -> LE against hidden var */
|
||||
rur a8, THREADPTR
|
||||
movi a9, sh1@tpoff
|
||||
add a9, a9, a8
|
||||
|
||||
retw
|
14
ld/testsuite/ld-xtensa/tlsbin.sd
Normal file
14
ld/testsuite/ld-xtensa/tlsbin.sd
Normal file
@ -0,0 +1,14 @@
|
||||
#source: tlsbin.s
|
||||
#as:
|
||||
#ld: -melf32xtensa
|
||||
#objdump: -sj.text --stop-address=0x400238
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
.*: +file format elf32-xtensa-.e
|
||||
|
||||
Contents of section .text:
|
||||
*[0-9a-f]+ 0+ 0+ 0+ 0+ .*
|
||||
*[0-9a-f]+ 0+ 0*080* 0+ 0*280* .*
|
||||
*[0-9a-f]+ 0+ 0*480* 0+ 0*080* .*
|
||||
*[0-9a-f]+ 0*290* 0*2e0* 0*480* 0*4f0* .*
|
||||
*[0-9a-f]+ 0+ 0*080* 0*280* 0*480* .*
|
14
ld/testsuite/ld-xtensa/tlsbin.td
Normal file
14
ld/testsuite/ld-xtensa/tlsbin.td
Normal file
@ -0,0 +1,14 @@
|
||||
#source: tlsbin.s
|
||||
#ld: -melf32xtensa
|
||||
#objdump: -sj.tdata
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
.*: +file format elf32-xtensa-.e
|
||||
|
||||
Contents of section .tdata:
|
||||
*[0-9a-f]+ 0*110* 0*120* 0*130* 0*140* .*
|
||||
*[0-9a-f]+ 0*150* 0*160* 0*170* 0*180* .*
|
||||
*[0-9a-f]+ 0*410* 0*420* 0*430* 0*440* .*
|
||||
*[0-9a-f]+ 0*450* 0*460* 0*470* 0*480* .*
|
||||
*[0-9a-f]+ 0*9d0* 0*9e0* 0*9f0* 0*a00* .*
|
||||
*[0-9a-f]+ 0*a10* 0*a20* 0*a30* 0*a40* .*
|
18
ld/testsuite/ld-xtensa/tlslib.s
Normal file
18
ld/testsuite/ld-xtensa/tlslib.s
Normal file
@ -0,0 +1,18 @@
|
||||
.section ".tdata", "awT", @progbits
|
||||
.global sG1, sG2, sG3, sG4, sG5, sG6, sG7, sG8
|
||||
sG1: .long 513
|
||||
sG2: .long 514
|
||||
sG3: .long 515
|
||||
sG4: .long 516
|
||||
sG5: .long 517
|
||||
sG6: .long 518
|
||||
sG7: .long 519
|
||||
sG8: .long 520
|
||||
|
||||
.text
|
||||
/* Dummy. */
|
||||
.global __tls_get_addr
|
||||
.type __tls_get_addr, @function
|
||||
__tls_get_addr:
|
||||
entry sp, 16
|
||||
retw
|
81
ld/testsuite/ld-xtensa/tlspic.dd
Normal file
81
ld/testsuite/ld-xtensa/tlspic.dd
Normal file
@ -0,0 +1,81 @@
|
||||
#source: tlspic1.s
|
||||
#source: tlspic2.s
|
||||
#as:
|
||||
#ld: -shared -melf32xtensa
|
||||
#objdump: -drj.text --start-address=0x350
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
.*: +file format elf32-xtensa-.e
|
||||
|
||||
Disassembly of section \.text:
|
||||
|
||||
0+350 <_start>:
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+entry a1, 32
|
||||
# GD
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 2e0 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2e4 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
|
||||
# GD -> IE because variable is referenced through IE too
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2ec <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# GD against local variable
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 2f0 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2f4 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
|
||||
# GD -> IE against local variable referenced through IE too
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2fc <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# GD against hidden and local variable
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 300 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 304 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
|
||||
# GD -> IE against hidden and local variable referenced through IE too
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 30c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# GD against hidden but not local variable
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 310 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 314 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
|
||||
# GD -> IE against hidden but not local variable referenced through IE too
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 31c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
|
||||
# LD
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 320 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 324 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 328 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 32c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
|
||||
# LD against hidden and local variables
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 330 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 334 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
|
||||
# LD against hidden but not local variables
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 338 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 33c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
|
||||
# IE against global var
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a2
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a3, 340 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a3, a3, a2
|
||||
# IE against local var
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a4
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a5, 344 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a5, a5, a4
|
||||
# IE against hidden and local var
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a6
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a7, 348 <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a7, a7, a6
|
||||
# IE against hidden but not local var
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+l32r a9, 34c <.*>
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+add.* a9, a9, a8
|
||||
#
|
||||
[0-9a-f]+: [0-9a-f]+[ ]+retw.*
|
142
ld/testsuite/ld-xtensa/tlspic.rd
Normal file
142
ld/testsuite/ld-xtensa/tlspic.rd
Normal file
@ -0,0 +1,142 @@
|
||||
#source: tlspic1.s
|
||||
#source: tlspic2.s
|
||||
#as:
|
||||
#ld: -shared -melf32xtensa
|
||||
#readelf: -WSsrl
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
|
||||
|
||||
Section Headers:
|
||||
\[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
|
||||
+\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
|
||||
+\[[ 0-9]+\] .hash +.*
|
||||
+\[[ 0-9]+\] .dynsym +.*
|
||||
+\[[ 0-9]+\] .dynstr +.*
|
||||
+\[[ 0-9]+\] .rela.dyn +.*
|
||||
+\[[ 0-9]+\] .text +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +AX +0 +0 +4
|
||||
+\[[ 0-9]+\] .got.loc +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +A +0 +0 +4
|
||||
+\[[ 0-9]+\] .tdata +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WAT +0 +0 +4
|
||||
+\[[ 0-9]+\] .tbss +NOBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WAT +0 +0 +4
|
||||
+\[[ 0-9]+\] .dynamic +DYNAMIC +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 08 +WA +3 +0 +4
|
||||
+\[[ 0-9]+\] .got +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WA +0 +0 +4
|
||||
+\[[ 0-9]+\] .xt.lit +PROGBITS +0+ .*
|
||||
+\[[ 0-9]+\] .xt.prop +PROGBITS +0+ .*
|
||||
+\[[ 0-9]+\] .xtensa.info +NOTE +0+ .*
|
||||
+\[[ 0-9]+\] .shstrtab +.*
|
||||
+\[[ 0-9]+\] .symtab +.*
|
||||
+\[[ 0-9]+\] .strtab +.*
|
||||
Key to Flags:
|
||||
.*
|
||||
.*
|
||||
.*
|
||||
|
||||
Elf file type is DYN \(Shared object file\)
|
||||
Entry point 0x[0-9a-f]+
|
||||
There are [0-9]+ program headers, starting at offset [0-9]+
|
||||
|
||||
Program Headers:
|
||||
Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
|
||||
LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x1000
|
||||
LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW 0x1000
|
||||
DYNAMIC +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW +0x4
|
||||
TLS +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R +0x4
|
||||
|
||||
Section to Segment mapping:
|
||||
Segment Sections...
|
||||
00 +.hash .dynsym .dynstr .rela.dyn .text .got.loc *
|
||||
01 +.tdata .dynamic .got *
|
||||
02 +.dynamic *
|
||||
03 +.tdata .tbss *
|
||||
|
||||
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 18 entries:
|
||||
+Offset +Info +Type +Sym\. Value Symbol's Name \+ Addend
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_FN +0+ +sg1 \+ 0
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+ +sg1 \+ 0
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+4 +sg2 \+ 0
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+4 +sg2 \+ 0
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_FN +0+20
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+20
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+24
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_FN +0+40
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+40
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+44
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_FN +0+60
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+60
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+64
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_FN +0+
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+24
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+44
|
||||
[0-9a-f]+ [0-9a-f]+ R_XTENSA_TLS_TPOFF +0+64
|
||||
|
||||
Symbol table '\.dynsym' contains [0-9]+ entries:
|
||||
+Num: +Value +Size Type +Bind +Vis +Ndx Name
|
||||
+[0-9]+: 0+ +0 NOTYPE LOCAL DEFAULT UND *
|
||||
+[0-9]+: 0+1c +0 TLS +GLOBAL DEFAULT +7 sg8
|
||||
+[0-9]+: 0+8 +0 TLS +GLOBAL DEFAULT +7 sg3
|
||||
+[0-9]+: 0+c +0 TLS +GLOBAL DEFAULT +7 sg4
|
||||
+[0-9]+: 0+10 +0 TLS +GLOBAL DEFAULT +7 sg5
|
||||
+[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT +7 sg1
|
||||
+[0-9]+: 0+350 +0 FUNC +GLOBAL DEFAULT +5 _start
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
|
||||
+[0-9]+: 0+4 +0 TLS +GLOBAL DEFAULT +7 sg2
|
||||
+[0-9]+: 0+14 +0 TLS +GLOBAL DEFAULT +7 sg6
|
||||
+[0-9]+: 0+18 +0 TLS +GLOBAL DEFAULT +7 sg7
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
|
||||
|
||||
Symbol table '\.symtab' contains [0-9]+ entries:
|
||||
+Num: +Value +Size Type +Bind +Vis +Ndx Name
|
||||
+[0-9]+: 0+ +0 NOTYPE LOCAL DEFAULT UND *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +1 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +2 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +3 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +4 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +5 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +6 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +7 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +8 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +9 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +10 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +11 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +12 *
|
||||
+[0-9]+: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +13 *
|
||||
+[0-9]+: 0+20 +0 TLS +LOCAL DEFAULT +7 sl1
|
||||
+[0-9]+: 0+24 +0 TLS +LOCAL DEFAULT +7 sl2
|
||||
+[0-9]+: 0+28 +0 TLS +LOCAL DEFAULT +7 sl3
|
||||
+[0-9]+: 0+2c +0 TLS +LOCAL DEFAULT +7 sl4
|
||||
+[0-9]+: 0+30 +0 TLS +LOCAL DEFAULT +7 sl5
|
||||
+[0-9]+: 0+34 +0 TLS +LOCAL DEFAULT +7 sl6
|
||||
+[0-9]+: 0+38 +0 TLS +LOCAL DEFAULT +7 sl7
|
||||
+[0-9]+: 0+3c +0 TLS +LOCAL DEFAULT +7 sl8
|
||||
+[0-9]+: 0+60 +0 TLS +LOCAL HIDDEN +8 sH1
|
||||
+[0-9]+: 0+ +0 TLS +LOCAL HIDDEN +7 _TLS_MODULE_BASE_
|
||||
+[0-9]+: 0+144c +0 OBJECT LOCAL HIDDEN ABS _DYNAMIC
|
||||
+[0-9]+: 0+48 +0 TLS +LOCAL HIDDEN +7 sh3
|
||||
+[0-9]+: 0+64 +0 TLS +LOCAL HIDDEN +8 sH2
|
||||
+[0-9]+: 0+78 +0 TLS +LOCAL HIDDEN +8 sH7
|
||||
+[0-9]+: 0+58 +0 TLS +LOCAL HIDDEN +7 sh7
|
||||
+[0-9]+: 0+5c +0 TLS +LOCAL HIDDEN +7 sh8
|
||||
+[0-9]+: 0+6c +0 TLS +LOCAL HIDDEN +8 sH4
|
||||
+[0-9]+: 0+4c +0 TLS +LOCAL HIDDEN +7 sh4
|
||||
+[0-9]+: 0+68 +0 TLS +LOCAL HIDDEN +8 sH3
|
||||
+[0-9]+: 0+50 +0 TLS +LOCAL HIDDEN +7 sh5
|
||||
+[0-9]+: 0+70 +0 TLS +LOCAL HIDDEN +8 sH5
|
||||
+[0-9]+: 0+74 +0 TLS +LOCAL HIDDEN +8 sH6
|
||||
+[0-9]+: 0+7c +0 TLS +LOCAL HIDDEN +8 sH8
|
||||
+[0-9]+: 0+40 +0 TLS +LOCAL HIDDEN +7 sh1
|
||||
+[0-9]+: 0+44 +0 TLS +LOCAL HIDDEN +7 sh2
|
||||
+[0-9]+: 0+54 +0 TLS +LOCAL HIDDEN +7 sh6
|
||||
+[0-9]+: 0+1c +0 TLS +GLOBAL DEFAULT +7 sg8
|
||||
+[0-9]+: 0+8 +0 TLS +GLOBAL DEFAULT +7 sg3
|
||||
+[0-9]+: 0+c +0 TLS +GLOBAL DEFAULT +7 sg4
|
||||
+[0-9]+: 0+10 +0 TLS +GLOBAL DEFAULT +7 sg5
|
||||
+[0-9]+: 0+ +0 TLS +GLOBAL DEFAULT +7 sg1
|
||||
+[0-9]+: 0+350 +0 FUNC +GLOBAL DEFAULT +5 _start
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
|
||||
+[0-9]+: 0+4 +0 TLS +GLOBAL DEFAULT +7 sg2
|
||||
+[0-9]+: 0+14 +0 TLS +GLOBAL DEFAULT +7 sg6
|
||||
+[0-9]+: 0+18 +0 TLS +GLOBAL DEFAULT +7 sg7
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
|
||||
+[0-9]+: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
|
17
ld/testsuite/ld-xtensa/tlspic.sd
Normal file
17
ld/testsuite/ld-xtensa/tlspic.sd
Normal file
@ -0,0 +1,17 @@
|
||||
#source: tlspic1.s
|
||||
#source: tlspic2.s
|
||||
#as:
|
||||
#ld: -shared -melf32xtensa
|
||||
#objdump: -sj.text --stop-address=0x350
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
.*: +file format elf32-xtensa-.e
|
||||
|
||||
Contents of section .text:
|
||||
0+2e0 0+ 0+ 0+ 0+ .*
|
||||
0+2f0 0+ 0+ 0+ 0+ .*
|
||||
0+300 0+ 0+ 0+ 0+ .*
|
||||
0+310 0+ 0+ 0+ 0+ .*
|
||||
0+320 0+ 0+ 0*200* 0*260* .*
|
||||
0+330 0*400* 0*470* 0*600* 0*650* .*
|
||||
0+340 0+ 0+ 0+ 0+ .*
|
16
ld/testsuite/ld-xtensa/tlspic.td
Normal file
16
ld/testsuite/ld-xtensa/tlspic.td
Normal file
@ -0,0 +1,16 @@
|
||||
#source: tlspic1.s
|
||||
#source: tlspic2.s
|
||||
#as:
|
||||
#ld: -shared -melf32xtensa
|
||||
#objdump: -sj.tdata
|
||||
#target: xtensa*-*-linux*
|
||||
|
||||
.*: +file format elf32-xtensa-.e
|
||||
|
||||
Contents of section .tdata:
|
||||
*[0-9a-f]+ 0*110* 0*120* 0*130* 0*140* .*
|
||||
*[0-9a-f]+ 0*150* 0*160* 0*170* 0*180* .*
|
||||
*[0-9a-f]+ 0*410* 0*420* 0*430* 0*440* .*
|
||||
*[0-9a-f]+ 0*450* 0*460* 0*470* 0*480* .*
|
||||
*[0-9a-f]+ 0*9d0* 0*9e0* 0*9f0* 0*a00* .*
|
||||
*[0-9a-f]+ 0*a10* 0*a20* 0*a30* 0*a40* .*
|
120
ld/testsuite/ld-xtensa/tlspic1.s
Normal file
120
ld/testsuite/ld-xtensa/tlspic1.s
Normal file
@ -0,0 +1,120 @@
|
||||
.section ".tdata", "awT", @progbits
|
||||
.global sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
|
||||
.global sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
|
||||
.hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
|
||||
.align 4
|
||||
sg1: .long 17
|
||||
sg2: .long 18
|
||||
sg3: .long 19
|
||||
sg4: .long 20
|
||||
sg5: .long 21
|
||||
sg6: .long 22
|
||||
sg7: .long 23
|
||||
sg8: .long 24
|
||||
sl1: .long 65
|
||||
sl2: .long 66
|
||||
sl3: .long 67
|
||||
sl4: .long 68
|
||||
sl5: .long 69
|
||||
sl6: .long 70
|
||||
sl7: .long 71
|
||||
sl8: .long 72
|
||||
sh1: .long 157
|
||||
sh2: .long 158
|
||||
sh3: .long 159
|
||||
sh4: .long 160
|
||||
sh5: .long 161
|
||||
sh6: .long 162
|
||||
sh7: .long 163
|
||||
sh8: .long 164
|
||||
|
||||
.text
|
||||
.global _start
|
||||
.type _start, @function
|
||||
_start:
|
||||
entry sp, 32
|
||||
|
||||
/* GD */
|
||||
movi a8, sg1@tlsfunc
|
||||
movi a10, sg1@tlsarg
|
||||
callx8.tls a8, sg1@tlscall
|
||||
|
||||
/* GD -> IE because variable is referenced through IE too */
|
||||
movi a8, sg2@tlsfunc
|
||||
movi a10, sg2@tlsarg
|
||||
callx8.tls a8, sg2@tlscall
|
||||
|
||||
/* GD against local variable */
|
||||
movi a8, sl1@tlsfunc
|
||||
movi a10, sl1@tlsarg
|
||||
callx8.tls a8, sl1@tlscall
|
||||
|
||||
/* GD -> IE against local variable referenced through IE too */
|
||||
movi a8, sl2@tlsfunc
|
||||
movi a10, sl2@tlsarg
|
||||
callx8.tls a8, sl2@tlscall
|
||||
|
||||
/* GD against hidden and local variable */
|
||||
movi a8, sh1@tlsfunc
|
||||
movi a10, sh1@tlsarg
|
||||
callx8.tls a8, sh1@tlscall
|
||||
|
||||
/* GD -> IE against hidden and local variable referenced through
|
||||
IE too */
|
||||
movi a8, sh2@tlsfunc
|
||||
movi a10, sh2@tlsarg
|
||||
callx8.tls a8, sh2@tlscall
|
||||
|
||||
/* GD against hidden but not local variable */
|
||||
movi a8, sH1@tlsfunc
|
||||
movi a10, sH1@tlsarg
|
||||
callx8.tls a8, sH1@tlscall
|
||||
|
||||
/* GD -> IE against hidden but not local variable referenced through
|
||||
IE too */
|
||||
movi a8, sH2@tlsfunc
|
||||
movi a10, sH2@tlsarg
|
||||
callx8.tls a8, sH2@tlscall
|
||||
|
||||
/* LD */
|
||||
movi a8, _TLS_MODULE_BASE_@tlsfunc
|
||||
movi a10, _TLS_MODULE_BASE_@tlsarg
|
||||
callx8.tls a8, _TLS_MODULE_BASE_@tlscall
|
||||
movi a12, sl1@dtpoff
|
||||
add a12, a12, a10
|
||||
movi a13, 2+sl2@dtpoff
|
||||
add a13, a13, a10
|
||||
|
||||
/* LD against hidden and local variables */
|
||||
movi a12, sh1@dtpoff
|
||||
add a12, a12, a10
|
||||
movi a13, sh2@dtpoff+3
|
||||
add a13, a13, a10
|
||||
|
||||
/* LD against hidden but not local variables */
|
||||
movi a12, sH1@dtpoff
|
||||
add a12, a12, a10
|
||||
movi a13, sH2@dtpoff+1
|
||||
add a13, a13, a10
|
||||
|
||||
/* IE against global var */
|
||||
rur a2, THREADPTR
|
||||
movi a3, sg2@tpoff
|
||||
add a3, a3, a2
|
||||
|
||||
/* IE against local var */
|
||||
rur a4, THREADPTR
|
||||
movi a5, sl2@tpoff
|
||||
add a5, a5, a4
|
||||
|
||||
/* IE against hidden and local var */
|
||||
rur a6, THREADPTR
|
||||
movi a7, sh2@tpoff
|
||||
add a7, a7, a6
|
||||
|
||||
/* IE against hidden but not local var */
|
||||
rur a8, THREADPTR
|
||||
movi a9, sH2@tpoff
|
||||
add a9, a9, a8
|
||||
|
||||
retw
|
12
ld/testsuite/ld-xtensa/tlspic2.s
Normal file
12
ld/testsuite/ld-xtensa/tlspic2.s
Normal file
@ -0,0 +1,12 @@
|
||||
.section ".tbss", "awT", @nobits
|
||||
.global sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
|
||||
.hidden sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
|
||||
.align 4
|
||||
sH1: .space 4
|
||||
sH2: .space 4
|
||||
sH3: .space 4
|
||||
sH4: .space 4
|
||||
sH5: .space 4
|
||||
sH6: .space 4
|
||||
sH7: .space 4
|
||||
sH8: .space 4
|
54
ld/testsuite/ld-xtensa/xtensa.exp
Normal file
54
ld/testsuite/ld-xtensa/xtensa.exp
Normal file
@ -0,0 +1,54 @@
|
||||
# Expect script for ld-xtensa tests
|
||||
# Copyright (C) 2008 Free Software Foundation
|
||||
#
|
||||
# This file is part of the GNU Binutils.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
#
|
||||
|
||||
if { !([istarget "xtensa*-*-linux*"]) } {
|
||||
return
|
||||
}
|
||||
|
||||
# List contains test-items with 3 items followed by 2 lists:
|
||||
# 0:name 1:ld options 2:assembler options
|
||||
# 3:filenames of assembler files 4: action and options. 5: name of output file
|
||||
|
||||
# Actions:
|
||||
# objdump: Apply objdump options on result. Compare with regex (last arg).
|
||||
# nm: Apply nm options on result. Compare with regex (last arg).
|
||||
# readelf: Apply readelf options on result. Compare with regex (last arg).
|
||||
|
||||
set xtensatests {
|
||||
{"TLS -shared transitions"
|
||||
"-shared -melf32xtensa" "" {tlspic1.s tlspic2.s}
|
||||
{{readelf -WSsrl tlspic.rd}
|
||||
{objdump "-drj.text --start-address=0x350" tlspic.dd}
|
||||
{objdump "-sj.text --stop-address=0x350" tlspic.sd}
|
||||
{objdump -sj.tdata tlspic.td}}
|
||||
"libtlspic.so"}
|
||||
{"Helper shared library" "-shared -melf32xtensa"
|
||||
"" {tlslib.s} {} "libtlslib.so"}
|
||||
{"TLS exec transitions"
|
||||
"-melf32xtensa tmpdir/libtlslib.so" "" {tlsbin.s}
|
||||
{{readelf -WSsrl tlsbin.rd}
|
||||
{objdump "-drj.text --start-address=0x400238" tlsbin.dd}
|
||||
{objdump "-sj.text --stop-address=0x400238" tlsbin.sd}
|
||||
{objdump -sj.tdata tlsbin.td}}
|
||||
"tlsbin"}
|
||||
}
|
||||
|
||||
run_ld_link_tests $xtensatests
|
Loading…
Reference in New Issue
Block a user