/* Generate code from machine description to extract operands from insn as rtl.
Copyright (C) 1987, 1991, 1992, 1993, 1997, 1998, 1999, 2000, 2003,
- 2004, 2005, 2007
+ 2004, 2005, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of GCC.
#include "tm.h"
#include "rtl.h"
#include "errors.h"
+#include "read-md.h"
#include "gensupport.h"
#include "vec.h"
#include "vecprim.h"
VEC(char,heap) *pathstr;
};
+int line_no;
+
/* Forward declarations. */
static void walk_rtx (rtx, struct accum_extract *);
/* Otherwise, make a new extraction method. We stash the arrays
after the extraction structure in memory. */
- p = xmalloc (sizeof (struct extraction)
+ p = XNEWVAR (struct extraction, sizeof (struct extraction)
+ op_count*sizeof (char *)
+ dup_count*sizeof (char *)
+ dup_count*sizeof (int));
{
if (ix < VEC_length (locstr, *vp))
{
- gcc_assert (VEC_index (locstr, *vp, ix) == 0);
- VEC_replace (locstr, *vp, ix, str);
+ if (VEC_index (locstr, *vp, ix))
+ {
+ message_with_line (line_no, "repeated operand number %d", ix);
+ have_error = 1;
+ }
+ else
+ VEC_replace (locstr, *vp, ix, str);
}
else
{
#include \"rtl.h\"\n\
#include \"insn-config.h\"\n\
#include \"recog.h\"\n\
-#include \"toplev.h\"\n\
+#include \"diagnostic-core.h\"\n\
\n\
/* This variable is used as the \"location\" of any missing operand\n\
whose numbers are skipped by a given pattern. */\n\
struct code_ptr *link;
const char *name;
int insn_code_number;
- int line_no;
progname = "genextract";
- if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
+ if (!init_rtx_reader_args (argc, argv))
return (FATAL_EXIT_CODE);
/* Read the machine description. */
}
}
+ if (have_error)
+ return FATAL_EXIT_CODE;
+
print_header ();
/* Write out code to handle peepholes and the insn_codes that it should