#include "errors.h"
#include "gensupport.h"
#include "vec.h"
+#include "vecprim.h"
/* This structure contains all the information needed to describe one
set of extractions methods. Each method may be used by more than
/* This structure is used by gen_insn and walk_rtx to accumulate the
data that will be used to produce an extractions structure. */
-DEF_VEC_I(int);
-DEF_VEC_I(char);
DEF_VEC_P(locstr);
-DEF_VEC_ALLOC_I(int,heap);
-DEF_VEC_ALLOC_I(char,heap);
DEF_VEC_ALLOC_P(locstr,heap);
struct accum_extract
/* Forward declarations. */
static void walk_rtx (rtx, struct accum_extract *);
-static void record_insn_name (int, const char *);
static void
gen_insn (rtx insn, int insn_code_number)
exist and be NULL, or not yet exist within the vector. In the latter
case the vector is enlarged as appropriate. */
static void
-VEC_safe_set_locstr (VEC(locstr,heap) *v, unsigned int ix, char *str)
+VEC_safe_set_locstr (VEC(locstr,heap) **vp, unsigned int ix, char *str)
{
- if (ix < VEC_length (locstr, v))
+ if (ix < VEC_length (locstr, *vp))
{
- gcc_assert (VEC_index (locstr, v, ix) == 0);
- VEC_replace (locstr, v, ix, str);
+ gcc_assert (VEC_index (locstr, *vp, ix) == 0);
+ VEC_replace (locstr, *vp, ix, str);
}
else
{
- while (ix > VEC_length (locstr, v))
- VEC_safe_push (locstr,heap, v, 0);
- VEC_safe_push (locstr,heap, v, str);
+ while (ix > VEC_length (locstr, *vp))
+ VEC_safe_push (locstr, heap, *vp, 0);
+ VEC_safe_push (locstr, heap, *vp, str);
}
}
VEC_char_to_string (VEC(char,heap) *v)
{
size_t n = VEC_length (char, v);
- char *s = xmalloc (n + 1);
+ char *s = XNEWVEC (char, n + 1);
memcpy (s, VEC_address (char, v), n);
s[n] = '\0';
return s;
case MATCH_OPERAND:
case MATCH_SCRATCH:
- VEC_safe_set_locstr (acc->oplocs, XINT (x, 0),
+ VEC_safe_set_locstr (&acc->oplocs, XINT (x, 0),
VEC_char_to_string (acc->pathstr));
break;
case MATCH_OPERATOR:
case MATCH_PARALLEL:
- VEC_safe_set_locstr (acc->oplocs, XINT (x, 0),
+ VEC_safe_set_locstr (&acc->oplocs, XINT (x, 0),
VEC_char_to_string (acc->pathstr));
base = (code == MATCH_OPERATOR ? '0' : 'a');
while ((desc = read_md_rtx (&line_no, &insn_code_number)) != NULL)
{
if (GET_CODE (desc) == DEFINE_INSN)
- {
- record_insn_name (insn_code_number, XSTR (desc, 0));
- gen_insn (desc, insn_code_number);
- }
+ gen_insn (desc, insn_code_number);
else if (GET_CODE (desc) == DEFINE_PEEPHOLE)
{
- struct code_ptr *link = xmalloc (sizeof (struct code_ptr));
+ struct code_ptr *link = XNEW (struct code_ptr);
link->insn_code = insn_code_number;
link->next = peepholes;
fflush (stdout);
return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
}
-
-/* Define this so we can link with print-rtl.o to get debug_rtx function. */
-
-/* Holds an array of names indexed by insn_code_number. */
-static char **insn_name_ptr = 0;
-static int insn_name_ptr_size = 0;
-
-const char *
-get_insn_name (int code ATTRIBUTE_UNUSED)
-{
- if (code < insn_name_ptr_size)
- return insn_name_ptr[code];
- else
- return NULL;
-}
-
-static void
-record_insn_name (int code, const char *name)
-{
- static const char *last_real_name = "insn";
- static int last_real_code = 0;
- char *new;
-
- if (insn_name_ptr_size <= code)
- {
- int new_size;
- new_size = (insn_name_ptr_size ? insn_name_ptr_size * 2 : 512);
- insn_name_ptr = xrealloc (insn_name_ptr, sizeof(char *) * new_size);
- memset (insn_name_ptr + insn_name_ptr_size, 0,
- sizeof(char *) * (new_size - insn_name_ptr_size));
- insn_name_ptr_size = new_size;
- }
-
- if (!name || name[0] == '\0')
- {
- new = xmalloc (strlen (last_real_name) + 10);
- sprintf (new, "%s+%d", last_real_name, code - last_real_code);
- }
- else
- {
- last_real_name = new = xstrdup (name);
- last_real_code = code;
- }
-
- insn_name_ptr[code] = new;
-}