On Fri, Dec 09, 2016 at 12:39:24PM +0100, Martin Liška wrote:
> +       if (is_gimple_call (stmt) && gimple_call_internal_p (stmt))
> +         {
> +           enum internal_fn ifn = gimple_call_internal_fn (stmt);
> +           switch (ifn)
> +             {
> +             case IFN_ASAN_MARK:
> +               {
> +                 HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (stmt, 
> 0));
> +                 bool is_clobber = (flags & ASAN_MARK_CLOBBER) != 0;
> +                 if (is_clobber)
> +                   {
> +                     bitmap_set_bit (with_poison, bb->index);
> +                     finish = true;
> +                   }
> +                 break;
> +               }
> +               default:
> +                 break;
> +             }

This looks weird.  Wouldn't it be nicer to just use
              if (gimple_call_internal_fn (stmt) == IFN_ASAN_MARK)
                {
                  HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (stmt, 
0));
                  bool is_clobber = (flags & ASAN_MARK_CLOBBER) != 0;
                  if (is_clobber)
                    {
                      bitmap_set_bit (with_poison, bb->index);
                      finish = true;
                    }
                }
(or don't use finish and just break; there)?
> +           enum internal_fn ifn = gimple_call_internal_fn (stmt);
> +           switch (ifn)
> +             {
> +             case IFN_ASAN_MARK:
> +               {

Likewise.

No function comment:

> +static bool
> +maybe_contains_asan_check (gimple *stmt)
> +{
> +  if (is_gimple_call (stmt))
> +    {
> +      if (gimple_call_internal_p (stmt))
> +     {
> +       enum internal_fn ifn = gimple_call_internal_fn (stmt);
> +       switch (ifn)
> +         {
> +         case IFN_ASAN_CHECK:
> +           return true;
> +         default:
> +           return false;

Are all internal functions really known to be ASAN_CHECK free?

> +         }
> +     }
> +      else
> +        return true;

What about builtins?  Many will not be fine, but many should be known
to be ASAN_CHECK free.  Consider e.g. most math builtins (except sincos).

> @@ -698,6 +928,9 @@ pass_sanopt::execute (function *fun)
>    bool use_calls = ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD < INT_MAX
>      && asan_num_accesses >= ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD;
>  
> +  sanitize_asan_mark_unpoison ();
> +  sanitize_asan_mark_poison ();
> +

What I don't really like here is that you force several IL walks for all
sanitizers, just in case.  Look e.g. how asan_num_accesses is computed,
couldn't you compute similarly has_asan_marks and guard those two functions
on that?

        Jakub

Reply via email to