* elflink.h (elf_gc_record_vtentry): Revert last change. Correct
authorAlan Modra <amodra@gmail.com>
Wed, 18 Jun 2003 05:18:06 +0000 (05:18 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 18 Jun 2003 05:18:06 +0000 (05:18 +0000)
size calculation from addend.  Round size up.

bfd/ChangeLog
bfd/elflink.h

index 5100257fe9a403eaa15822e6ca35fda3828d3b1f..8b2decfec78e14ecb9b04cce56c2aaa791ddbb43 100644 (file)
@@ -1,3 +1,8 @@
+2003-06-18  Alan Modra  <amodra@bigpond.net.au>
+
+       * elflink.h (elf_gc_record_vtentry): Revert last change.  Correct
+       size calculation from addend.  Round size up.
+
 2003-06-18  Hans-Peter Nilsson  <hp@axis.com>
 
        * elf32-cris.c (cris_elf_relocate_section) <case
index 64554e716ed287039ea7c33cf7c4217fbe7e54e2..4a7d27def1eebfc68259e3df4fc104b400b3d9a1 100644 (file)
@@ -6301,30 +6301,31 @@ elf_gc_record_vtentry (abfd, sec, h, addend)
   struct elf_backend_data *bed = get_elf_backend_data (abfd);
   unsigned int log_file_align = bed->s->log_file_align;
 
-  if (addend > h->vtable_entries_size)
+  if (addend >= h->vtable_entries_size)
     {
-      size_t size, bytes;
+      size_t size, bytes, file_align;
       bfd_boolean *ptr = h->vtable_entries_used;
 
       /* While the symbol is undefined, we have to be prepared to handle
         a zero size.  */
+      file_align = 1 << log_file_align;
       if (h->root.type == bfd_link_hash_undefined)
-       size = addend;
+       size = addend + file_align;
       else
        {
          size = h->size;
-         if (size < addend)
+         if (addend >= size)
            {
              /* Oops!  We've got a reference past the defined end of
                 the table.  This is probably a bug -- shall we warn?  */
-             size = addend;
+             size = addend + file_align;
            }
        }
+      size = (size + file_align - 1) & -file_align;
 
       /* Allocate one extra entry for use as a "done" flag for the
-        consolidation pass and another extra entry because we are
-        going to write up to and including 'size' entries.  */
-      bytes = ((size >> log_file_align) + 2) * sizeof (bfd_boolean);
+        consolidation pass.  */
+      bytes = ((size >> log_file_align) + 1) * sizeof (bfd_boolean);
 
       if (ptr)
        {