2014-11-14 9:49 GMT+03:00 Jeff Law <l...@redhat.com>:
> On 11/06/14 05:10, Ilya Enkovich wrote:
>>
>> Hi,
>>
>> This patch enables instrumentation of chosen builtin calls.
>>
>> Thanks,
>> Ilya
>> --
>> 2014-11-06  Ilya Enkovich  <ilya.enkov...@intel.com>
>>
>>         * ipa-chkp.c (chkp_versioning): Clone builtin functions.
>>         (chkp_instrument_normal_builtin): New.
>>         (chkp_add_bounds_to_call_stmt): Support builtin functions.
>>         (chkp_replace_function_pointer): Likewise.
>>
>>
>>
>> diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
>> index df7d425..9e2efdb 100644
>> --- a/gcc/tree-chkp.c
>> +++ b/gcc/tree-chkp.c
>> @@ -1586,6 +1586,50 @@ chkp_find_bound_slots (const_tree type, bitmap res)
>>     chkp_find_bound_slots_1 (type, res, 0);
>>   }
>>
>> +/* Return 1 if call to FNDECL should be instrumented
>> +   and 0 otherwise.  */
>> +
>> +static bool
>> +chkp_instrument_normal_builtin (tree fndecl)
>> +{
>> +  switch (DECL_FUNCTION_CODE (fndecl))
>> +    {
>> +    case BUILT_IN_STRLEN:
>> +    case BUILT_IN_STRCPY:
>> +    case BUILT_IN_STRNCPY:
>> +    case BUILT_IN_STPCPY:
>> +    case BUILT_IN_STPNCPY:
>> +    case BUILT_IN_STRCAT:
>> +    case BUILT_IN_STRNCAT:
>> +    case BUILT_IN_MEMCPY:
>> +    case BUILT_IN_MEMPCPY:
>> +    case BUILT_IN_MEMSET:
>> +    case BUILT_IN_MEMMOVE:
>> +    case BUILT_IN_BZERO:
>> +    case BUILT_IN_STRCMP:
>> +    case BUILT_IN_STRNCMP:
>> +    case BUILT_IN_BCMP:
>> +    case BUILT_IN_MEMCMP:
>> +    case BUILT_IN_MEMCPY_CHK:
>> +    case BUILT_IN_MEMPCPY_CHK:
>> +    case BUILT_IN_MEMMOVE_CHK:
>> +    case BUILT_IN_MEMSET_CHK:
>> +    case BUILT_IN_STRCPY_CHK:
>> +    case BUILT_IN_STRNCPY_CHK:
>> +    case BUILT_IN_STPCPY_CHK:
>> +    case BUILT_IN_STPNCPY_CHK:
>> +    case BUILT_IN_STRCAT_CHK:
>> +    case BUILT_IN_STRNCAT_CHK:
>> +    case BUILT_IN_MALLOC:
>> +    case BUILT_IN_CALLOC:
>> +    case BUILT_IN_REALLOC:
>> +      return 1;
>> +
>> +    default:
>> +      return 0;
>> +    }
>> +}
>
> OK, this gates creation of the additional builtin and ensures we don't try
> to create an instrumention clone for anything outside the list above.
>
>
>> @@ -1686,11 +1730,18 @@ chkp_add_bounds_to_call_stmt (gimple_stmt_iterator
>> *gsi)
>>     if (!flag_chkp_instrument_calls)
>>       return;
>>
>> -  /* Avoid instrumented builtin functions for now.  Due to IPA
>> -     it also means we have to avoid instrumentation of indirect
>> -     calls.  */
>> -  if (fndecl && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
>> -    return;
>> +  /* We instrument only some subset of builtins.  We also instrument
>> +     builtin calls to be inlined.  */
>> +  if (fndecl
>> +      && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
>> +      && !chkp_instrument_normal_builtin (fndecl))
>> +    {
>> +      struct cgraph_node *clone = chkp_maybe_create_clone (fndecl);
>> +      if (!clone
>> +         || !gimple_has_body_p (clone->decl)
>> +         || !lookup_attribute ("always_inline", DECL_ATTRIBUTES
>> (fndecl)))
>> +       return;
>> +    }
>
> Is that outer conditional right?  If we have a fndecl and it's a normal
> builtin, but it's _not_ one of hte builtins we're instrumenting, then call
> chkp_maybe_create_clone?

Some builtin functions (especially their *_chk version) are defined as
always_inline functions in headers.  In this case we handle them as
regular functions (clone and instrument) because they will be inlined
anyway. Seems gimple_has_body_p should be applied to fndecl and moved
into outer if-statement along with attribute check.  Thus unneeded
clones would be avoided.

Thanks,
Ilya

>
>
> Will reserve OK/Not OK decision until after you respond to that issue.
>
> jeff

Reply via email to