* som.c (log2): Return -1 on error rather than aborting.
authorJeff Law <law@redhat.com>
Wed, 2 Mar 1994 20:32:10 +0000 (20:32 +0000)
committerJeff Law <law@redhat.com>
Wed, 2 Mar 1994 20:32:10 +0000 (20:32 +0000)
        (setup_sections): Bubble up an error from log2.

bfd/ChangeLog
bfd/som.c

index 9b2d231d2791ffbb7e2e6ce888f846d572ed5662..fd58ef9c1b3b20b84fccf6c0d46eb2bb5a36f2f9 100644 (file)
@@ -1,5 +1,8 @@
 Wed Mar  2 11:57:03 1994  Jeffrey A. Law  (law@snake.cs.utah.edu)
 
+       * som.c (log2): Return -1 on error rather than aborting.
+       (setup_sections): Bubble up an error from log2.
+
        * Changes to make HP C compiler happy in both traditional
        and ANSI mode.
        * som.c (hppa_som_gen_reloc_type): Use correct enum type for
index 765d39f4b54ed6ba9871ff83bfdb8861cb201340..66c68e9a9f4a34f9d63076390b974a26455cf276 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -1323,9 +1323,7 @@ som_reloc_call (abfd, p, subspace_reloc_sizep, bfd_reloc, sym_num, queue)
 
 
 /* Return the logarithm of X, base 2, considering X unsigned. 
-   Abort if X is not a power of two -- this should never happen (FIXME:
-   It will happen on corrupt executables.  GDB should give an error, not
-   a coredump, in that case).  */
+   Abort -1 if X is not a power or two or is zero.  */
 
 static int
 log2 (x)
@@ -1335,7 +1333,7 @@ log2 (x)
 
   /* Test for 0 or a power of 2.  */
   if (x == 0 || x != (x & -x))
-    abort();
+    return -1;
 
   while ((x >>= 1) != 0)
     log++;
@@ -1677,6 +1675,8 @@ setup_sections (abfd, file_hdr)
       space_asect->vma = subspace.subspace_start;
       space_asect->filepos = subspace.file_loc_init_value;
       space_asect->alignment_power = log2 (subspace.alignment);
+      if (space_asect->alignment_power == -1)
+       return false;
 
       /* Initialize save_subspace so we can reliably determine if this
         loop placed any useful values into it.  */
@@ -1775,15 +1775,17 @@ setup_sections (abfd, file_hdr)
          subspace_asect->vma = subspace.subspace_start;
          subspace_asect->_cooked_size = subspace.subspace_length;
          subspace_asect->_raw_size = subspace.subspace_length;
-         subspace_asect->alignment_power = log2 (subspace.alignment);
          subspace_asect->filepos = subspace.file_loc_init_value;
+         subspace_asect->alignment_power = log2 (subspace.alignment);
+         if (subspace_asect->alignment_power == -1)
+           return false;
        }
 
       /* Yow! there is no subspace within the space which actually 
          has initialized information in it; this should never happen
          as far as I know.  */
       if (!save_subspace.file_loc_init_value)
-       abort ();
+       return false;
 
       /* Setup the sizes for the space section based upon the info in the
          last subspace of the space.  */