On Mon, Apr 04, 2016 at 05:50:53PM +0200, Jan Hubicka wrote:
> Hi,
> as requested by Jakub, this patch makes devirtualization code to turn off
> transformations based on assumption that cxa_pure_virtual will never be called
> by a virtual call when -fsanitize=undefined is used.
> 
> Bootstrapped/regtested x86_64-linux, will commit it shortly.
> 
>       PR ipa/66223
>       * ipa-devirt.c (maybe_record_node): Do not optimize cxa_pure_virtual
>       calls when sanitizing.
>       (possible_polymorphic_call_target_p)" FIx formating.
> 
>       * g++.dg/ipa/devirt-51.C: New testcase.
> Index: ipa-devirt.c
> ===================================================================
> --- ipa-devirt.c      (revision 234715)
> +++ ipa-devirt.c      (working copy)
> @@ -2438,10 +2438,14 @@ maybe_record_node (vec <cgraph_node *> &
>      {
>        gcc_assert (!target_node->global.inlined_to);
>        gcc_assert (target_node->real_symbol_p ());
> +      /* When sanitizing, do not asume that cxa_pure_virutal is not called

s/asume/assume/
s/cxa/__cxa/
s/virutal/virtual/

> +      by valid program.  */
> +      if (flag_sanitize & SANITIZE_UNDEFINED)
> +     ;

I'd use SANITIZE_UNREACHABLE instead, that is the sanitizer for
__builtin_unreachable ().  Unless we want to split that into
-fsanitize=unreachable
-fsanitize=pure-virtual

        Jakub

Reply via email to