From: Alan Modra Date: Tue, 7 Jul 2009 03:26:47 +0000 (+0000) Subject: * elf32-spu.c (spu_elf_auto_overlay): Take into account section X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2fc6d3b01285cee9613f9c52c08b57e91b4f01f6;p=binutils-gdb.git * elf32-spu.c (spu_elf_auto_overlay): Take into account section alignment when packing sections into overlays. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 018f4870c8f..6aa18520f30 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2009-07-07 Alan Modra + + * elf32-spu.c (spu_elf_auto_overlay): Take into account section + alignment when packing sections into overlays. + 2009-07-03 Cary Coutant * dwarf2.c (decode_line_info): Ignore DW_LNE_set_discriminator. diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c index e2449d4b8b1..8b1a9f1d559 100644 --- a/bfd/elf32-spu.c +++ b/bfd/elf32-spu.c @@ -4364,12 +4364,12 @@ spu_elf_auto_overlay (struct bfd_link_info *info) ovlynum = 0; while (base < count) { - unsigned int size = 0; + unsigned int size = 0, rosize = 0, roalign = 0; for (i = base; i < count; i++) { - asection *sec; - unsigned int tmp; + asection *sec, *rosec; + unsigned int tmp, rotmp; unsigned int num_stubs; struct call_info *call, *pasty; struct _spu_elf_section_data *sec_data; @@ -4379,10 +4379,16 @@ spu_elf_auto_overlay (struct bfd_link_info *info) /* See whether we can add this section to the current overlay without overflowing our overlay buffer. */ sec = ovly_sections[2 * i]; - tmp = size + sec->size; - if (ovly_sections[2 * i + 1]) - tmp += ovly_sections[2 * i + 1]->size; - if (tmp > overlay_size) + tmp = align_power (size, sec->alignment_power) + sec->size; + rotmp = rosize; + rosec = ovly_sections[2 * i + 1]; + if (rosec != NULL) + { + rotmp = align_power (rotmp, rosec->alignment_power) + rosec->size; + if (roalign < rosec->alignment_power) + roalign = rosec->alignment_power; + } + if (align_power (tmp, roalign) + rotmp > overlay_size) break; if (sec->segment_mark) { @@ -4392,15 +4398,22 @@ spu_elf_auto_overlay (struct bfd_link_info *info) while (pasty != NULL) { struct function_info *call_fun = pasty->fun; - tmp += call_fun->sec->size; + tmp = (align_power (tmp, call_fun->sec->alignment_power) + + call_fun->sec->size); if (call_fun->rodata) - tmp += call_fun->rodata->size; + { + rotmp = (align_power (rotmp, + call_fun->rodata->alignment_power) + + call_fun->rodata->size); + if (roalign < rosec->alignment_power) + roalign = rosec->alignment_power; + } for (pasty = call_fun->call_list; pasty; pasty = pasty->next) if (pasty->is_pasted) break; } } - if (tmp > overlay_size) + if (align_power (tmp, roalign) + rotmp > overlay_size) break; /* If we add this section, we might need new overlay call @@ -4457,10 +4470,11 @@ spu_elf_auto_overlay (struct bfd_link_info *info) if (htab->params->ovly_flavour == ovly_soft_icache && num_stubs > htab->params->max_branch) break; - if (tmp + num_stubs * ovl_stub_size (htab->params) - > overlay_size) + if (align_power (tmp, roalign) + rotmp + + num_stubs * ovl_stub_size (htab->params) > overlay_size) break; size = tmp; + rosize = rotmp; } if (i == base)