* elf32-spu.c (spu_elf_auto_overlay): Take into account section
authorAlan Modra <amodra@gmail.com>
Tue, 7 Jul 2009 03:26:47 +0000 (03:26 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 7 Jul 2009 03:26:47 +0000 (03:26 +0000)
alignment when packing sections into overlays.

bfd/ChangeLog
bfd/elf32-spu.c

index 018f4870c8f8db272e98fb50fc9dc4976c4eb2d9..6aa18520f30df20072f2c990671e5e9065fcd976 100644 (file)
@@ -1,3 +1,8 @@
+2009-07-07  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf32-spu.c (spu_elf_auto_overlay): Take into account section
+       alignment when packing sections into overlays.
+
 2009-07-03  Cary Coutant  <ccoutant@google.com>
 
        * dwarf2.c (decode_line_info): Ignore DW_LNE_set_discriminator.
index e2449d4b8b1beff3c54e6c4f2c995231e989de55..8b1a9f1d559e8a9269c570f2103ba90ecbf7c032 100644 (file)
@@ -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)