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:
Bob Wilson 2008-08-20 23:28:59 +00:00
parent f2f0e013fc
commit 28dbbc0203
26 changed files with 1919 additions and 139 deletions

View File

@ -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

View File

@ -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,

View File

@ -1418,6 +1418,7 @@ enum elf_object_id
SH_ELF_TDATA,
SPARC_ELF_TDATA,
X86_64_ELF_TDATA,
XTENSA_ELF_TDATA,
GENERIC_ELF_TDATA
};

File diff suppressed because it is too large Load Diff

View File

@ -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",

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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'

View File

@ -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;
};

View File

@ -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>

View File

@ -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. */

View 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.*

View 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

View 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

View 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* .*

View 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* .*

View 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

View 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.*

View 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

View 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+ .*

View 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* .*

View 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

View 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

View 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