2011-08-01 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Mon, 1 Aug 2011 08:05:49 +0000 (08:05 +0000)
committerTristan Gingold <gingold@adacore.com>
Mon, 1 Aug 2011 08:05:49 +0000 (08:05 +0000)
* frags.c (frag_grow): Simplify the code.

gas/ChangeLog
gas/frags.c

index 86886436b704440070de2af8da8dc310b91b9464..ee4d5e63e6dc1090cda70e1b43854c06c819e976 100644 (file)
@@ -1,3 +1,7 @@
+2011-08-01  Tristan Gingold  <gingold@adacore.com>
+
+       * frags.c (frag_grow): Simplify the code.
+
 2011-07-30  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * config/tc-mips.c (nops_for_vr4130): Revert previous commit.
index a6553bb3baa9c848ade1b8f5cbad63fe5692d312..fb3c02d3b5d4af868f83ab7f7351d8d8b8cd1294 100644 (file)
@@ -85,31 +85,38 @@ frag_grow (unsigned int nchars)
 {
   if (obstack_room (&frchain_now->frch_obstack) < nchars)
     {
-      unsigned int n;
       long oldc;
+      long newc;
 
-      frag_wane (frag_now);
-      frag_new (0);
-      oldc = frchain_now->frch_obstack.chunk_size;
       /* Try to allocate a bit more than needed right now.  But don't do
          this if we would waste too much memory.  Especially necessary
-        for extremely big (like 2GB initialized) frags.  */
+         for extremely big (like 2GB initialized) frags.  */
       if (nchars < 0x10000)
-       frchain_now->frch_obstack.chunk_size = 2 * nchars;
+        newc = 2 * nchars;
       else
-        frchain_now->frch_obstack.chunk_size = nchars + 0x10000;
-      frchain_now->frch_obstack.chunk_size += SIZEOF_STRUCT_FRAG;
-      if (frchain_now->frch_obstack.chunk_size > 0)
-       while ((n = obstack_room (&frchain_now->frch_obstack)) < nchars
-              && (unsigned long) frchain_now->frch_obstack.chunk_size > nchars)
-         {
-           frag_wane (frag_now);
-           frag_new (0);
-         }
-      frchain_now->frch_obstack.chunk_size = oldc;
+        newc = nchars + 0x10000;
+      newc += SIZEOF_STRUCT_FRAG;
+
+      /* Check for possible overflow.  */
+      if (newc < 0)
+        as_fatal (_("can't extend frag %u chars"), nchars);
+
+      /* Force to allocate at least NEWC bytes.  */
+      oldc = obstack_chunk_size (&frchain_now->frch_obstack);
+      obstack_chunk_size (&frchain_now->frch_obstack) = newc;
+
+      while (obstack_room (&frchain_now->frch_obstack) < nchars)
+        {
+          /* Not enough room in this frag.  Close it and start a new one.
+             This must be done in a loop because the created frag may not
+             be big enough if the current obstack chunk is used.  */
+          frag_wane (frag_now);
+          frag_new (0);
+        }
+
+      /* Restore the old chunk size.  */
+      obstack_chunk_size (&frchain_now->frch_obstack) = oldc;
     }
-  if (obstack_room (&frchain_now->frch_obstack) < nchars)
-    as_fatal (_("can't extend frag %u chars"), nchars);
 }
 \f
 /* Call this to close off a completed frag, and start up a new (empty)