I just happened to write (define_insn "foo" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [] 42))] "" "xxx\t%0")
This is because I have an instruction which sets a register but doesn't depend on anything visible to gcc. When I tried to rebuild gcc, genflags crashed, because it tried to get the length of an empty vector (in max_operand_1, calling XVECLEN, which tried to dereference a NULL pointer). This patch fixes the immediate crash, but is this the right thing to do? Or should I always put something inside the vector, even if there is nothing meaningful to put in there? If it is required to always put something inside a vector, then I think that read_rtx_1 should give an error upon seeing an empty vector (at least for case 'E'). Otherwise, I think we need something like this patch, as there is a lot of code which expects to call XVECLEN on any 'E' format. Ian Index: read-rtl.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/read-rtl.c,v retrieving revision 1.32 diff -p -u -r1.32 read-rtl.c --- read-rtl.c 29 Sep 2004 11:23:11 -0000 1.32 +++ read-rtl.c 11 Feb 2005 02:21:58 -0000 @@ -1247,12 +1247,9 @@ read_rtx_1 (FILE *infile) list_counter++; obstack_ptr_grow (&vector_stack, read_rtx_1 (infile)); } - if (list_counter > 0) - { - return_vec = rtvec_alloc (list_counter); - memcpy (&return_vec->elem[0], obstack_finish (&vector_stack), - list_counter * sizeof (rtx)); - } + return_vec = rtvec_alloc (list_counter); + memcpy (&return_vec->elem[0], obstack_finish (&vector_stack), + list_counter * sizeof (rtx)); XVEC (return_rtx, i) = return_vec; obstack_free (&vector_stack, NULL); /* close bracket gotten */