mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 23:57:03 +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:
@ -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>
|
2008-08-18 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
* elfxx-mips.c (_bfd_mips_elf_copy_indirect_symbol): Copy MIPS16
|
* 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_EXPAND. */
|
||||||
BFD_RELOC_XTENSA_ASM_SIMPLIFY,
|
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). */
|
/* 8 bit signed offset in (ix+d) or (iy+d). */
|
||||||
BFD_RELOC_Z80_DISP8,
|
BFD_RELOC_Z80_DISP8,
|
||||||
|
|
||||||
|
@ -1418,6 +1418,7 @@ enum elf_object_id
|
|||||||
SH_ELF_TDATA,
|
SH_ELF_TDATA,
|
||||||
SPARC_ELF_TDATA,
|
SPARC_ELF_TDATA,
|
||||||
X86_64_ELF_TDATA,
|
X86_64_ELF_TDATA,
|
||||||
|
XTENSA_ELF_TDATA,
|
||||||
GENERIC_ELF_TDATA
|
GENERIC_ELF_TDATA
|
||||||
};
|
};
|
||||||
|
|
||||||
|
1000
bfd/elf32-xtensa.c
1000
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_OP2",
|
||||||
"BFD_RELOC_XTENSA_ASM_EXPAND",
|
"BFD_RELOC_XTENSA_ASM_EXPAND",
|
||||||
"BFD_RELOC_XTENSA_ASM_SIMPLIFY",
|
"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_Z80_DISP8",
|
||||||
"BFD_RELOC_Z8K_DISP7",
|
"BFD_RELOC_Z8K_DISP7",
|
||||||
"BFD_RELOC_Z8K_CALLR",
|
"BFD_RELOC_Z8K_CALLR",
|
||||||
|
18
bfd/reloc.c
18
bfd/reloc.c
@ -1,6 +1,6 @@
|
|||||||
/* BFD support for handling relocation entries.
|
/* BFD support for handling relocation entries.
|
||||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
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.
|
Free Software Foundation, Inc.
|
||||||
Written by Cygnus Support.
|
Written by Cygnus Support.
|
||||||
|
|
||||||
@ -5015,6 +5015,22 @@ ENUMDOC
|
|||||||
assembler-expanded instructions. This is commonly used
|
assembler-expanded instructions. This is commonly used
|
||||||
internally by the linker after analysis of a
|
internally by the linker after analysis of a
|
||||||
BFD_RELOC_XTENSA_ASM_EXPAND.
|
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
|
ENUM
|
||||||
BFD_RELOC_Z80_DISP8
|
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>
|
2008-08-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
AVX Programming Reference (August, 2008)
|
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_hi16 O_md2 /* use high 16 bits of symbolic value */
|
||||||
#define O_lo16 O_md3 /* use low 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_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
|
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 ("h", BFD_RELOC_HI16, O_hi16),
|
||||||
SUFFIX_MAP ("plt", BFD_RELOC_XTENSA_PLT, O_pltrel),
|
SUFFIX_MAP ("plt", BFD_RELOC_XTENSA_PLT, O_pltrel),
|
||||||
SUFFIX_MAP ("pcrel", BFD_RELOC_32_PCREL, O_pcrel),
|
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 }
|
{ (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))
|
else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
|
||||||
as_bad (_("%s relocations do not fit in %d bytes"),
|
as_bad (_("%s relocations do not fit in %d bytes"),
|
||||||
reloc_howto->name, nbytes);
|
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
|
else
|
||||||
{
|
{
|
||||||
char *p = frag_more ((int) nbytes);
|
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. */
|
/* Find the matching reloc type. */
|
||||||
static bfd_reloc_code_real_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;
|
struct suffix_reloc_map *sfx;
|
||||||
bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
|
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)
|
if (reloc == BFD_RELOC_UNUSED)
|
||||||
return BFD_RELOC_32;
|
return BFD_RELOC_32;
|
||||||
|
|
||||||
@ -3149,6 +3171,10 @@ xg_valid_literal_expression (const expressionS *exp)
|
|||||||
case O_subtract:
|
case O_subtract:
|
||||||
case O_pltrel:
|
case O_pltrel:
|
||||||
case O_pcrel:
|
case O_pcrel:
|
||||||
|
case O_tlsfunc:
|
||||||
|
case O_tlsarg:
|
||||||
|
case O_tpoff:
|
||||||
|
case O_dtpoff:
|
||||||
return TRUE;
|
return TRUE;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -3347,6 +3373,9 @@ xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
|
|||||||
case OP_LITERAL:
|
case OP_LITERAL:
|
||||||
sym = get_special_literal_symbol ();
|
sym = get_special_literal_symbol ();
|
||||||
set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
|
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;
|
break;
|
||||||
case OP_LABEL:
|
case OP_LABEL:
|
||||||
sym = get_special_label_symbol ();
|
sym = get_special_label_symbol ();
|
||||||
@ -4062,9 +4091,13 @@ xg_assemble_literal (/* const */ TInsn *insn)
|
|||||||
pcrel = TRUE;
|
pcrel = TRUE;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case O_pltrel:
|
case O_pltrel:
|
||||||
|
case O_tlsfunc:
|
||||||
|
case O_tlsarg:
|
||||||
|
case O_tpoff:
|
||||||
|
case O_dtpoff:
|
||||||
p = frag_more (litsize);
|
p = frag_more (litsize);
|
||||||
xtensa_set_frag_assembly_state (frag_now);
|
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)
|
if (emit_val->X_add_symbol)
|
||||||
emit_val->X_op = O_symbol;
|
emit_val->X_op = O_symbol;
|
||||||
else
|
else
|
||||||
@ -5310,8 +5343,58 @@ md_assemble (char *str)
|
|||||||
orig_insn.insn_type = ITYPE_INSN;
|
orig_insn.insn_type = ITYPE_INSN;
|
||||||
orig_insn.ntok = 0;
|
orig_insn.ntok = 0;
|
||||||
orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
|
orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
|
||||||
|
|
||||||
orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
|
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)
|
if (orig_insn.opcode == XTENSA_UNDEFINED)
|
||||||
{
|
{
|
||||||
xtensa_format fmt = xtensa_format_lookup (isa, opname);
|
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. */
|
fixP->fx_no_overflow = 0; /* Use the standard overflow check. */
|
||||||
break;
|
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_SLOT0_OP:
|
||||||
case BFD_RELOC_XTENSA_SLOT1_OP:
|
case BFD_RELOC_XTENSA_SLOT1_OP:
|
||||||
case BFD_RELOC_XTENSA_SLOT2_OP:
|
case BFD_RELOC_XTENSA_SLOT2_OP:
|
||||||
@ -5766,6 +5858,9 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BFD_RELOC_XTENSA_ASM_EXPAND:
|
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_SLOT0_ALT:
|
||||||
case BFD_RELOC_XTENSA_SLOT1_ALT:
|
case BFD_RELOC_XTENSA_SLOT1_ALT:
|
||||||
case BFD_RELOC_XTENSA_SLOT2_ALT:
|
case BFD_RELOC_XTENSA_SLOT2_ALT:
|
||||||
@ -6663,7 +6758,11 @@ emit_single_op (TInsn *orig_insn)
|
|||||||
|| orig_insn->opcode == xtensa_movi_n_opcode)
|
|| orig_insn->opcode == xtensa_movi_n_opcode)
|
||||||
&& !cur_vinsn.inside_bundle
|
&& !cur_vinsn.inside_bundle
|
||||||
&& (orig_insn->tok[1].X_op == O_symbol
|
&& (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 ())
|
&& !orig_insn->is_specific_opcode && use_transform ())
|
||||||
xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
|
xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
|
||||||
else
|
else
|
||||||
@ -9527,7 +9626,7 @@ convert_frag_immed (segT segP,
|
|||||||
/* Add a fixup. */
|
/* Add a fixup. */
|
||||||
target_seg = S_GET_SEGMENT (lit_sym);
|
target_seg = S_GET_SEGMENT (lit_sym);
|
||||||
assert (target_seg);
|
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,
|
fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
|
||||||
&tinsn->tok[0], FALSE, reloc_type);
|
&tinsn->tok[0], FALSE, reloc_type);
|
||||||
break;
|
break;
|
||||||
@ -11527,12 +11626,29 @@ vinsn_to_insnbuf (vliw_insn *vinsn,
|
|||||||
for (slot = 0; slot < vinsn->num_slots; slot++)
|
for (slot = 0; slot < vinsn->num_slots; slot++)
|
||||||
{
|
{
|
||||||
TInsn *tinsn = &vinsn->slots[slot];
|
TInsn *tinsn = &vinsn->slots[slot];
|
||||||
|
expressionS *tls_reloc = &tinsn->tls_reloc;
|
||||||
bfd_boolean tinsn_has_fixup =
|
bfd_boolean tinsn_has_fixup =
|
||||||
tinsn_to_slotbuf (vinsn->format, slot, tinsn,
|
tinsn_to_slotbuf (vinsn->format, slot, tinsn,
|
||||||
vinsn->slotbuf[slot]);
|
vinsn->slotbuf[slot]);
|
||||||
|
|
||||||
xtensa_format_set_slot (isa, fmt, slot,
|
xtensa_format_set_slot (isa, fmt, slot,
|
||||||
insnbuf, vinsn->slotbuf[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)
|
if (tinsn_has_fixup)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Declarations for stacks of tokenized Xtensa instructions.
|
/* 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.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
@ -49,6 +49,8 @@ typedef struct tinsn_struct
|
|||||||
bfd_boolean loc_directive_seen;
|
bfd_boolean loc_directive_seen;
|
||||||
struct dwarf2_line_info debug_line;
|
struct dwarf2_line_info debug_line;
|
||||||
|
|
||||||
|
expressionS tls_reloc;
|
||||||
|
|
||||||
/* Filled out by relaxation_requirements: */
|
/* Filled out by relaxation_requirements: */
|
||||||
enum xtensa_relax_statesE subtype;
|
enum xtensa_relax_statesE subtype;
|
||||||
int literal_space;
|
int literal_space;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Table of relaxations for Xtensa assembly.
|
/* 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.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
@ -645,13 +645,13 @@ append_op (BuildInstr *bi, BuildOp *b_op)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
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));
|
BuildOp *b_op = (BuildOp *) xmalloc (sizeof (BuildOp));
|
||||||
|
|
||||||
b_op->op_num = op1;
|
b_op->op_num = op1;
|
||||||
b_op->typ = OP_LITERAL;
|
b_op->typ = OP_LITERAL;
|
||||||
b_op->op_data = 0;
|
b_op->op_data = src_op;
|
||||||
b_op->next = NULL;
|
b_op->next = NULL;
|
||||||
append_op (bi, b_op);
|
append_op (bi, b_op);
|
||||||
}
|
}
|
||||||
@ -1594,6 +1594,7 @@ build_transition (insn_pattern *initial_insn,
|
|||||||
TransitionRule *tr = NULL;
|
TransitionRule *tr = NULL;
|
||||||
xtensa_opcode opcode;
|
xtensa_opcode opcode;
|
||||||
xtensa_isa isa = xtensa_default_isa;
|
xtensa_isa isa = xtensa_default_isa;
|
||||||
|
BuildInstr *literal_bi;
|
||||||
|
|
||||||
opname_map_e *op1;
|
opname_map_e *op1;
|
||||||
opname_map_e *op2;
|
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
|
can be used before they are defined. Also there are a number of
|
||||||
special operands (e.g., HI24S). */
|
special operands (e.g., HI24S). */
|
||||||
|
|
||||||
|
literal_bi = NULL;
|
||||||
for (r = replace_insns->head; r != NULL; r = r->next)
|
for (r = replace_insns->head; r != NULL; r = r->next)
|
||||||
{
|
{
|
||||||
BuildInstr *bi;
|
BuildInstr *bi;
|
||||||
@ -1730,6 +1732,7 @@ build_transition (insn_pattern *initial_insn,
|
|||||||
bi->typ = INSTR_LITERAL_DEF;
|
bi->typ = INSTR_LITERAL_DEF;
|
||||||
if (operand_count != 1)
|
if (operand_count != 1)
|
||||||
as_fatal (_("expected one operand for generated literal"));
|
as_fatal (_("expected one operand for generated literal"));
|
||||||
|
literal_bi = bi;
|
||||||
}
|
}
|
||||||
else if (strcmp (opcode_name, "LABEL") == 0)
|
else if (strcmp (opcode_name, "LABEL") == 0)
|
||||||
{
|
{
|
||||||
@ -1768,7 +1771,13 @@ build_transition (insn_pattern *initial_insn,
|
|||||||
if (op_is_constant (op))
|
if (op_is_constant (op))
|
||||||
append_constant_op (bi, op->operand_num, op_get_constant (op));
|
append_constant_op (bi, op->operand_num, op_get_constant (op));
|
||||||
else if (strcmp (op->operand_name, "%LITERAL") == 0)
|
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)
|
else if (strcmp (op->operand_name, "%LABEL") == 0)
|
||||||
append_label_op (bi, op->operand_num);
|
append_label_op (bi, op->operand_num);
|
||||||
else if (op->operand_name[0] == 'a'
|
else if (op->operand_name[0] == 'a'
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Table of relaxations for Xtensa assembly.
|
/* 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.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
@ -135,7 +135,9 @@ struct build_op
|
|||||||
OPERAND: op_data is the field in the
|
OPERAND: op_data is the field in the
|
||||||
source instruction to take the value from
|
source instruction to take the value from
|
||||||
and encode in the op_num field here.
|
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;
|
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>
|
2008-08-08 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
Daniel Jacobowitz <dan@codesourcery.com>
|
Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
Catherine Moore <clm@codesourcery.com>
|
Catherine Moore <clm@codesourcery.com>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Xtensa ELF support for BFD.
|
/* 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.
|
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
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_SLOT12_ALT, 47)
|
||||||
RELOC_NUMBER (R_XTENSA_SLOT13_ALT, 48)
|
RELOC_NUMBER (R_XTENSA_SLOT13_ALT, 48)
|
||||||
RELOC_NUMBER (R_XTENSA_SLOT14_ALT, 49)
|
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)
|
END_RELOC_NUMBERS (R_XTENSA_max)
|
||||||
|
|
||||||
/* Processor-specific flags for the ELF header e_flags field. */
|
/* 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
|
Reference in New Issue
Block a user