Hi Ilya, I tried changing builtin call so it gets address of a decl instead of a decl, but it looked very unnatural and I hit some other problems implementing that. Keeping in mind the exposure of this problem, I think it is not worth it. I propose to reconsider the first and the simplest patch in this thread: just returning zero bounds for void vars. The standard does not specify that size anyways. What do you think?
Alexander 2017-05-11 20:37 GMT+02:00 Ilya Enkovich <enkovich....@gmail.com>: > 2017-05-11 0:05 GMT+03:00 Alexander Ivchenko <aivch...@gmail.com>: >> Didn't quite get your point. I though that the idea is to hit this code: >> >> bounds = chkp_generate_extern_var_bounds (decl); >> ... to get the builtin_sizeof call on this variable and hence to get >> the size relocation. What exactly do you mean by reproducing the >> problem? Currently the compiler just ICE on the testcase :) > > There are various ways to build bounds. On of them is used by default > and causes ICE. With your patch another way is chosen causing another > ICE. But you can get this another ICE by simply using compiler flag. > Obviously both ways should be fixed. > > You don't have to hit chkp_generate_extern_var_bounds to use size > relocation. If you create static bounds var then it is initialized later > in chkp_output_static_bounds and size relocations can appear there > either. > > Thanks > Ilya > >> >> Alexander >> >> 2017-05-10 22:51 GMT+02:00 Ilya Enkovich <enkovich....@gmail.com>: >>> 2017-05-10 22:08 GMT+03:00 Alexander Ivchenko <aivch...@gmail.com>: >>>> Hi, >>>> >>>> something like that: >>>> >>>> diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c >>>> index b1ff218..be06d71 100644 >>>> --- a/gcc/tree-chkp.c >>>> +++ b/gcc/tree-chkp.c >>>> @@ -3148,6 +3148,7 @@ chkp_get_bounds_for_decl_addr (tree decl) >>>> >>>> if (flag_chkp_use_static_bounds >>>> && VAR_P (decl) >>>> + && !VOID_TYPE_P (TREE_TYPE (decl)) >>>> && (TREE_STATIC (decl) >>>> || DECL_EXTERNAL (decl) >>>> || TREE_PUBLIC (decl)) >>>> @@ -3162,10 +3163,11 @@ chkp_get_bounds_for_decl_addr (tree decl) >>>> gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); >>>> } >>>> else if (!DECL_SIZE (decl) >>>> - || (chkp_variable_size_type (TREE_TYPE (decl)) >>>> - && (TREE_STATIC (decl) >>>> - || DECL_EXTERNAL (decl) >>>> - || TREE_PUBLIC (decl)))) >>>> + || VOID_TYPE_P (TREE_TYPE (decl)) >>>> + || (chkp_variable_size_type (TREE_TYPE (decl)) >>>> + && (TREE_STATIC (decl) >>>> + || DECL_EXTERNAL (decl) >>>> + || TREE_PUBLIC (decl)))) >>>> { >>>> gcc_assert (VAR_P (decl)); >>>> bounds = chkp_generate_extern_var_bounds (decl); >>> >>> Looking one more time into this issue I now think that bounds generation >>> already uses size relocation and this is not a part to fix. >>> >>> BTW this patch just restricts static bounds creation for void vars which >>> is not what you need. I think you should be able to reproduce the problem >>> without any patch by just using -fno-chkp-use-static-bounds. >>> >>> Looks like gimple doesn't allow void vars as call arguments. I don't know >>> what is the best way to handle this restriction. The simplest thing a can >>> think of is to change builtin call so it gets address of a decl instead of >>> a decl. >>> >>> Thanks, >>> Ilya >>> >>>> >>>> Thanks, >>>> Alexander >>>> >>>> 2017-05-10 20:55 GMT+02:00 Ilya Enkovich <enkovich....@gmail.com>: >>>>> Hi, >>>>> >>>>> Please share a patch you use. >>>>> >>>>> Thanks, >>>>> Ilya >>>>> >>>>> 2017-05-09 18:39 GMT+03:00 Alexander Ivchenko <aivch...@gmail.com>: >>>>>> 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