On Thu, 16 Jul 2015, Richard Biener wrote:

> 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.

I have a patch to do that which also fixes the segfault.

Richard.

> 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