Commit 0e9414fd by Michael Meissner

Allocate enough space for attr_printf; Use obstack_alloc instead of xmalloc.

From-SVN: r1974
parent 8696da34
...@@ -118,6 +118,9 @@ extern rtx read_rtx (); ...@@ -118,6 +118,9 @@ extern rtx read_rtx ();
static void fatal (); static void fatal ();
void fancy_abort (); void fancy_abort ();
/* enough space to reserve for printing out ints */
#define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
/* Define structures used to record attributes and values. */ /* Define structures used to record attributes and values. */
/* As each DEFINE_INSN, DEFINE_PEEPHOLE, or DEFINE_ASM_ATTRIBUTES is /* As each DEFINE_INSN, DEFINE_PEEPHOLE, or DEFINE_ASM_ATTRIBUTES is
...@@ -373,6 +376,9 @@ static void extend_range (); ...@@ -373,6 +376,9 @@ static void extend_range ();
char *xrealloc (); char *xrealloc ();
char *xmalloc (); char *xmalloc ();
static void fatal (); static void fatal ();
#define oballoc(size) obstack_alloc (hash_obstack, size)
/* Hash table for sharing RTL and strings. */ /* Hash table for sharing RTL and strings. */
...@@ -1231,7 +1237,7 @@ convert_const_symbol_ref (exp, attr) ...@@ -1231,7 +1237,7 @@ convert_const_symbol_ref (exp, attr)
char *p, *string; char *p, *string;
rtx value; rtx value;
string = p = (char *) xmalloc (2 string = p = (char *) oballoc (2
+ strlen (attr->name) + strlen (attr->name)
+ strlen (XSTR (av->value, 0))); + strlen (XSTR (av->value, 0)));
strcpy (p, attr->name); strcpy (p, attr->name);
...@@ -1378,7 +1384,7 @@ get_attr_value (value, attr, insn_code) ...@@ -1378,7 +1384,7 @@ get_attr_value (value, attr, insn_code)
|| insn_alternatives[av->first_insn->insn_code])) || insn_alternatives[av->first_insn->insn_code]))
return av; return av;
av = (struct attr_value *) xmalloc (sizeof (struct attr_value)); av = (struct attr_value *) oballoc (sizeof (struct attr_value));
av->value = value; av->value = value;
av->next = attr->first_value; av->next = attr->first_value;
attr->first_value = av; attr->first_value = av;
...@@ -1455,7 +1461,8 @@ expand_delays () ...@@ -1455,7 +1461,8 @@ expand_delays ()
newexp = attr_rtx (IF_THEN_ELSE, condexp, newexp = attr_rtx (IF_THEN_ELSE, condexp,
make_numeric_value (1), make_numeric_value (0)); make_numeric_value (1), make_numeric_value (0));
p = attr_printf (13, "*delay_%d_%d", delay->num, i / 3); p = attr_printf (sizeof ("*delay__") + MAX_DIGITS*2, "*delay_%d_%d",
delay->num, i / 3);
make_internal_attr (p, newexp, 1); make_internal_attr (p, newexp, 1);
if (have_annul_true) if (have_annul_true)
...@@ -1465,7 +1472,8 @@ expand_delays () ...@@ -1465,7 +1472,8 @@ expand_delays ()
newexp = attr_rtx (IF_THEN_ELSE, condexp, newexp = attr_rtx (IF_THEN_ELSE, condexp,
make_numeric_value (1), make_numeric_value (1),
make_numeric_value (0)); make_numeric_value (0));
p = attr_printf (18, "*annul_true_%d_%d", delay->num, i / 3); p = attr_printf (sizeof ("*annul_true__") + MAX_DIGITS*2,
"*annul_true_%d_%d", delay->num, i / 3);
make_internal_attr (p, newexp, 1); make_internal_attr (p, newexp, 1);
} }
...@@ -1476,7 +1484,8 @@ expand_delays () ...@@ -1476,7 +1484,8 @@ expand_delays ()
newexp = attr_rtx (IF_THEN_ELSE, condexp, newexp = attr_rtx (IF_THEN_ELSE, condexp,
make_numeric_value (1), make_numeric_value (1),
make_numeric_value (0)); make_numeric_value (0));
p = attr_printf (18, "*annul_false_%d_%d", delay->num, i / 3); p = attr_printf (sizeof ("*annul_false__") + MAX_DIGITS*2,
"*annul_false_%d_%d", delay->num, i / 3);
make_internal_attr (p, newexp, 1); make_internal_attr (p, newexp, 1);
} }
} }
...@@ -1735,8 +1744,8 @@ expand_units () ...@@ -1735,8 +1744,8 @@ expand_units ()
!= unit->issue_delay.max); != unit->issue_delay.max);
if (unit->needs_conflict_function) if (unit->needs_conflict_function)
{ {
str = attr_printf (strlen (unit->name) + 11, "*%s_cost_%d", str = attr_printf (strlen (unit->name) + sizeof ("*_cost_") + MAX_DIGITS,
unit->name, op->num); "*%s_cost_%d", unit->name, op->num);
make_internal_attr (str, issue_exp, 1); make_internal_attr (str, issue_exp, 1);
} }
...@@ -1939,8 +1948,8 @@ expand_units () ...@@ -1939,8 +1948,8 @@ expand_units ()
} }
/* Make an attribute for use in the blockage function. */ /* Make an attribute for use in the blockage function. */
str = attr_printf (strlen (unit->name) + 12, "*%s_block_%d", str = attr_printf (strlen (unit->name) + sizeof ("*_block_") + MAX_DIGITS,
unit->name, op->num); "*%s_block_%d", unit->name, op->num);
make_internal_attr (str, blockage, 1); make_internal_attr (str, blockage, 1);
} }
...@@ -1969,13 +1978,13 @@ expand_units () ...@@ -1969,13 +1978,13 @@ expand_units ()
newexp = operate_exp (RANGE_OP, min_blockage, max_blockage); newexp = operate_exp (RANGE_OP, min_blockage, max_blockage);
newexp = simplify_knowing (newexp, unit->condexp); newexp = simplify_knowing (newexp, unit->condexp);
str = attr_printf (strlen (unit->name) + 20, str = attr_printf (strlen (unit->name) + sizeof ("*_unit_blockage_range"),
"*%s_unit_blockage_range", unit->name); "*%s_unit_blockage_range", unit->name);
make_internal_attr (str, newexp, 4); make_internal_attr (str, newexp, 4);
} }
str = attr_printf (strlen (unit->name) + 20, "*%s_unit_ready_cost", str = attr_printf (strlen (unit->name) + sizeof ("*_unit_ready_cost"),
unit->name); "*%s_unit_ready_cost", unit->name);
} }
else else
str = "*result_ready_cost"; str = "*result_ready_cost";
...@@ -2016,7 +2025,8 @@ expand_units () ...@@ -2016,7 +2025,8 @@ expand_units ()
} }
/* Simplifying caseexp with simplify_by_exploding doesn't win. */ /* Simplifying caseexp with simplify_by_exploding doesn't win. */
str = attr_printf (strlen (unit->name) + 8, "*%s_cases", unit->name); str = attr_printf (strlen (unit->name) + sizeof ("*_cases"),
"*%s_cases", unit->name);
make_internal_attr (str, caseexp, 1); make_internal_attr (str, caseexp, 1);
} }
} }
...@@ -2064,7 +2074,7 @@ encode_units_mask (x) ...@@ -2064,7 +2074,7 @@ encode_units_mask (x)
; ;
else else
j = ~i; j = ~i;
return attr_rtx (CONST_STRING, attr_printf (4, "%d", j)); return attr_rtx (CONST_STRING, attr_printf (MAX_DIGITS, "%d", j));
case REG: case REG:
case QUEUED: case QUEUED:
...@@ -2135,7 +2145,7 @@ fill_attr (attr) ...@@ -2135,7 +2145,7 @@ fill_attr (attr)
else else
av = get_attr_value (value, attr, id->insn_code); av = get_attr_value (value, attr, id->insn_code);
ie = (struct insn_ent *) xmalloc (sizeof (struct insn_ent)); ie = (struct insn_ent *) oballoc (sizeof (struct insn_ent));
ie->insn_code = id->insn_code; ie->insn_code = id->insn_code;
ie->insn_index = id->insn_code; ie->insn_index = id->insn_code;
insert_insn_ent (av, ie); insert_insn_ent (av, ie);
...@@ -2263,7 +2273,7 @@ make_length_attrs () ...@@ -2263,7 +2273,7 @@ make_length_attrs ()
no_address_fn[i], no_address_fn[i],
address_fn[i]), address_fn[i]),
new_attr, ie->insn_code); new_attr, ie->insn_code);
new_ie = (struct insn_ent *) xmalloc (sizeof (struct insn_ent)); new_ie = (struct insn_ent *) oballoc (sizeof (struct insn_ent));
new_ie->insn_code = ie->insn_code; new_ie->insn_code = ie->insn_code;
new_ie->insn_index = ie->insn_index; new_ie->insn_index = ie->insn_index;
insert_insn_ent (new_av, new_ie); insert_insn_ent (new_av, new_ie);
...@@ -3926,7 +3936,7 @@ gen_attr (exp) ...@@ -3926,7 +3936,7 @@ gen_attr (exp)
name_ptr = XSTR (exp, 1); name_ptr = XSTR (exp, 1);
while ((p = next_comma_elt (&name_ptr)) != NULL) while ((p = next_comma_elt (&name_ptr)) != NULL)
{ {
av = (struct attr_value *) xmalloc (sizeof (struct attr_value)); av = (struct attr_value *) oballoc (sizeof (struct attr_value));
av->value = attr_rtx (CONST_STRING, p); av->value = attr_rtx (CONST_STRING, p);
av->next = attr->first_value; av->next = attr->first_value;
attr->first_value = av; attr->first_value = av;
...@@ -4066,7 +4076,7 @@ gen_insn (exp) ...@@ -4066,7 +4076,7 @@ gen_insn (exp)
{ {
struct insn_def *id; struct insn_def *id;
id = (struct insn_def *) xmalloc (sizeof (struct insn_def)); id = (struct insn_def *) oballoc (sizeof (struct insn_def));
id->next = defs; id->next = defs;
defs = id; defs = id;
id->def = exp; id->def = exp;
...@@ -4122,7 +4132,7 @@ gen_delay (def) ...@@ -4122,7 +4132,7 @@ gen_delay (def)
have_annul_false = 1; have_annul_false = 1;
} }
delay = (struct delay_desc *) xmalloc (sizeof (struct delay_desc)); delay = (struct delay_desc *) oballoc (sizeof (struct delay_desc));
delay->def = def; delay->def = def;
delay->num = ++num_delays; delay->num = ++num_delays;
delay->next = delays; delay->next = delays;
...@@ -4163,7 +4173,7 @@ gen_unit (def) ...@@ -4163,7 +4173,7 @@ gen_unit (def)
if (unit == 0) if (unit == 0)
{ {
unit = (struct function_unit *) xmalloc (sizeof (struct function_unit)); unit = (struct function_unit *) oballoc (sizeof (struct function_unit));
unit->name = name; unit->name = name;
unit->multiplicity = multiplicity; unit->multiplicity = multiplicity;
unit->simultaneity = simultaneity; unit->simultaneity = simultaneity;
...@@ -4177,7 +4187,7 @@ gen_unit (def) ...@@ -4177,7 +4187,7 @@ gen_unit (def)
} }
/* Make a new operation class structure entry and initialize it. */ /* Make a new operation class structure entry and initialize it. */
op = (struct function_unit_op *) xmalloc (sizeof (struct function_unit_op)); op = (struct function_unit_op *) oballoc (sizeof (struct function_unit_op));
op->condexp = condexp; op->condexp = condexp;
op->num = unit->num_opclasses++; op->num = unit->num_opclasses++;
op->ready = ready_cost; op->ready = ready_cost;
...@@ -5211,7 +5221,7 @@ find_attr (name, create) ...@@ -5211,7 +5221,7 @@ find_attr (name, create)
if (! create) if (! create)
return NULL; return NULL;
attr = (struct attr_desc *) xmalloc (sizeof (struct attr_desc)); attr = (struct attr_desc *) oballoc (sizeof (struct attr_desc));
attr->name = attr_string (name, strlen (name)); attr->name = attr_string (name, strlen (name));
attr->first_value = attr->default_val = NULL; attr->first_value = attr->default_val = NULL;
attr->is_numeric = attr->negative_ok = attr->is_const = attr->is_special = 0; attr->is_numeric = attr->negative_ok = attr->is_const = attr->is_special = 0;
...@@ -5302,7 +5312,7 @@ make_numeric_value (n) ...@@ -5302,7 +5312,7 @@ make_numeric_value (n)
if (n < 20 && int_values[n]) if (n < 20 && int_values[n])
return int_values[n]; return int_values[n];
p = attr_printf ((n < 1000 ? 4 : HOST_BITS_PER_INT * 3 / 10 + 3), "%d", n); p = attr_printf (MAX_DIGITS, "%d", n);
exp = attr_rtx (CONST_STRING, p); exp = attr_rtx (CONST_STRING, p);
if (n < 20) if (n < 20)
...@@ -5508,13 +5518,13 @@ from the machine description file `md'. */\n\n"); ...@@ -5508,13 +5518,13 @@ from the machine description file `md'. */\n\n");
printf ("#define operands recog_operand\n\n"); printf ("#define operands recog_operand\n\n");
/* Make `insn_alternatives'. */ /* Make `insn_alternatives'. */
insn_alternatives = (int *) xmalloc (insn_code_number * sizeof (int)); insn_alternatives = (int *) oballoc (insn_code_number * sizeof (int));
for (id = defs; id; id = id->next) for (id = defs; id; id = id->next)
if (id->insn_code >= 0) if (id->insn_code >= 0)
insn_alternatives[id->insn_code] = (1 << id->num_alternatives) - 1; insn_alternatives[id->insn_code] = (1 << id->num_alternatives) - 1;
/* Make `insn_n_alternatives'. */ /* Make `insn_n_alternatives'. */
insn_n_alternatives = (int *) xmalloc (insn_code_number * sizeof (int)); insn_n_alternatives = (int *) oballoc (insn_code_number * sizeof (int));
for (id = defs; id; id = id->next) for (id = defs; id; id = id->next)
if (id->insn_code >= 0) if (id->insn_code >= 0)
insn_n_alternatives[id->insn_code] = id->num_alternatives; insn_n_alternatives[id->insn_code] = id->num_alternatives;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment