diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-03-26 10:18:26 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-03-26 10:18:26 +0100 |
commit | aa6b742f0fbdef0df7b45509e0af7593dd45e08a (patch) | |
tree | 972c65b58a012b79eebc35897ac5fc25db786d31 /gcc/ubsan.c | |
parent | 368b454d67fe613c8f7d588400b874584ef9f893 (diff) | |
download | gcc-aa6b742f0fbdef0df7b45509e0af7593dd45e08a.zip gcc-aa6b742f0fbdef0df7b45509e0af7593dd45e08a.tar.gz gcc-aa6b742f0fbdef0df7b45509e0af7593dd45e08a.tar.bz2 |
re PR sanitizer/60636 (ubsan doesn't instrument signed integer ABS_EXPR)
PR sanitizer/60636
* ubsan.c (instrument_si_overflow): Instrument ABS_EXPR.
* c-c++-common/ubsan/pr60636.c: New test.
From-SVN: r208841
Diffstat (limited to 'gcc/ubsan.c')
-rw-r--r-- | gcc/ubsan.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/ubsan.c b/gcc/ubsan.c index 22470da..8a8c289 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -737,6 +737,21 @@ instrument_si_overflow (gimple_stmt_iterator gsi) gimple_call_set_lhs (g, lhs); gsi_replace (&gsi, g, false); break; + case ABS_EXPR: + /* Transform i = ABS_EXPR<u>; + into + _N = UBSAN_CHECK_SUB (0, u); + i = ABS_EXPR<_N>; */ + a = build_int_cst (lhstype, 0); + b = gimple_assign_rhs1 (stmt); + g = gimple_build_call_internal (IFN_UBSAN_CHECK_SUB, 2, a, b); + a = make_ssa_name (lhstype, NULL); + gimple_call_set_lhs (g, a); + gimple_set_location (g, gimple_location (stmt)); + gsi_insert_before (&gsi, g, GSI_SAME_STMT); + gimple_assign_set_rhs1 (stmt, a); + update_stmt (stmt); + break; default: break; } |