If we use chkp_generate_extern_var_bounds for void variable just as for arrays with unknown size, we will create the following gimple seq:
# VUSE <.MEM> __size_tmp.0 = __builtin_ia32_sizeof (foo); __size_tmp.1_3 = __size_tmp.0; However, this will fail in verify_gimple_call: tree arg = gimple_call_arg (stmt, i); if ((is_gimple_reg_type (TREE_TYPE (arg)) && !is_gimple_val (arg)) || (!is_gimple_reg_type (TREE_TYPE (arg)) && !is_gimple_lvalue (arg))) { error ("invalid argument to gimple call"); debug_generic_expr (arg); return true; } ..here the TREE_TYPE(arg)==void. Any ideas for a good workaround ? Alexander 2017-04-08 21:59 GMT+02:00 Ilya Enkovich <enkovich....@gmail.com>: > 2017-04-04 18:34 GMT+03:00 Jeff Law <l...@redhat.com>: >> On 04/04/2017 09:07 AM, Alexander Ivchenko wrote: >>> >>> Hi, >>> >>> When creating static bounds for foo below we end up with: >>> >>> *((unsigned long *) &__chkp_bounds_of_foo + 8) = >>> ~(__builtin_ia32_sizeof (foo) + ((long unsigned int) &foo + >>> 18446744073709551615)); >>> >>> This fails in gimplify_function_tree with gcc_assert (!VOID_TYPE_P >>> (TREE_TYPE (*expr_p))); >>> >>> Is it OK? >>> >>> gcc/ChangeLog: >>> >>> 2017-04-04 Alexander Ivchenko <aivch...@gmail.com> >>> >>> * tree-chkp.c (chkp_get_bounds_for_decl_addr): >>> assigning zero bounds to void variables >>> >>> >>> gcc/testsuite/ChangeLog: >>> >>> 2017-04-04 Alexander Ivchenko <aivch...@gmail.com> >>> >>> * gcc.target/i386/mpx/PR79987.c: New test. >> >> I've put this (and other CHKP fixes) in the queue for gcc-8 as AFAICT it's >> not a regression. >> >> Jeff >> > > Hi, > > If we delay it for GCC8 anyway then I think we may fix it in a better way. If > we > cannot detect size of a variable then size relocations may be used. It is done > already for arrays with unknown size and also can be done for void vars. > > Thanks, > Ilya