summaryrefslogtreecommitdiff
path: root/gcc/lto-streamer-in.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-10 08:01:17 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-12-10 08:01:17 +0000
commit99dde1f18864fe3e77dbdcf4833108092b10371b (patch)
tree91c4ebe2cfe5c929b6d00b17de216d017d23dbfe /gcc/lto-streamer-in.c
parente977548cdc92e6c9d183704cbf3a3bb79c9195f8 (diff)
downloadgcc-99dde1f18864fe3e77dbdcf4833108092b10371b.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@243514 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lto-streamer-in.c')
-rw-r--r--gcc/lto-streamer-in.c48
1 files changed, 46 insertions, 2 deletions
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index 1f39e6b9876..862e1566472 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -1110,15 +1110,59 @@ input_function (tree fn_decl, struct data_in *data_in,
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