diff options
author | Alan Modra <amodra@gmail.com> | 2009-07-07 03:26:47 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2009-07-07 03:26:47 +0000 |
commit | 2fc6d3b01285cee9613f9c52c08b57e91b4f01f6 (patch) | |
tree | a597d763c47ca3f6a104a7fdb3d6f974cd7f360d /bfd/elf32-spu.c | |
parent | 22102fb0d9c6319d33b3a5c9d09cc2df1aa0c8c8 (diff) | |
download | gdb-2fc6d3b01285cee9613f9c52c08b57e91b4f01f6.zip gdb-2fc6d3b01285cee9613f9c52c08b57e91b4f01f6.tar.gz gdb-2fc6d3b01285cee9613f9c52c08b57e91b4f01f6.tar.bz2 |
* elf32-spu.c (spu_elf_auto_overlay): Take into account section
alignment when packing sections into overlays.
Diffstat (limited to 'bfd/elf32-spu.c')
-rw-r--r-- | bfd/elf32-spu.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c index e2449d4..8b1a9f1 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) |