On December 9, 2016 8:30:26 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> 
wrote:
>Hi!
>
>If some TUs are compiled with -flto -fsanitize={undefined,address} or
>-fsanitize=thread, there might be some internal calls in them which
>require
>sanopt pass to lower them.  If the final link is performed without
>the corresponding -fsanitize=* options (user bug), that pass might not
>be
>run at all and we'd ICE.  With this patch we throw away unexpected
>sanitizer
>ifns and so worst case the final link will fail because of missing
>libasan,
>libubsan or libtsan symbols.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

>2016-12-09  Jakub Jelinek  <ja...@redhat.com>
>
>       PR sanitizer/78708
>       * lto-streamer-in.c (input_function): In addition to debug stmts
>       without -g, remove IFN_*SAN_* calls if corresponding flag_sanitize
>       bit is not enabled.
>
>--- gcc/lto-streamer-in.c.jj   2016-10-31 13:28:11.000000000 +0100
>+++ gcc/lto-streamer-in.c      2016-12-09 14:54:12.050362649 +0100
>@@ -1110,15 +1110,59 @@ input_function (tree fn_decl, struct dat
>       while (!gsi_end_p (bsi))
>       {
>         gimple *stmt = gsi_stmt (bsi);
>+        bool remove = false;
>         /* If we're recompiling LTO objects with debug stmts but
>            we're not supposed to have debug stmts, remove them now.
>            We can't remove them earlier because this would cause uid
>            mismatches in fixups, but we can do it at this point, as
>-           long as debug stmts don't require fixups.  */
>-        if (!MAY_HAVE_DEBUG_STMTS && !flag_wpa && is_gimple_debug (stmt))
>+           long as debug stmts don't require fixups.
>+           Similarly remove all IFN_*SAN_* internal calls   */
>+        if (!flag_wpa)
>+          {
>+            if (!MAY_HAVE_DEBUG_STMTS && is_gimple_debug (stmt))
>+              remove = true;
>+            if (is_gimple_call (stmt)
>+                && gimple_call_internal_p (stmt))
>+              {
>+                switch (gimple_call_internal_fn (stmt))
>+                  {
>+                  case IFN_UBSAN_NULL:
>+                    if ((flag_sanitize
>+                        & (SANITIZE_NULL | SANITIZE_ALIGNMENT)) == 0)
>+                      remove = true;
>+                    break;
>+                  case IFN_UBSAN_BOUNDS:
>+                    if ((flag_sanitize & SANITIZE_BOUNDS) == 0)
>+                      remove = true;
>+                    break;
>+                  case IFN_UBSAN_VPTR:
>+                    if ((flag_sanitize & SANITIZE_VPTR) == 0)
>+                      remove = true;
>+                    break;
>+                  case IFN_UBSAN_OBJECT_SIZE:
>+                    if ((flag_sanitize & SANITIZE_OBJECT_SIZE) == 0)
>+                      remove = true;
>+                    break;
>+                  case IFN_ASAN_MARK:
>+                    if ((flag_sanitize & SANITIZE_ADDRESS) == 0)
>+                      remove = true;
>+                    break;
>+                  case IFN_TSAN_FUNC_EXIT:
>+                    if ((flag_sanitize & SANITIZE_THREAD) == 0)
>+                      remove = true;
>+                    break;
>+                  default:
>+                    break;
>+                  }
>+                gcc_assert (!remove || gimple_call_lhs (stmt) == NULL_TREE);
>+              }
>+          }
>+        if (remove)
>           {
>             gimple_stmt_iterator gsi = bsi;
>             gsi_next (&bsi);
>+            unlink_stmt_vdef (stmt);
>+            release_defs (stmt);
>             gsi_remove (&gsi, true);
>           }
>         else
>
>       Jakub


Reply via email to