From 088b3cd0cecf4795b1b58224c03bcffeebe2dc73 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 27 Jul 2011 06:54:12 +0000 Subject: [PATCH] 2011-07-27 Tristan Gingold * frags.c (frag_grow): Revert previous patch. --- gas/ChangeLog | 4 ++++ gas/frags.c | 46 ++++++++++++++++++++-------------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 9148613210c..bcafeb0455f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,7 @@ +2011-07-27 Tristan Gingold + + * frags.c (frag_grow): Revert previous patch. + 2011-07-26 Kazuhiro Inaoka * config/tc-rx.c (md_convert_frag): Fix encoding of beq.a diff --git a/gas/frags.c b/gas/frags.c index a0a0a298c99..fe3b4cced21 100644 --- a/gas/frags.c +++ b/gas/frags.c @@ -75,47 +75,41 @@ frag_alloc (struct obstack *ob) return ptr; } -/* Try to augment current frag by NCHARS chars. +/* Try to augment current frag by nchars chars. If there is no room, close of the current frag with a ".fill 0" - and begin a new frag. Do not set up any fields of *now_frag. */ + and begin a new frag. Unless the new frag has nchars chars available + do not return. Do not set up any fields of *now_frag. */ void frag_grow (unsigned int nchars) { if (obstack_room (&frchain_now->frch_obstack) < nchars) { + unsigned int n; long oldc; - long newc; - /* Not enough room in this frag. Close it. */ 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) - newc = 2 * nchars; + frchain_now->frch_obstack.chunk_size = 2 * nchars; else - newc = nchars + 0x10000; - newc += SIZEOF_STRUCT_FRAG; - - if (newc > 0) - { - /* Force to allocate at least NEWC bytes. */ - oldc = obstack_chunk_size (&frchain_now->frch_obstack); - obstack_chunk_size (&frchain_now->frch_obstack) = newc; - - /* Do the real work: create a new frag. */ - frag_new (0); - - /* Restore the old chunk size. */ - obstack_chunk_size (&frchain_now->frch_obstack) = oldc; - } - - /* Check for success (also handles negative values of NEWC). */ - if (obstack_room (&frchain_now->frch_obstack) < nchars) - as_fatal (_("can't extend frag %u chars"), nchars); + 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; } + if (obstack_room (&frchain_now->frch_obstack) < nchars) + as_fatal (_("can't extend frag %u chars"), nchars); } /* Call this to close off a completed frag, and start up a new (empty) -- 2.30.2