Line 378... |
Line 378... |
/* These relocs are currently not defined. */
|
/* These relocs are currently not defined. */
|
EMPTY_HOWTO (56),
|
EMPTY_HOWTO (56),
|
EMPTY_HOWTO (57),
|
EMPTY_HOWTO (57),
|
EMPTY_HOWTO (58),
|
EMPTY_HOWTO (58),
|
EMPTY_HOWTO (59),
|
EMPTY_HOWTO (59),
|
EMPTY_HOWTO (60),
|
|
EMPTY_HOWTO (61),
|
HOWTO (R_TILEPRO_TLS_GD_CALL, /* type */
|
EMPTY_HOWTO (62),
|
TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
|
EMPTY_HOWTO (63),
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
EMPTY_HOWTO (64),
|
29, /* bitsize */
|
EMPTY_HOWTO (65),
|
TRUE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_signed,/* complain_on_overflow */
|
|
bfd_elf_generic_reloc, /* special_function */
|
|
"R_TILEPRO_TLS_GD_CALL", /* name */
|
|
FALSE, /* partial_inplace */
|
|
0, /* src_mask */
|
|
-1, /* dst_mask */
|
|
TRUE), /* pcrel_offset */
|
|
|
|
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X0_TLS_GD_ADD, 0, 8),
|
|
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X1_TLS_GD_ADD, 0, 8),
|
|
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y0_TLS_GD_ADD, 0, 8),
|
|
TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y1_TLS_GD_ADD, 0, 8),
|
|
TILEPRO_IMM_HOWTO(R_TILEPRO_TLS_IE_LOAD, 0, 8),
|
|
|
/* Offsets into the GOT of TLS Descriptors. */
|
/* Offsets into the GOT of TLS Descriptors. */
|
|
|
HOWTO (R_TILEPRO_IMM16_X0_TLS_GD,/* type */
|
HOWTO (R_TILEPRO_IMM16_X0_TLS_GD,/* type */
|
0, /* rightshift */
|
0, /* rightshift */
|
Line 452... |
Line 466... |
FALSE, /* partial_inplace */
|
FALSE, /* partial_inplace */
|
0, /* src_mask */
|
0, /* src_mask */
|
-1, /* dst_mask */
|
-1, /* dst_mask */
|
TRUE), /* pcrel_offset */
|
TRUE), /* pcrel_offset */
|
|
|
#define TILEPRO_IMM16_HOWTO_TLS_IE(name, rshift) \
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_IE_LO, 0),
|
HOWTO (name, rshift, 1, 16, FALSE, 0, \
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_LO, 0),
|
complain_overflow_dont, bfd_elf_generic_reloc, \
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_IE_HI, 16),
|
#name, FALSE, 0, 0xffff, TRUE)
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_HI, 16),
|
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_IE_HA, 16),
|
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_LO, 0),
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_HA, 16),
|
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_LO, 0),
|
|
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HI, 16),
|
|
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HI, 16),
|
|
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HA, 16),
|
|
TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HA, 16),
|
|
|
|
/* These are common with the Solaris TLS implementation. */
|
/* These are common with the Solaris TLS implementation. */
|
HOWTO(R_TILEPRO_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
|
HOWTO(R_TILEPRO_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
|
bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPMOD32",
|
bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPMOD32",
|
FALSE, 0, 0, TRUE),
|
FALSE, 0, 0, TRUE),
|
HOWTO(R_TILEPRO_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
|
HOWTO(R_TILEPRO_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
|
bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPOFF32",
|
bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPOFF32",
|
FALSE, 0, 0xFFFFFFFF, TRUE),
|
FALSE, 0, 0xFFFFFFFF, TRUE),
|
HOWTO(R_TILEPRO_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
|
HOWTO(R_TILEPRO_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
|
bfd_elf_generic_reloc, "R_TILEPRO_TLS_TPOFF32",
|
bfd_elf_generic_reloc, "R_TILEPRO_TLS_TPOFF32",
|
FALSE, 0, 0, TRUE)
|
FALSE, 0, 0, TRUE),
|
|
|
|
HOWTO (R_TILEPRO_IMM16_X0_TLS_LE,/* type */
|
|
0, /* rightshift */
|
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
|
16, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_signed, /* complain_on_overflow */
|
|
bfd_elf_generic_reloc, /* special_function */
|
|
"R_TILEPRO_IMM16_X0_TLS_LE",/* name */
|
|
FALSE, /* partial_inplace */
|
|
0, /* src_mask */
|
|
-1, /* dst_mask */
|
|
TRUE), /* pcrel_offset */
|
|
|
|
HOWTO (R_TILEPRO_IMM16_X1_TLS_LE,/* type */
|
|
0, /* rightshift */
|
|
1, /* size (0 = byte, 1 = short, 2 = long) */
|
|
16, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_signed, /* complain_on_overflow */
|
|
bfd_elf_generic_reloc, /* special_function */
|
|
"R_TILEPRO_IMM16_X1_TLS_LE",/* name */
|
|
FALSE, /* partial_inplace */
|
|
0, /* src_mask */
|
|
-1, /* dst_mask */
|
|
TRUE), /* pcrel_offset */
|
|
|
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_LE_LO, 0),
|
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_LE_LO, 0),
|
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_LE_HI, 16),
|
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_LE_HI, 16),
|
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_LE_HA, 16),
|
|
TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_LE_HA, 16),
|
};
|
};
|
|
|
static reloc_howto_type tilepro_elf_howto_table2 [] =
|
static reloc_howto_type tilepro_elf_howto_table2 [] =
|
{
|
{
|
/* GNU extension to record C++ vtable hierarchy */
|
/* GNU extension to record C++ vtable hierarchy */
|
Line 588... |
Line 631... |
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X0, R_TILEPRO_SHAMT_X0)
|
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X0, R_TILEPRO_SHAMT_X0)
|
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X1, R_TILEPRO_SHAMT_X1)
|
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X1, R_TILEPRO_SHAMT_X1)
|
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0, R_TILEPRO_SHAMT_Y0)
|
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0, R_TILEPRO_SHAMT_Y0)
|
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1, R_TILEPRO_SHAMT_Y1)
|
TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1, R_TILEPRO_SHAMT_Y1)
|
|
|
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_GD_CALL, R_TILEPRO_TLS_GD_CALL)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD, R_TILEPRO_IMM8_X0_TLS_GD_ADD)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD, R_TILEPRO_IMM8_X1_TLS_GD_ADD)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD, R_TILEPRO_IMM8_Y0_TLS_GD_ADD)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD, R_TILEPRO_IMM8_Y1_TLS_GD_ADD)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_IE_LOAD, R_TILEPRO_TLS_IE_LOAD)
|
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD, R_TILEPRO_IMM16_X0_TLS_GD)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD, R_TILEPRO_IMM16_X0_TLS_GD)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD, R_TILEPRO_IMM16_X1_TLS_GD)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD, R_TILEPRO_IMM16_X1_TLS_GD)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO, R_TILEPRO_IMM16_X0_TLS_GD_LO)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO, R_TILEPRO_IMM16_X0_TLS_GD_LO)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO, R_TILEPRO_IMM16_X1_TLS_GD_LO)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO, R_TILEPRO_IMM16_X1_TLS_GD_LO)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI, R_TILEPRO_IMM16_X0_TLS_GD_HI)
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI, R_TILEPRO_IMM16_X0_TLS_GD_HI)
|
Line 610... |
Line 660... |
|
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPMOD32, R_TILEPRO_TLS_DTPMOD32)
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPMOD32, R_TILEPRO_TLS_DTPMOD32)
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPOFF32, R_TILEPRO_TLS_DTPOFF32)
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPOFF32, R_TILEPRO_TLS_DTPOFF32)
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_TPOFF32, R_TILEPRO_TLS_TPOFF32)
|
TH_REMAP (BFD_RELOC_TILEPRO_TLS_TPOFF32, R_TILEPRO_TLS_TPOFF32)
|
|
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE, R_TILEPRO_IMM16_X0_TLS_LE)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE, R_TILEPRO_IMM16_X1_TLS_LE)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO, R_TILEPRO_IMM16_X0_TLS_LE_LO)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO, R_TILEPRO_IMM16_X1_TLS_LE_LO)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI, R_TILEPRO_IMM16_X0_TLS_LE_HI)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI, R_TILEPRO_IMM16_X1_TLS_LE_HI)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA, R_TILEPRO_IMM16_X0_TLS_LE_HA)
|
|
TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA, R_TILEPRO_IMM16_X1_TLS_LE_HA)
|
|
|
#undef TH_REMAP
|
#undef TH_REMAP
|
|
|
{ BFD_RELOC_VTABLE_INHERIT, R_TILEPRO_GNU_VTINHERIT, tilepro_elf_howto_table2 },
|
{ BFD_RELOC_VTABLE_INHERIT, R_TILEPRO_GNU_VTINHERIT, tilepro_elf_howto_table2 },
|
{ BFD_RELOC_VTABLE_ENTRY, R_TILEPRO_GNU_VTENTRY, tilepro_elf_howto_table2 },
|
{ BFD_RELOC_VTABLE_ENTRY, R_TILEPRO_GNU_VTENTRY, tilepro_elf_howto_table2 },
|
};
|
};
|
Line 743... |
Line 802... |
arelent * cache_ptr,
|
arelent * cache_ptr,
|
Elf_Internal_Rela * dst)
|
Elf_Internal_Rela * dst)
|
{
|
{
|
unsigned int r_type = ELF32_R_TYPE (dst->r_info);
|
unsigned int r_type = ELF32_R_TYPE (dst->r_info);
|
|
|
if (r_type <= (unsigned int) R_TILEPRO_TLS_TPOFF32)
|
if (r_type <= (unsigned int) R_TILEPRO_IMM16_X1_TLS_LE_HA)
|
cache_ptr->howto = &tilepro_elf_howto_table [r_type];
|
cache_ptr->howto = &tilepro_elf_howto_table [r_type];
|
else if (r_type - R_TILEPRO_GNU_VTINHERIT
|
else if (r_type - R_TILEPRO_GNU_VTINHERIT
|
<= (unsigned int) R_TILEPRO_GNU_VTENTRY)
|
<= (unsigned int) R_TILEPRO_GNU_VTENTRY)
|
cache_ptr->howto
|
cache_ptr->howto
|
= &tilepro_elf_howto_table2 [r_type - R_TILEPRO_GNU_VTINHERIT];
|
= &tilepro_elf_howto_table2 [r_type - R_TILEPRO_GNU_VTINHERIT];
|
Line 843... |
Line 902... |
create_Imm16_X0,
|
create_Imm16_X0,
|
create_Imm16_X1,
|
create_Imm16_X1,
|
create_Imm16_X0,
|
create_Imm16_X0,
|
create_Imm16_X1,
|
create_Imm16_X1,
|
create_Imm16_X0,
|
create_Imm16_X0,
|
create_Imm16_X1
|
create_Imm16_X1,
|
|
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
|
|
create_Imm16_X0,
|
|
create_Imm16_X1,
|
|
create_Imm16_X0,
|
|
create_Imm16_X1,
|
|
create_Imm16_X0,
|
|
create_Imm16_X1,
|
|
create_Imm16_X0,
|
|
create_Imm16_X1,
|
};
|
};
|
|
|
#define NELEMS(a) ((int) (sizeof (a) / sizeof ((a)[0])))
|
#define NELEMS(a) ((int) (sizeof (a) / sizeof ((a)[0])))
|
|
|
/* Support for core dump NOTE sections. */
|
/* Support for core dump NOTE sections. */
|
Line 1286... |
Line 1358... |
eind->tls_type = GOT_UNKNOWN;
|
eind->tls_type = GOT_UNKNOWN;
|
}
|
}
|
_bfd_elf_link_hash_copy_indirect (info, dir, ind);
|
_bfd_elf_link_hash_copy_indirect (info, dir, ind);
|
}
|
}
|
|
|
|
static int
|
|
tilepro_tls_translate_to_le (int r_type)
|
|
{
|
|
switch (r_type)
|
|
{
|
|
case R_TILEPRO_IMM16_X0_TLS_GD:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE:
|
|
return R_TILEPRO_IMM16_X0_TLS_LE;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE:
|
|
return R_TILEPRO_IMM16_X1_TLS_LE;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE_LO:
|
|
return R_TILEPRO_IMM16_X0_TLS_LE_LO;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE_LO:
|
|
return R_TILEPRO_IMM16_X1_TLS_LE_LO;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE_HI:
|
|
return R_TILEPRO_IMM16_X0_TLS_LE_HI;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE_HI:
|
|
return R_TILEPRO_IMM16_X1_TLS_LE_HI;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
|
|
return R_TILEPRO_IMM16_X0_TLS_LE_HA;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
|
|
return R_TILEPRO_IMM16_X1_TLS_LE_HA;
|
|
}
|
|
return r_type;
|
|
}
|
|
|
|
static int
|
|
tilepro_tls_translate_to_ie (int r_type)
|
|
{
|
|
switch (r_type)
|
|
{
|
|
case R_TILEPRO_IMM16_X0_TLS_GD:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE:
|
|
return R_TILEPRO_IMM16_X0_TLS_IE;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE:
|
|
return R_TILEPRO_IMM16_X1_TLS_IE;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE_LO:
|
|
return R_TILEPRO_IMM16_X0_TLS_IE_LO;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE_LO:
|
|
return R_TILEPRO_IMM16_X1_TLS_IE_LO;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE_HI:
|
|
return R_TILEPRO_IMM16_X0_TLS_IE_HI;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE_HI:
|
|
return R_TILEPRO_IMM16_X1_TLS_IE_HI;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
|
|
return R_TILEPRO_IMM16_X0_TLS_IE_HA;
|
|
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
|
|
return R_TILEPRO_IMM16_X1_TLS_IE_HA;
|
|
}
|
|
return r_type;
|
|
}
|
|
|
|
static int
|
|
tilepro_elf_tls_transition (struct bfd_link_info *info, int r_type,
|
|
int is_local)
|
|
{
|
|
if (info->shared)
|
|
return r_type;
|
|
|
|
if (is_local)
|
|
return tilepro_tls_translate_to_le (r_type);
|
|
else
|
|
return tilepro_tls_translate_to_ie (r_type);
|
|
}
|
|
|
/* Look through the relocs for a section during the first phase, and
|
/* Look through the relocs for a section during the first phase, and
|
allocate space in the global offset table or procedure linkage
|
allocate space in the global offset table or procedure linkage
|
table. */
|
table. */
|
|
|
static bfd_boolean
|
static bfd_boolean
|
Line 1346... |
Line 1511... |
while (h->root.type == bfd_link_hash_indirect
|
while (h->root.type == bfd_link_hash_indirect
|
|| h->root.type == bfd_link_hash_warning)
|
|| h->root.type == bfd_link_hash_warning)
|
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
}
|
}
|
|
|
|
r_type = tilepro_elf_tls_transition (info, r_type, h == NULL);
|
switch (r_type)
|
switch (r_type)
|
{
|
{
|
|
case R_TILEPRO_IMM16_X0_TLS_LE:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE:
|
|
case R_TILEPRO_IMM16_X0_TLS_LE_LO:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE_LO:
|
|
case R_TILEPRO_IMM16_X0_TLS_LE_HI:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE_HI:
|
|
case R_TILEPRO_IMM16_X0_TLS_LE_HA:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE_HA:
|
|
if (info->shared)
|
|
goto r_tilepro_plt32;
|
|
break;
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD:
|
case R_TILEPRO_IMM16_X0_TLS_GD:
|
case R_TILEPRO_IMM16_X1_TLS_GD:
|
case R_TILEPRO_IMM16_X1_TLS_GD:
|
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
|
BFD_ASSERT (info->shared);
|
tls_type = GOT_TLS_GD;
|
tls_type = GOT_TLS_GD;
|
goto have_got_reference;
|
goto have_got_reference;
|
|
|
case R_TILEPRO_IMM16_X0_TLS_IE:
|
case R_TILEPRO_IMM16_X0_TLS_IE:
|
case R_TILEPRO_IMM16_X1_TLS_IE:
|
case R_TILEPRO_IMM16_X1_TLS_IE:
|
Line 1452... |
Line 1631... |
if (!tilepro_elf_create_got_section (htab->elf.dynobj, info))
|
if (!tilepro_elf_create_got_section (htab->elf.dynobj, info))
|
return FALSE;
|
return FALSE;
|
}
|
}
|
break;
|
break;
|
|
|
|
case R_TILEPRO_TLS_GD_CALL:
|
|
if (info->shared)
|
|
{
|
|
/* These are basically R_TILEPRO_JOFFLONG_X1_PLT relocs
|
|
against __tls_get_addr. */
|
|
struct bfd_link_hash_entry *bh = NULL;
|
|
if (! _bfd_generic_link_add_one_symbol (info, abfd,
|
|
"__tls_get_addr", 0,
|
|
bfd_und_section_ptr, 0,
|
|
NULL, FALSE, FALSE,
|
|
&bh))
|
|
return FALSE;
|
|
h = (struct elf_link_hash_entry *) bh;
|
|
}
|
|
else
|
|
break;
|
|
/* Fall through */
|
|
|
case R_TILEPRO_JOFFLONG_X1_PLT:
|
case R_TILEPRO_JOFFLONG_X1_PLT:
|
/* This symbol requires a procedure linkage table entry. We
|
/* This symbol requires a procedure linkage table entry. We
|
actually build the entry in adjust_dynamic_symbol,
|
actually build the entry in adjust_dynamic_symbol,
|
because this might be a case of linking PIC code without
|
because this might be a case of linking PIC code without
|
linking in any dynamic objects, in which case we don't
|
linking in any dynamic objects, in which case we don't
|
Line 1521... |
Line 1718... |
case R_TILEPRO_SHAMT_X0:
|
case R_TILEPRO_SHAMT_X0:
|
case R_TILEPRO_SHAMT_X1:
|
case R_TILEPRO_SHAMT_X1:
|
case R_TILEPRO_SHAMT_Y0:
|
case R_TILEPRO_SHAMT_Y0:
|
case R_TILEPRO_SHAMT_Y1:
|
case R_TILEPRO_SHAMT_Y1:
|
if (h != NULL)
|
if (h != NULL)
|
{
|
|
h->non_got_ref = 1;
|
h->non_got_ref = 1;
|
|
|
if (!info->shared)
|
r_tilepro_plt32:
|
|
if (h != NULL && !info->shared)
|
{
|
{
|
/* We may need a .plt entry if the function this reloc
|
/* We may need a .plt entry if the function this reloc
|
refers to is in a shared lib. */
|
refers to is in a shared lib. */
|
h->plt.refcount += 1;
|
h->plt.refcount += 1;
|
}
|
}
|
}
|
|
|
|
/* If we are creating a shared library, and this is a reloc
|
/* If we are creating a shared library, and this is a reloc
|
against a global symbol, or a non PC relative reloc
|
against a global symbol, or a non PC relative reloc
|
against a local symbol, then we need to copy the reloc
|
against a local symbol, then we need to copy the reloc
|
into the shared library. However, if we are linking with
|
into the shared library. However, if we are linking with
|
Line 1723... |
Line 1919... |
break;
|
break;
|
}
|
}
|
}
|
}
|
|
|
r_type = ELF32_R_TYPE (rel->r_info);
|
r_type = ELF32_R_TYPE (rel->r_info);
|
|
r_type = tilepro_elf_tls_transition (info, r_type, h != NULL);
|
switch (r_type)
|
switch (r_type)
|
{
|
{
|
case R_TILEPRO_IMM16_X0_GOT:
|
case R_TILEPRO_IMM16_X0_GOT:
|
case R_TILEPRO_IMM16_X1_GOT:
|
case R_TILEPRO_IMM16_X1_GOT:
|
case R_TILEPRO_IMM16_X0_GOT_LO:
|
case R_TILEPRO_IMM16_X0_GOT_LO:
|
Line 1756... |
Line 1953... |
if (h->got.refcount > 0)
|
if (h->got.refcount > 0)
|
h->got.refcount--;
|
h->got.refcount--;
|
}
|
}
|
else
|
else
|
{
|
{
|
if (local_got_refcounts[r_symndx] > 0)
|
if (local_got_refcounts &&
|
|
local_got_refcounts[r_symndx] > 0)
|
local_got_refcounts[r_symndx]--;
|
local_got_refcounts[r_symndx]--;
|
}
|
}
|
break;
|
break;
|
|
|
case R_TILEPRO_32_PCREL:
|
case R_TILEPRO_32_PCREL:
|
Line 2038... |
Line 2236... |
{
|
{
|
h->plt.offset = (bfd_vma) -1;
|
h->plt.offset = (bfd_vma) -1;
|
h->needs_plt = 0;
|
h->needs_plt = 0;
|
}
|
}
|
|
|
if (h->got.refcount > 0)
|
/* If a TLS_IE symbol is now local to the binary, make it a TLS_LE
|
|
requiring no TLS entry. */
|
|
if (h->got.refcount > 0
|
|
&& !info->shared
|
|
&& h->dynindx == -1
|
|
&& tilepro_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
|
|
h->got.offset = (bfd_vma) -1;
|
|
else if (h->got.refcount > 0)
|
{
|
{
|
asection *s;
|
asection *s;
|
bfd_boolean dyn;
|
bfd_boolean dyn;
|
int tls_type = tilepro_elf_hash_entry(h)->tls_type;
|
int tls_type = tilepro_elf_hash_entry(h)->tls_type;
|
|
|
Line 2465... |
Line 2670... |
return 0;
|
return 0;
|
|
|
return (address - htab->tls_sec->vma);
|
return (address - htab->tls_sec->vma);
|
}
|
}
|
|
|
|
/* Replace the MASK bits in ADDR with those in INSN, for the next
|
|
TILEPRO_BUNDLE_SIZE_IN_BYTES bytes. */
|
|
|
|
static void
|
|
tilepro_replace_insn (bfd_byte *addr, const bfd_byte *mask,
|
|
const bfd_byte *insn)
|
|
{
|
|
int i;
|
|
for (i = 0; i < TILEPRO_BUNDLE_SIZE_IN_BYTES; i++)
|
|
{
|
|
addr[i] = (addr[i] & ~mask[i]) | (insn[i] & mask[i]);
|
|
}
|
|
}
|
|
|
|
/* Mask to extract the bits corresponding to an instruction in a
|
|
specific pipe of a bundle. */
|
|
static const bfd_byte insn_mask_X1[] = {
|
|
0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f
|
|
};
|
|
|
|
/* Mask to extract the bits corresponding to an instruction in a
|
|
specific pipe of a bundle, minus the destination operand and the
|
|
first source operand. */
|
|
static const bfd_byte insn_mask_X0_no_dest_no_srca[] = {
|
|
0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
static const bfd_byte insn_mask_X1_no_dest_no_srca[] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x7f
|
|
};
|
|
|
|
static const bfd_byte insn_mask_Y0_no_dest_no_srca[] = {
|
|
0x00, 0xf0, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
static const bfd_byte insn_mask_Y1_no_dest_no_srca[] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x78
|
|
};
|
|
|
|
/* Mask to extract the first source operand of an instruction. */
|
|
static const bfd_byte srca_mask_X0[] = {
|
|
0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
static const bfd_byte srca_mask_X1[] = {
|
|
0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00
|
|
};
|
|
|
|
/* Various instructions synthesized to support tls references. */
|
|
|
|
/* move r0, r0 in the X1 pipe, used for tls le. */
|
|
static const bfd_byte insn_tls_le_move_X1[] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x33, 0x08
|
|
};
|
|
|
|
/* move r0, zero in the X0 and X1 pipe, used for tls le. */
|
|
static const bfd_byte insn_tls_le_move_zero_X0X1[] = {
|
|
0xc0, 0xff, 0xcf, 0x00, 0xe0, 0xff, 0x33, 0x08
|
|
};
|
|
|
|
/* lw r0, r0 in the X1 pipe, used for tls ie. */
|
|
static const bfd_byte insn_tls_ie_lw_X1[] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0b, 0x40
|
|
};
|
|
|
|
/* add r0, r0, tp in various pipes, used for tls ie. */
|
|
static const bfd_byte insn_tls_ie_add_X0X1[] = {
|
|
0x00, 0x50, 0x0f, 0x00, 0x00, 0xa8, 0x07, 0x08
|
|
};
|
|
static const bfd_byte insn_tls_ie_add_Y0Y1[] = {
|
|
0x00, 0x50, 0x03, 0x08, 0x00, 0xa8, 0x01, 0x8c
|
|
};
|
|
|
|
/* move r0, r0 in various pipes, used for tls gd. */
|
|
static const bfd_byte insn_tls_gd_add_X0X1[] = {
|
|
0x00, 0xf0, 0xcf, 0x00, 0x00, 0xf8, 0x33, 0x08
|
|
};
|
|
static const bfd_byte insn_tls_gd_add_Y0Y1[] = {
|
|
0x00, 0xf0, 0x0b, 0x18, 0x00, 0xf8, 0x05, 0x9c
|
|
};
|
|
|
/* Relocate an TILEPRO ELF section.
|
/* Relocate an TILEPRO ELF section.
|
|
|
The RELOCATE_SECTION function is called by the new ELF backend linker
|
The RELOCATE_SECTION function is called by the new ELF backend linker
|
to handle the relocations for a section.
|
to handle the relocations for a section.
|
|
|
Line 2529... |
Line 2815... |
num_relocs = input_section->reloc_count;
|
num_relocs = input_section->reloc_count;
|
relend = relocs + num_relocs;
|
relend = relocs + num_relocs;
|
for (; rel < relend; rel++)
|
for (; rel < relend; rel++)
|
{
|
{
|
int r_type, tls_type;
|
int r_type, tls_type;
|
|
bfd_boolean is_tls_iele, is_tls_le;
|
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
unsigned long r_symndx;
|
unsigned long r_symndx;
|
struct elf_link_hash_entry *h;
|
struct elf_link_hash_entry *h;
|
Elf_Internal_Sym *sym;
|
Elf_Internal_Sym *sym;
|
tilepro_create_func create_func;
|
tilepro_create_func create_func;
|
Line 2611... |
Line 2898... |
name = bfd_section_name (input_bfd, sec);
|
name = bfd_section_name (input_bfd, sec);
|
}
|
}
|
|
|
switch (r_type)
|
switch (r_type)
|
{
|
{
|
|
case R_TILEPRO_TLS_GD_CALL:
|
|
case R_TILEPRO_IMM8_X0_TLS_GD_ADD:
|
|
case R_TILEPRO_IMM8_Y0_TLS_GD_ADD:
|
|
case R_TILEPRO_IMM8_X1_TLS_GD_ADD:
|
|
case R_TILEPRO_IMM8_Y1_TLS_GD_ADD:
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
|
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
|
|
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
|
|
tls_type = GOT_UNKNOWN;
|
|
if (h == NULL && local_got_offsets)
|
|
tls_type =
|
|
_bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx];
|
|
else if (h != NULL)
|
|
tls_type = tilepro_elf_hash_entry(h)->tls_type;
|
|
|
|
is_tls_iele = (! info->shared || tls_type == GOT_TLS_IE);
|
|
is_tls_le = is_tls_iele && (!info->shared
|
|
&& (h == NULL || h->dynindx == -1));
|
|
|
|
if (r_type == R_TILEPRO_TLS_GD_CALL)
|
|
{
|
|
if (is_tls_le)
|
|
{
|
|
/* GD -> LE */
|
|
tilepro_replace_insn (contents + rel->r_offset,
|
|
insn_mask_X1, insn_tls_le_move_X1);
|
|
continue;
|
|
}
|
|
else if (is_tls_iele)
|
|
{
|
|
/* GD -> IE */
|
|
tilepro_replace_insn (contents + rel->r_offset,
|
|
insn_mask_X1, insn_tls_ie_lw_X1);
|
|
continue;
|
|
}
|
|
|
|
/* GD -> GD */
|
|
h = (struct elf_link_hash_entry *)
|
|
bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
|
|
FALSE, TRUE);
|
|
BFD_ASSERT (h != NULL);
|
|
r_type = R_TILEPRO_JOFFLONG_X1_PLT;
|
|
howto = tilepro_elf_howto_table + r_type;
|
|
}
|
|
else if (r_type == R_TILEPRO_IMM16_X0_TLS_GD_HA
|
|
|| r_type == R_TILEPRO_IMM16_X0_TLS_IE_HA)
|
|
{
|
|
if (is_tls_le)
|
|
tilepro_replace_insn (contents + rel->r_offset, srca_mask_X0,
|
|
insn_tls_le_move_zero_X0X1);
|
|
}
|
|
else if (r_type == R_TILEPRO_IMM16_X1_TLS_GD_HA
|
|
|| r_type == R_TILEPRO_IMM16_X1_TLS_IE_HA)
|
|
{
|
|
if (is_tls_le)
|
|
tilepro_replace_insn (contents + rel->r_offset, srca_mask_X1,
|
|
insn_tls_le_move_zero_X0X1);
|
|
}
|
|
else
|
|
{
|
|
const bfd_byte *mask = NULL;
|
|
const bfd_byte *add_insn = NULL;
|
|
|
|
switch (r_type)
|
|
{
|
|
case R_TILEPRO_IMM8_X0_TLS_GD_ADD:
|
|
add_insn = is_tls_iele ? insn_tls_ie_add_X0X1
|
|
: insn_tls_gd_add_X0X1;
|
|
mask = insn_mask_X0_no_dest_no_srca;
|
|
break;
|
|
case R_TILEPRO_IMM8_X1_TLS_GD_ADD:
|
|
add_insn = is_tls_iele ? insn_tls_ie_add_X0X1
|
|
: insn_tls_gd_add_X0X1;
|
|
mask = insn_mask_X1_no_dest_no_srca;
|
|
break;
|
|
case R_TILEPRO_IMM8_Y0_TLS_GD_ADD:
|
|
add_insn = is_tls_iele ? insn_tls_ie_add_Y0Y1
|
|
: insn_tls_gd_add_Y0Y1;
|
|
mask = insn_mask_Y0_no_dest_no_srca;
|
|
break;
|
|
case R_TILEPRO_IMM8_Y1_TLS_GD_ADD:
|
|
add_insn = is_tls_iele ? insn_tls_ie_add_Y0Y1
|
|
: insn_tls_gd_add_Y0Y1;
|
|
mask = insn_mask_Y1_no_dest_no_srca;
|
|
break;
|
|
}
|
|
|
|
tilepro_replace_insn (contents + rel->r_offset, mask, add_insn);
|
|
|
|
continue;
|
|
}
|
|
break;
|
|
case R_TILEPRO_TLS_IE_LOAD:
|
|
if (!info->shared && (h == NULL || h->dynindx == -1))
|
|
/* IE -> LE */
|
|
tilepro_replace_insn (contents + rel->r_offset,
|
|
insn_mask_X1_no_dest_no_srca,
|
|
insn_tls_le_move_X1);
|
|
else
|
|
/* IE -> IE */
|
|
tilepro_replace_insn (contents + rel->r_offset,
|
|
insn_mask_X1_no_dest_no_srca,
|
|
insn_tls_ie_lw_X1);
|
|
continue;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
switch (r_type)
|
|
{
|
case R_TILEPRO_IMM16_X0_GOT:
|
case R_TILEPRO_IMM16_X0_GOT:
|
case R_TILEPRO_IMM16_X1_GOT:
|
case R_TILEPRO_IMM16_X1_GOT:
|
case R_TILEPRO_IMM16_X0_GOT_LO:
|
case R_TILEPRO_IMM16_X0_GOT_LO:
|
case R_TILEPRO_IMM16_X1_GOT_LO:
|
case R_TILEPRO_IMM16_X1_GOT_LO:
|
case R_TILEPRO_IMM16_X0_GOT_HI:
|
case R_TILEPRO_IMM16_X0_GOT_HI:
|
Line 2906... |
Line 3305... |
if (! relocate)
|
if (! relocate)
|
continue;
|
continue;
|
}
|
}
|
break;
|
break;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_LE:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE:
|
|
case R_TILEPRO_IMM16_X0_TLS_LE_LO:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE_LO:
|
|
case R_TILEPRO_IMM16_X0_TLS_LE_HI:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE_HI:
|
|
case R_TILEPRO_IMM16_X0_TLS_LE_HA:
|
|
case R_TILEPRO_IMM16_X1_TLS_LE_HA:
|
|
if (info->shared)
|
|
{
|
|
Elf_Internal_Rela outrel;
|
|
bfd_boolean skip;
|
|
|
|
BFD_ASSERT (sreloc != NULL);
|
|
skip = FALSE;
|
|
outrel.r_offset =
|
|
_bfd_elf_section_offset (output_bfd, info, input_section,
|
|
rel->r_offset);
|
|
if (outrel.r_offset == (bfd_vma) -1)
|
|
skip = TRUE;
|
|
else if (outrel.r_offset == (bfd_vma) -2)
|
|
skip = TRUE;
|
|
outrel.r_offset += (input_section->output_section->vma
|
|
+ input_section->output_offset);
|
|
if (skip)
|
|
memset (&outrel, 0, sizeof outrel);
|
|
else
|
|
{
|
|
outrel.r_info = ELF32_R_INFO (0, r_type);
|
|
outrel.r_addend = relocation - dtpoff_base (info)
|
|
+ rel->r_addend;
|
|
}
|
|
|
|
tilepro_elf_append_rela_32 (output_bfd, sreloc, &outrel);
|
|
continue;
|
|
}
|
|
relocation = tpoff (info, relocation);
|
|
break;
|
|
|
case R_TILEPRO_IMM16_X0_TLS_GD:
|
case R_TILEPRO_IMM16_X0_TLS_GD:
|
case R_TILEPRO_IMM16_X1_TLS_GD:
|
case R_TILEPRO_IMM16_X1_TLS_GD:
|
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
tls_type = GOT_TLS_GD;
|
|
goto have_tls_reference;
|
|
|
|
case R_TILEPRO_IMM16_X0_TLS_IE:
|
case R_TILEPRO_IMM16_X0_TLS_IE:
|
case R_TILEPRO_IMM16_X1_TLS_IE:
|
case R_TILEPRO_IMM16_X1_TLS_IE:
|
case R_TILEPRO_IMM16_X0_TLS_IE_LO:
|
case R_TILEPRO_IMM16_X0_TLS_IE_LO:
|
case R_TILEPRO_IMM16_X1_TLS_IE_LO:
|
case R_TILEPRO_IMM16_X1_TLS_IE_LO:
|
case R_TILEPRO_IMM16_X0_TLS_IE_HI:
|
case R_TILEPRO_IMM16_X0_TLS_IE_HI:
|
case R_TILEPRO_IMM16_X1_TLS_IE_HI:
|
case R_TILEPRO_IMM16_X1_TLS_IE_HI:
|
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
|
case R_TILEPRO_IMM16_X0_TLS_IE_HA:
|
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
|
case R_TILEPRO_IMM16_X1_TLS_IE_HA:
|
tls_type = GOT_TLS_IE;
|
r_type = tilepro_elf_tls_transition (info, r_type, h == NULL);
|
/* Fall through. */
|
tls_type = GOT_UNKNOWN;
|
|
|
have_tls_reference:
|
|
if (h == NULL && local_got_offsets)
|
if (h == NULL && local_got_offsets)
|
tls_type
|
tls_type
|
= _bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx];
|
= _bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx];
|
else if (h != NULL)
|
else if (h != NULL)
|
{
|
{
|
tls_type = tilepro_elf_hash_entry(h)->tls_type;
|
tls_type = tilepro_elf_hash_entry(h)->tls_type;
|
|
if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
|
|
r_type = tilepro_tls_translate_to_le (r_type);
|
}
|
}
|
if (tls_type == GOT_TLS_IE)
|
if (tls_type == GOT_TLS_IE)
|
switch (r_type)
|
r_type = tilepro_tls_translate_to_ie (r_type);
|
|
|
|
if (r_type == R_TILEPRO_IMM16_X0_TLS_LE
|
|
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE
|
|
|| r_type == R_TILEPRO_IMM16_X0_TLS_LE_LO
|
|
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE_LO
|
|
|| r_type == R_TILEPRO_IMM16_X0_TLS_LE_HI
|
|
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE_HI
|
|
|| r_type == R_TILEPRO_IMM16_X0_TLS_LE_HA
|
|
|| r_type == R_TILEPRO_IMM16_X1_TLS_LE_HA)
|
{
|
{
|
case R_TILEPRO_IMM16_X0_TLS_GD:
|
relocation = tpoff (info, relocation);
|
r_type = R_TILEPRO_IMM16_X0_TLS_IE;
|
|
break;
|
|
case R_TILEPRO_IMM16_X1_TLS_GD:
|
|
r_type = R_TILEPRO_IMM16_X1_TLS_IE;
|
|
break;
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_LO:
|
|
r_type = R_TILEPRO_IMM16_X0_TLS_IE_LO;
|
|
break;
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_LO:
|
|
r_type = R_TILEPRO_IMM16_X1_TLS_IE_LO;
|
|
break;
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_HI:
|
|
r_type = R_TILEPRO_IMM16_X0_TLS_IE_HI;
|
|
break;
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_HI:
|
|
r_type = R_TILEPRO_IMM16_X1_TLS_IE_HI;
|
|
break;
|
|
case R_TILEPRO_IMM16_X0_TLS_GD_HA:
|
|
r_type = R_TILEPRO_IMM16_X0_TLS_IE_HA;
|
|
break;
|
|
case R_TILEPRO_IMM16_X1_TLS_GD_HA:
|
|
r_type = R_TILEPRO_IMM16_X1_TLS_IE_HA;
|
|
break;
|
break;
|
}
|
}
|
|
|
if (h != NULL)
|
if (h != NULL)
|
{
|
{
|