OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gas/] [frags.c] - Diff between revs 147 and 160

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 147 Rev 160
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.