rtx
get_hard_reg_initial_val (enum machine_mode mode, unsigned int regno)
{
  struct initial_value_struct *ivs;
  rtx rv;

  rv = has_hard_reg_initial_val (mode, regno);
  if (rv)
    return rv;

  ivs = crtl->hard_reg_initial_vals;
  if (ivs == 0)
    {
      ivs = ggc_alloc_initial_value_struct ();
      ivs->num_entries = 0;
      ivs->max_entries = 5;
      ivs->entries = ggc_alloc_vec_initial_value_pair (5);
      crtl->hard_reg_initial_vals = ivs;
    }

  if (ivs->num_entries >= ivs->max_entries)
    {
      ivs->max_entries += 5;
      ivs->entries = GGC_RESIZEVEC (initial_value_pair, ivs->entries,
				    ivs->max_entries);
    }

  ivs->entries[ivs->num_entries].hard_reg = gen_rtx_REG (mode, regno);
  ivs->entries[ivs->num_entries].pseudo = gen_reg_rtx (mode);

  return ivs->entries[ivs->num_entries++].pseudo;
}
Пример #2
0
static void
set_constant_entry (CPool *cpool, int index, int tag, jword value)
{
  if (cpool->data == NULL)
    {
      cpool->capacity = 100;
      cpool->tags = ggc_cleared_vec_alloc<uint8> (cpool->capacity);
      cpool->data = ggc_cleared_vec_alloc<cpool_entry> (cpool->capacity);
      cpool->count = 1;
    }
  if (index >= cpool->capacity)
    {
      int old_cap = cpool->capacity;
      cpool->capacity *= 2;
      if (index >= cpool->capacity)
	cpool->capacity = index + 10;
      cpool->tags = GGC_RESIZEVEC (uint8, cpool->tags, cpool->capacity);
      cpool->data = GGC_RESIZEVEC (union cpool_entry, cpool->data,
				   cpool->capacity);

      /* Make sure GC never sees uninitialized tag values.  */
      memset (cpool->tags + old_cap, 0, cpool->capacity - old_cap);
      memset (cpool->data + old_cap, 0,
	      (cpool->capacity - old_cap) * sizeof (union cpool_entry));
    }