2011-07-25 Tristan Gingold <gingold@adacore.com>
* frags.c (frag_grow): Simplify the code.
This commit is contained in:
parent
d9b3f62eb2
commit
179809c050
|
@ -1,3 +1,7 @@
|
||||||
|
2011-07-25 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
|
* frags.c (frag_grow): Simplify the code.
|
||||||
|
|
||||||
2011-07-24 Maciej W. Rozycki <macro@codesourcery.com>
|
2011-07-24 Maciej W. Rozycki <macro@codesourcery.com>
|
||||||
Chao-ying Fu <fu@mips.com>
|
Chao-ying Fu <fu@mips.com>
|
||||||
Richard Sandiford <rdsandiford@googlemail.com>
|
Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
46
gas/frags.c
46
gas/frags.c
|
@ -75,41 +75,47 @@ frag_alloc (struct obstack *ob)
|
||||||
return ptr;
|
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"
|
If there is no room, close of the current frag with a ".fill 0"
|
||||||
and begin a new frag. Unless the new frag has nchars chars available
|
and begin a new frag. Do not set up any fields of *now_frag. */
|
||||||
do not return. Do not set up any fields of *now_frag. */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
frag_grow (unsigned int nchars)
|
frag_grow (unsigned int nchars)
|
||||||
{
|
{
|
||||||
if (obstack_room (&frchain_now->frch_obstack) < nchars)
|
if (obstack_room (&frchain_now->frch_obstack) < nchars)
|
||||||
{
|
{
|
||||||
unsigned int n;
|
|
||||||
long oldc;
|
long oldc;
|
||||||
|
long newc;
|
||||||
|
|
||||||
|
/* Not enough room in this frag. Close it. */
|
||||||
frag_wane (frag_now);
|
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
|
/* Try to allocate a bit more than needed right now. But don't do
|
||||||
this if we would waste too much memory. Especially necessary
|
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)
|
if (nchars < 0x10000)
|
||||||
frchain_now->frch_obstack.chunk_size = 2 * nchars;
|
newc = 2 * nchars;
|
||||||
else
|
else
|
||||||
frchain_now->frch_obstack.chunk_size = nchars + 0x10000;
|
newc = nchars + 0x10000;
|
||||||
frchain_now->frch_obstack.chunk_size += SIZEOF_STRUCT_FRAG;
|
newc += SIZEOF_STRUCT_FRAG;
|
||||||
if (frchain_now->frch_obstack.chunk_size > 0)
|
|
||||||
while ((n = obstack_room (&frchain_now->frch_obstack)) < nchars
|
if (newc > 0)
|
||||||
&& (unsigned long) frchain_now->frch_obstack.chunk_size > nchars)
|
{
|
||||||
{
|
/* Force to allocate at least NEWC bytes. */
|
||||||
frag_wane (frag_now);
|
oldc = obstack_chunk_size (&frchain_now->frch_obstack);
|
||||||
frag_new (0);
|
obstack_chunk_size (&frchain_now->frch_obstack) = newc;
|
||||||
}
|
|
||||||
frchain_now->frch_obstack.chunk_size = oldc;
|
/* 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);
|
||||||
}
|
}
|
||||||
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)
|
/* Call this to close off a completed frag, and start up a new (empty)
|
||||||
|
|
Loading…
Reference in New Issue