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

Reply via email to