* elf32-spu.c (spu_elf_size_stubs): Do set up soft-icache manager
data even when no stubs. (spu_elf_place_overlay_data, spu_elf_build_stubs): Adjust.
This commit is contained in:
parent
4135c73ba2
commit
52cfded73c
@ -1,3 +1,9 @@
|
|||||||
|
2009-07-10 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elf32-spu.c (spu_elf_size_stubs): Do set up soft-icache manager
|
||||||
|
data even when no stubs.
|
||||||
|
(spu_elf_place_overlay_data, spu_elf_build_stubs): Adjust.
|
||||||
|
|
||||||
2009-07-10 Alan Modra <amodra@bigpond.net.au>
|
2009-07-10 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf32-ppc.c (ppc_elf_howto_raw): Add R_PPC_IRELATIVE.
|
* elf32-ppc.c (ppc_elf_howto_raw): Add R_PPC_IRELATIVE.
|
||||||
|
177
bfd/elf32-spu.c
177
bfd/elf32-spu.c
@ -1627,7 +1627,7 @@ process_stubs (struct bfd_link_info *info, bfd_boolean build)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate space for overlay call and return stubs.
|
/* Allocate space for overlay call and return stubs.
|
||||||
Return 0 on error, 1 if no stubs, 2 otherwise. */
|
Return 0 on error, 1 if no overlays, 2 otherwise. */
|
||||||
|
|
||||||
int
|
int
|
||||||
spu_elf_size_stubs (struct bfd_link_info *info)
|
spu_elf_size_stubs (struct bfd_link_info *info)
|
||||||
@ -1647,39 +1647,39 @@ spu_elf_size_stubs (struct bfd_link_info *info)
|
|||||||
if (htab->stub_err)
|
if (htab->stub_err)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (htab->stub_count == NULL)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
ibfd = info->input_bfds;
|
ibfd = info->input_bfds;
|
||||||
amt = (htab->num_overlays + 1) * sizeof (*htab->stub_sec);
|
if (htab->stub_count != NULL)
|
||||||
htab->stub_sec = bfd_zmalloc (amt);
|
|
||||||
if (htab->stub_sec == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
|
|
||||||
| SEC_HAS_CONTENTS | SEC_IN_MEMORY);
|
|
||||||
stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
|
|
||||||
htab->stub_sec[0] = stub;
|
|
||||||
if (stub == NULL
|
|
||||||
|| !bfd_set_section_alignment (ibfd, stub,
|
|
||||||
ovl_stub_size_log2 (htab->params)))
|
|
||||||
return 0;
|
|
||||||
stub->size = htab->stub_count[0] * ovl_stub_size (htab->params);
|
|
||||||
if (htab->params->ovly_flavour == ovly_soft_icache)
|
|
||||||
/* Extra space for linked list entries. */
|
|
||||||
stub->size += htab->stub_count[0] * 16;
|
|
||||||
|
|
||||||
for (i = 0; i < htab->num_overlays; ++i)
|
|
||||||
{
|
{
|
||||||
asection *osec = htab->ovl_sec[i];
|
amt = (htab->num_overlays + 1) * sizeof (*htab->stub_sec);
|
||||||
unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
|
htab->stub_sec = bfd_zmalloc (amt);
|
||||||
|
if (htab->stub_sec == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
|
||||||
|
| SEC_HAS_CONTENTS | SEC_IN_MEMORY);
|
||||||
stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
|
stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
|
||||||
htab->stub_sec[ovl] = stub;
|
htab->stub_sec[0] = stub;
|
||||||
if (stub == NULL
|
if (stub == NULL
|
||||||
|| !bfd_set_section_alignment (ibfd, stub,
|
|| !bfd_set_section_alignment (ibfd, stub,
|
||||||
ovl_stub_size_log2 (htab->params)))
|
ovl_stub_size_log2 (htab->params)))
|
||||||
return 0;
|
return 0;
|
||||||
stub->size = htab->stub_count[ovl] * ovl_stub_size (htab->params);
|
stub->size = htab->stub_count[0] * ovl_stub_size (htab->params);
|
||||||
|
if (htab->params->ovly_flavour == ovly_soft_icache)
|
||||||
|
/* Extra space for linked list entries. */
|
||||||
|
stub->size += htab->stub_count[0] * 16;
|
||||||
|
|
||||||
|
for (i = 0; i < htab->num_overlays; ++i)
|
||||||
|
{
|
||||||
|
asection *osec = htab->ovl_sec[i];
|
||||||
|
unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
|
||||||
|
stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
|
||||||
|
htab->stub_sec[ovl] = stub;
|
||||||
|
if (stub == NULL
|
||||||
|
|| !bfd_set_section_alignment (ibfd, stub,
|
||||||
|
ovl_stub_size_log2 (htab->params)))
|
||||||
|
return 0;
|
||||||
|
stub->size = htab->stub_count[ovl] * ovl_stub_size (htab->params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (htab->params->ovly_flavour == ovly_soft_icache)
|
if (htab->params->ovly_flavour == ovly_soft_icache)
|
||||||
@ -1707,6 +1707,8 @@ spu_elf_size_stubs (struct bfd_link_info *info)
|
|||||||
|
|
||||||
htab->init->size = 16;
|
htab->init->size = 16;
|
||||||
}
|
}
|
||||||
|
else if (htab->stub_count == NULL)
|
||||||
|
return 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* htab->ovtab consists of two arrays.
|
/* htab->ovtab consists of two arrays.
|
||||||
@ -1750,29 +1752,32 @@ spu_elf_place_overlay_data (struct bfd_link_info *info)
|
|||||||
{
|
{
|
||||||
struct spu_link_hash_table *htab = spu_hash_table (info);
|
struct spu_link_hash_table *htab = spu_hash_table (info);
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
const char *ovout;
|
|
||||||
|
|
||||||
if (htab->stub_count == NULL)
|
if (htab->stub_sec != NULL)
|
||||||
return;
|
|
||||||
|
|
||||||
(*htab->params->place_spu_section) (htab->stub_sec[0], NULL, ".text");
|
|
||||||
|
|
||||||
for (i = 0; i < htab->num_overlays; ++i)
|
|
||||||
{
|
{
|
||||||
asection *osec = htab->ovl_sec[i];
|
(*htab->params->place_spu_section) (htab->stub_sec[0], NULL, ".text");
|
||||||
unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
|
|
||||||
(*htab->params->place_spu_section) (htab->stub_sec[ovl], osec, NULL);
|
for (i = 0; i < htab->num_overlays; ++i)
|
||||||
|
{
|
||||||
|
asection *osec = htab->ovl_sec[i];
|
||||||
|
unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
|
||||||
|
(*htab->params->place_spu_section) (htab->stub_sec[ovl], osec, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (htab->params->ovly_flavour == ovly_soft_icache)
|
if (htab->params->ovly_flavour == ovly_soft_icache)
|
||||||
(*htab->params->place_spu_section) (htab->init, NULL, ".ovl.init");
|
(*htab->params->place_spu_section) (htab->init, NULL, ".ovl.init");
|
||||||
|
|
||||||
ovout = ".data";
|
if (htab->ovtab != NULL)
|
||||||
if (htab->params->ovly_flavour == ovly_soft_icache)
|
{
|
||||||
ovout = ".bss";
|
const char *ovout = ".data";
|
||||||
(*htab->params->place_spu_section) (htab->ovtab, NULL, ovout);
|
if (htab->params->ovly_flavour == ovly_soft_icache)
|
||||||
|
ovout = ".bss";
|
||||||
|
(*htab->params->place_spu_section) (htab->ovtab, NULL, ovout);
|
||||||
|
}
|
||||||
|
|
||||||
(*htab->params->place_spu_section) (htab->toe, NULL, ".toe");
|
if (htab->toe != NULL)
|
||||||
|
(*htab->params->place_spu_section) (htab->toe, NULL, ".toe");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Functions to handle embedded spu_ovl.o object. */
|
/* Functions to handle embedded spu_ovl.o object. */
|
||||||
@ -1883,63 +1888,63 @@ spu_elf_build_stubs (struct bfd_link_info *info)
|
|||||||
bfd *obfd;
|
bfd *obfd;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (htab->stub_count == NULL)
|
if (htab->num_overlays != 0)
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
for (i = 0; i <= htab->num_overlays; i++)
|
|
||||||
if (htab->stub_sec[i]->size != 0)
|
|
||||||
{
|
|
||||||
htab->stub_sec[i]->contents = bfd_zalloc (htab->stub_sec[i]->owner,
|
|
||||||
htab->stub_sec[i]->size);
|
|
||||||
if (htab->stub_sec[i]->contents == NULL)
|
|
||||||
return FALSE;
|
|
||||||
htab->stub_sec[i]->rawsize = htab->stub_sec[i]->size;
|
|
||||||
htab->stub_sec[i]->size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
|
||||||
{
|
{
|
||||||
h = htab->ovly_entry[i];
|
for (i = 0; i < 2; i++)
|
||||||
BFD_ASSERT (h != NULL);
|
|
||||||
|
|
||||||
if ((h->root.type == bfd_link_hash_defined
|
|
||||||
|| h->root.type == bfd_link_hash_defweak)
|
|
||||||
&& h->def_regular)
|
|
||||||
{
|
{
|
||||||
s = h->root.u.def.section->output_section;
|
h = htab->ovly_entry[i];
|
||||||
if (spu_elf_section_data (s)->u.o.ovl_index)
|
if (h != NULL
|
||||||
|
&& (h->root.type == bfd_link_hash_defined
|
||||||
|
|| h->root.type == bfd_link_hash_defweak)
|
||||||
|
&& h->def_regular)
|
||||||
{
|
{
|
||||||
(*_bfd_error_handler) (_("%s in overlay section"),
|
s = h->root.u.def.section->output_section;
|
||||||
h->root.root.string);
|
if (spu_elf_section_data (s)->u.o.ovl_index)
|
||||||
bfd_set_error (bfd_error_bad_value);
|
{
|
||||||
return FALSE;
|
(*_bfd_error_handler) (_("%s in overlay section"),
|
||||||
|
h->root.root.string);
|
||||||
|
bfd_set_error (bfd_error_bad_value);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
BFD_ASSERT (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in all the stubs. */
|
if (htab->stub_sec != NULL)
|
||||||
process_stubs (info, TRUE);
|
|
||||||
if (!htab->stub_err)
|
|
||||||
elf_link_hash_traverse (&htab->elf, build_spuear_stubs, info);
|
|
||||||
|
|
||||||
if (htab->stub_err)
|
|
||||||
{
|
{
|
||||||
(*_bfd_error_handler) (_("overlay stub relocation overflow"));
|
for (i = 0; i <= htab->num_overlays; i++)
|
||||||
bfd_set_error (bfd_error_bad_value);
|
if (htab->stub_sec[i]->size != 0)
|
||||||
return FALSE;
|
{
|
||||||
}
|
htab->stub_sec[i]->contents = bfd_zalloc (htab->stub_sec[i]->owner,
|
||||||
|
htab->stub_sec[i]->size);
|
||||||
|
if (htab->stub_sec[i]->contents == NULL)
|
||||||
|
return FALSE;
|
||||||
|
htab->stub_sec[i]->rawsize = htab->stub_sec[i]->size;
|
||||||
|
htab->stub_sec[i]->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i <= htab->num_overlays; i++)
|
/* Fill in all the stubs. */
|
||||||
{
|
process_stubs (info, TRUE);
|
||||||
if (htab->stub_sec[i]->size != htab->stub_sec[i]->rawsize)
|
if (!htab->stub_err)
|
||||||
|
elf_link_hash_traverse (&htab->elf, build_spuear_stubs, info);
|
||||||
|
|
||||||
|
if (htab->stub_err)
|
||||||
{
|
{
|
||||||
(*_bfd_error_handler) (_("stubs don't match calculated size"));
|
(*_bfd_error_handler) (_("overlay stub relocation overflow"));
|
||||||
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
htab->stub_sec[i]->rawsize = 0;
|
|
||||||
|
for (i = 0; i <= htab->num_overlays; i++)
|
||||||
|
{
|
||||||
|
if (htab->stub_sec[i]->size != htab->stub_sec[i]->rawsize)
|
||||||
|
{
|
||||||
|
(*_bfd_error_handler) (_("stubs don't match calculated size"));
|
||||||
|
bfd_set_error (bfd_error_bad_value);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
htab->stub_sec[i]->rawsize = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (htab->ovtab == NULL || htab->ovtab->size == 0)
|
if (htab->ovtab == NULL || htab->ovtab->size == 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user