Line 83... |
Line 83... |
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;
|
|
|
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
|
/* Check for possible overflow. */
|
&& (unsigned long) frchain_now->frch_obstack.chunk_size > nchars)
|
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_wane (frag_now);
|
frag_new (0);
|
frag_new (0);
|
}
|
}
|
frchain_now->frch_obstack.chunk_size = oldc;
|
|
|
/* 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);
|
|
}
|
}
|
|
|
/* 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)
|
frag, in the same subsegment as the old frag.
|
frag, in the same subsegment as the old frag.
|
[frchain_now remains the same but frag_now is updated.]
|
[frchain_now remains the same but frag_now is updated.]
|
Line 191... |
Line 198... |
retval = obstack_next_free (&frchain_now->frch_obstack);
|
retval = obstack_next_free (&frchain_now->frch_obstack);
|
obstack_blank_fast (&frchain_now->frch_obstack, nchars);
|
obstack_blank_fast (&frchain_now->frch_obstack, nchars);
|
return (retval);
|
return (retval);
|
}
|
}
|
|
|
/* Start a new frag unless we have max_chars more chars of room in the
|
/* Close the current frag, setting its fields for a relaxable frag. Start a
|
current frag. Close off the old frag with a .fill 0.
|
new frag. */
|
|
|
Set up a machine_dependent relaxable frag, then start a new frag.
|
|
Return the address of the 1st char of the var part of the old frag
|
|
to write into. */
|
|
|
|
char *
|
static void
|
frag_var (relax_stateT type, int max_chars, int var, relax_substateT subtype,
|
frag_var_init (relax_stateT type, int max_chars, int var,
|
symbolS *symbol, offsetT offset, char *opcode)
|
relax_substateT subtype, symbolS *symbol, offsetT offset,
|
|
char *opcode)
|
{
|
{
|
register char *retval;
|
|
|
|
frag_grow (max_chars);
|
|
retval = obstack_next_free (&frchain_now->frch_obstack);
|
|
obstack_blank_fast (&frchain_now->frch_obstack, max_chars);
|
|
frag_now->fr_var = var;
|
frag_now->fr_var = var;
|
frag_now->fr_type = type;
|
frag_now->fr_type = type;
|
frag_now->fr_subtype = subtype;
|
frag_now->fr_subtype = subtype;
|
frag_now->fr_symbol = symbol;
|
frag_now->fr_symbol = symbol;
|
frag_now->fr_offset = offset;
|
frag_now->fr_offset = offset;
|
Line 222... |
Line 221... |
#endif
|
#endif
|
#ifdef TC_FRAG_INIT
|
#ifdef TC_FRAG_INIT
|
TC_FRAG_INIT (frag_now);
|
TC_FRAG_INIT (frag_now);
|
#endif
|
#endif
|
as_where (&frag_now->fr_file, &frag_now->fr_line);
|
as_where (&frag_now->fr_file, &frag_now->fr_line);
|
|
|
frag_new (max_chars);
|
frag_new (max_chars);
|
return (retval);
|
}
|
|
|
|
/* Start a new frag unless we have max_chars more chars of room in the
|
|
current frag. Close off the old frag with a .fill 0.
|
|
|
|
Set up a machine_dependent relaxable frag, then start a new frag.
|
|
Return the address of the 1st char of the var part of the old frag
|
|
to write into. */
|
|
|
|
char *
|
|
frag_var (relax_stateT type, int max_chars, int var, relax_substateT subtype,
|
|
symbolS *symbol, offsetT offset, char *opcode)
|
|
{
|
|
register char *retval;
|
|
|
|
frag_grow (max_chars);
|
|
retval = obstack_next_free (&frchain_now->frch_obstack);
|
|
obstack_blank_fast (&frchain_now->frch_obstack, max_chars);
|
|
frag_var_init (type, max_chars, var, subtype, symbol, offset, opcode);
|
|
return retval;
|
}
|
}
|
|
|
/* OVE: This variant of frag_var assumes that space for the tail has been
|
/* OVE: This variant of frag_var assumes that space for the tail has been
|
allocated by caller.
|
allocated by caller.
|
No call to frag_grow is done. */
|
No call to frag_grow is done. */
|
Line 238... |
Line 257... |
char *opcode)
|
char *opcode)
|
{
|
{
|
register char *retval;
|
register char *retval;
|
|
|
retval = obstack_next_free (&frchain_now->frch_obstack);
|
retval = obstack_next_free (&frchain_now->frch_obstack);
|
frag_now->fr_var = var;
|
frag_var_init (type, max_chars, var, subtype, symbol, offset, opcode);
|
frag_now->fr_type = type;
|
|
frag_now->fr_subtype = subtype;
|
return retval;
|
frag_now->fr_symbol = symbol;
|
|
frag_now->fr_offset = offset;
|
|
frag_now->fr_opcode = opcode;
|
|
#ifdef USING_CGEN
|
|
frag_now->fr_cgen.insn = 0;
|
|
frag_now->fr_cgen.opindex = 0;
|
|
frag_now->fr_cgen.opinfo = 0;
|
|
#endif
|
|
#ifdef TC_FRAG_INIT
|
|
TC_FRAG_INIT (frag_now);
|
|
#endif
|
|
as_where (&frag_now->fr_file, &frag_now->fr_line);
|
|
frag_new (max_chars);
|
|
return (retval);
|
|
}
|
}
|
|
|
/* Reduce the variable end of a frag to a harmless state. */
|
/* Reduce the variable end of a frag to a harmless state. */
|
|
|
void
|
void
|