On Thu, 16 Jul 2015, Prathamesh Kulkarni wrote:

> On 16 July 2015 at 12:39, Richard Biener <rguent...@suse.de> wrote:
> > On Wed, 15 Jul 2015, Prathamesh Kulkarni wrote:
> >
> >> Hi,
> >> We allow c_expr to be empty which accepts cases like the following:
> >>
> >> (simplify
> >>   match-operand
> >>   (if ()
> >>     result-operand))
> >>
> >> (simplify
> >>   match-operand
> >>   {})
> >
> > Yes we do.  We also do not reject various other "bad" forms like
> >
> >  { ( blah! }
> >
> > so I am not sure treating empty ones specially makes sense.  After
> > all a c-expr is just a list of preprocessing tokens we re-inject
> > into the generated C code.
> Well the empty () causes genmatch to segfault.
> (simplify
>   (plus @x @y)
>     (if ()
>       @x)))
> 
> segfaults here at genmatch.c:2583
> output_line_directive (f, ife->cond->code[0].src_loc);
> 
> IIUC, since we bail out early from parse_c_expr on "()", code remains
> vNULL and accessing code[0] leads to segfault.

Ah, yeah.  I've meant to fix that by adding a src_loc member to
struct operand so I can just use ife->cond->src_loc there.

That would be a general good cleanup anyway and might allow for
some fatal () to be converted to fatal_at.

Richard.

> backtrace with gdb:
> #0  operator[] (ix=0, this=0x6bb628) at ../../src/gcc/vec.h:1180
> #1  dt_simplify::gen_1 (this=this@entry=0x6bac30,
> f=f@entry=0x7ffff7dd4400 <_IO_2_1_stdout_>, indent=indent@entry=10,
> gimple=gimple@entry=true, result=0x6bb5e0) at
> ../../src/gcc/genmatch.c:2583
> #2  0x0000000000413430 in dt_simplify::gen (this=0x6bac30,
> f=0x7ffff7dd4400 <_IO_2_1_stdout_>, indent=10, gimple=<optimized out>)
> at ../../src/gcc/genmatch.c:2873
> #3  0x000000000040de6f in dt_node::gen_kids_1
> (this=this@entry=0x6babc0, f=f@entry=0x7ffff7dd4400 <_IO_2_1_stdout_>,
> indent=indent@entry=8, gimple=gimple@entry=true,
> gimple_exprs=gimple_exprs@entry=...,
>     generic_exprs=generic_exprs@entry=..., fns=fns@entry=...,
> generic_fns=generic_fns@entry=..., preds=preds@entry=...,
> others=others@entry=...) at ../../src/gcc/genmatch.c:2510
> #4  0x000000000040ecf3 in dt_node::gen_kids (this=0x6babc0,
> f=0x7ffff7dd4400 <_IO_2_1_stdout_>, indent=8, gimple=true) at
> ../../src/gcc/genmatch.c:2312
> #5  0x000000000040f491 in dt_operand::gen (this=0x6babc0,
> f=0x7ffff7dd4400 <_IO_2_1_stdout_>, indent=8, gimple=<optimized out>)
> at ../../src/gcc/genmatch.c:2548
> #6  0x000000000040e3a2 in dt_node::gen_kids (this=0x6bab80,
> f=0x7ffff7dd4400 <_IO_2_1_stdout_>, indent=8, gimple=true) at
> ../../src/gcc/genmatch.c:2298
> #7  0x000000000040f491 in dt_operand::gen (this=0x6bab80,
> f=0x7ffff7dd4400 <_IO_2_1_stdout_>, indent=8, gimple=<optimized out>)
> at ../../src/gcc/genmatch.c:2548
> #8  0x000000000040e3a2 in dt_node::gen_kids (this=0x6bab40,
> f=0x7ffff7dd4400 <_IO_2_1_stdout_>, indent=8, gimple=true) at
> ../../src/gcc/genmatch.c:2298
> #9  0x000000000040f667 in decision_tree::gen_gimple
> (this=0x7fffffffde00, f=0x7ffff7dd4400 <_IO_2_1_stdout_>) at
> ../../src/gcc/genmatch.c:2913
> #10 0x000000000040835e in main (argc=7056432, argv=0x0) at
> ../../src/gcc/genmatch.c:4135
> 
> Thanks,
> Prathamesh
> >
> >> The attached patch rejects empty c_expr.
> >> Ok for trunk after bootstrap + test ?
> >>
> >> Thank you,
> >> Prathamesh
> >>
> >
> > --
> > Richard Biener <rguent...@suse.de>
> > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Dilip Upmanyu, 
> > Graham Norton, HRB 21284 (AG Nuernberg)
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Dilip Upmanyu, Graham 
Norton, HRB 21284 (AG Nuernberg)

Reply via email to