summaryrefslogtreecommitdiff
path: root/gcc/genattrtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/genattrtab.c')
-rw-r--r--gcc/genattrtab.c107
1 files changed, 54 insertions, 53 deletions
diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c
index c69ad537696..aecd27c1ffa 100644
--- a/gcc/genattrtab.c
+++ b/gcc/genattrtab.c
@@ -749,7 +749,7 @@ attr_printf VPARAMS ((register int len, const char *fmt, ...))
const char *fmt;
#endif
va_list p;
- register char *str;
+ char str[256];
VA_START (p, fmt);
@@ -758,8 +758,9 @@ attr_printf VPARAMS ((register int len, const char *fmt, ...))
fmt = va_arg (p, const char *);
#endif
- /* Print the string into a temporary location. */
- str = (char *) alloca (len);
+ if (len > 255) /* leave room for \0 */
+ abort ();
+
vsprintf (str, fmt, p);
va_end (p);
@@ -1983,12 +1984,12 @@ expand_units ()
/* Create an array of ops for each unit. Add an extra unit for the
result_ready_cost function that has the ops of all other units. */
unit_ops = (struct function_unit_op ***)
- alloca ((num_units + 1) * sizeof (struct function_unit_op **));
+ xmalloc ((num_units + 1) * sizeof (struct function_unit_op **));
unit_num = (struct function_unit **)
- alloca ((num_units + 1) * sizeof (struct function_unit *));
+ xmalloc ((num_units + 1) * sizeof (struct function_unit *));
unit_num[num_units] = unit = (struct function_unit *)
- alloca (sizeof (struct function_unit));
+ xmalloc (sizeof (struct function_unit));
unit->num = num_units;
unit->num_opclasses = 0;
@@ -1997,7 +1998,7 @@ expand_units ()
unit_num[num_units]->num_opclasses += unit->num_opclasses;
unit_num[unit->num] = unit;
unit_ops[unit->num] = op_array = (struct function_unit_op **)
- alloca (unit->num_opclasses * sizeof (struct function_unit_op *));
+ xmalloc (unit->num_opclasses * sizeof (struct function_unit_op *));
for (op = unit->ops; op; op = op->next)
op_array[op->num] = op;
@@ -2005,7 +2006,7 @@ expand_units ()
/* Compose the array of ops for the extra unit. */
unit_ops[num_units] = op_array = (struct function_unit_op **)
- alloca (unit_num[num_units]->num_opclasses
+ xmalloc (unit_num[num_units]->num_opclasses
* sizeof (struct function_unit_op *));
for (unit = units, i = 0; unit; i += unit->num_opclasses, unit = unit->next)
@@ -2571,9 +2572,10 @@ simplify_cond (exp, insn_code, insn_index)
rtx defval = XEXP (exp, 1);
rtx new_defval = XEXP (exp, 1);
int len = XVECLEN (exp, 0);
- rtx *tests = (rtx *) alloca (len * sizeof (rtx));
+ rtx *tests = (rtx *) xmalloc (len * sizeof (rtx));
int allsame = 1;
char *first_spacer;
+ rtx ret;
/* This lets us free all storage allocated below, if appropriate. */
first_spacer = (char *) obstack_finish (rtl_obstack);
@@ -2656,11 +2658,12 @@ simplify_cond (exp, insn_code, insn_index)
if (len == 0)
{
if (GET_CODE (defval) == COND)
- return simplify_cond (defval, insn_code, insn_index);
- return defval;
+ ret = simplify_cond (defval, insn_code, insn_index);
+ else
+ ret = defval;
}
else if (allsame)
- return exp;
+ ret = exp;
else
{
rtx newexp = rtx_alloc (COND);
@@ -2668,8 +2671,10 @@ simplify_cond (exp, insn_code, insn_index)
XVEC (newexp, 0) = rtvec_alloc (len);
memcpy (XVEC (newexp, 0)->elem, tests, len * sizeof (rtx));
XEXP (newexp, 1) = new_defval;
- return newexp;
+ ret = newexp;
}
+ free (tests);
+ return ret;
}
/* Remove an insn entry from an attribute value. */
@@ -2864,13 +2869,15 @@ evaluate_eq_attr (exp, value, insn_code, insn_index)
}
else if (GET_CODE (value) == SYMBOL_REF)
{
- char *p, *string;
+ char *p;
+ char string[256];
if (GET_CODE (exp) != EQ_ATTR)
abort ();
- string = (char *) alloca (2 + strlen (XSTR (exp, 0))
- + strlen (XSTR (exp, 1)));
+ if (strlen (XSTR (exp, 0)) + strlen (XSTR (exp, 1)) + 2 > 256)
+ abort ();
+
strcpy (string, XSTR (exp, 0));
strcat (string, "_");
strcat (string, XSTR (exp, 1));
@@ -3513,7 +3520,7 @@ optimize_attrs ()
/* Make 2 extra elements, for "code" values -2 and -1. */
insn_code_values
- = (struct attr_value_list **) alloca ((insn_code_number + 2)
+ = (struct attr_value_list **) xmalloc ((insn_code_number + 2)
* sizeof (struct attr_value_list *));
memset ((char *) insn_code_values, 0,
(insn_code_number + 2) * sizeof (struct attr_value_list *));
@@ -3521,9 +3528,6 @@ optimize_attrs ()
/* Offset the table address so we can index by -2 or -1. */
insn_code_values += 2;
- /* Allocate the attr_value_list structures using xmalloc rather than
- alloca, because using alloca can overflow the maximum permitted
- stack limit on SPARC Lynx. */
iv = ivbuf = ((struct attr_value_list *)
xmalloc (num_insn_ents * sizeof (struct attr_value_list)));
@@ -3593,6 +3597,7 @@ optimize_attrs ()
}
free (ivbuf);
+ free (insn_code_values - 2);
}
#if 0
@@ -3641,6 +3646,7 @@ simplify_by_exploding (exp)
rtx *condtest, *condval;
int i, j, total, ndim = 0;
int most_tests, num_marks, new_marks;
+ rtx ret;
/* Locate all the EQ_ATTR expressions. */
if (! find_and_mark_used_attributes (exp, &list, &ndim) || ndim == 0)
@@ -3655,7 +3661,7 @@ simplify_by_exploding (exp)
cover the domain of the attribute. This makes the expanded COND form
order independent. */
- space = (struct dimension *) alloca (ndim * sizeof (struct dimension));
+ space = (struct dimension *) xmalloc (ndim * sizeof (struct dimension));
total = 1;
for (ndim = 0; list; ndim++)
@@ -3710,8 +3716,8 @@ simplify_by_exploding (exp)
for (i = 0; i < ndim; i++)
space[i].current_value = space[i].values;
- condtest = (rtx *) alloca (total * sizeof (rtx));
- condval = (rtx *) alloca (total * sizeof (rtx));
+ condtest = (rtx *) xmalloc (total * sizeof (rtx));
+ condval = (rtx *) xmalloc (total * sizeof (rtx));
/* Expand the tests and values by iterating over all values in the
attribute space. */
@@ -3727,6 +3733,7 @@ simplify_by_exploding (exp)
/* We are now finished with the original expression. */
unmark_used_attributes (0, space, ndim);
+ free (space);
/* Find the most used constant value and make that the default. */
most_tests = -1;
@@ -3753,27 +3760,32 @@ simplify_by_exploding (exp)
/* Give up if nothing is constant. */
if (num_marks == 0)
- return exp;
-
+ ret = exp;
+
/* If all values are the default, use that. */
- if (total == most_tests)
- return defval;
+ else if (total == most_tests)
+ ret = defval;
/* Make a COND with the most common constant value the default. (A more
complex method where tests with the same value were combined didn't
seem to improve things.) */
- condexp = rtx_alloc (COND);
- XVEC (condexp, 0) = rtvec_alloc ((total - most_tests) * 2);
- XEXP (condexp, 1) = defval;
- for (i = j = 0; i < total; i++)
- if (condval[i] != defval)
- {
- XVECEXP (condexp, 0, 2 * j) = condtest[i];
- XVECEXP (condexp, 0, 2 * j + 1) = condval[i];
- j++;
- }
-
- return condexp;
+ else
+ {
+ condexp = rtx_alloc (COND);
+ XVEC (condexp, 0) = rtvec_alloc ((total - most_tests) * 2);
+ XEXP (condexp, 1) = defval;
+ for (i = j = 0; i < total; i++)
+ if (condval[i] != defval)
+ {
+ XVECEXP (condexp, 0, 2 * j) = condtest[i];
+ XVECEXP (condexp, 0, 2 * j + 1) = condval[i];
+ j++;
+ }
+ ret = condexp;
+ }
+ free (condtest);
+ free (condval);
+ return ret;
}
/* Set the MEM_VOLATILE_P flag for all EQ_ATTR expressions in EXP and
@@ -5677,7 +5689,7 @@ write_complex_function (unit, name, connection)
struct attr_desc *case_attr, *attr;
struct attr_value *av, *common_av;
rtx value;
- char *str;
+ char str[256];
int using_case;
int i;
@@ -5694,7 +5706,8 @@ write_complex_function (unit, name, connection)
printf (" {\n");
/* Write the `switch' statement to get the case value. */
- str = (char *) alloca (strlen (unit->name) + strlen (name) + strlen (connection) + 10);
+ if (strlen (unit->name) + sizeof "*_cases" > 256)
+ abort ();
sprintf (str, "*%s_cases", unit->name);
case_attr = find_attr (str, 0);
if (! case_attr)
@@ -6048,18 +6061,6 @@ main (argc, argv)
if (argc <= 1)
fatal ("No input file name.");
-#if defined (RLIMIT_STACK) && defined (HAVE_GETRLIMIT) && defined (HAVE_SETRLIMIT)
- /* Get rid of any avoidable limit on stack size. */
- {
- struct rlimit rlim;
-
- /* Set the stack limit huge so that alloca does not fail. */
- getrlimit (RLIMIT_STACK, &rlim);
- rlim.rlim_cur = rlim.rlim_max;
- setrlimit (RLIMIT_STACK, &rlim);
- }
-#endif
-
if (init_md_reader (argv[1]) != SUCCESS_EXIT_CODE)
return (FATAL_EXIT_CODE);