summaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authortrippels <trippels@138bc75d-0d04-0410-961f-82ee72b054a4>2017-11-27 05:20:43 +0000
committertrippels <trippels@138bc75d-0d04-0410-961f-82ee72b054a4>2017-11-27 05:20:43 +0000
commit85f3424bd96bc69814f8ff327352c32a4830a65b (patch)
treec003d29fccbed0d3197d3f058e86ffa7b1f173ab /gcc/expr.c
parentfdf7a799ceca30a6c58deadea0dbc1b84fbae617 (diff)
downloadgcc-85f3424bd96bc69814f8ff327352c32a4830a65b.tar.gz
Fix PR82488 - signed integer overflow in expr.c
bootstrap-ubsan shows: gcc/expr.c:4103:17: runtime error: signed integer overflow: 0 - -9223372036854775808 cannot be represented in type 'long int' Fix by handling the saw_unknown case earlier. PR rtl-optimization/82488 * expr.c (fixup_args_size_notes): Avoid signed integer overflow. diff --git a/gcc/expr.c b/gcc/expr.c index ee07de5aaa44..e9d8555c9452 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -4100,10 +4100,13 @@ fixup_args_size_notes (rtx_insn *prev, rtx_insn *last, int end_args_size) if (STACK_GROWS_DOWNWARD) this_delta = -(unsigned HOST_WIDE_INT) this_delta; - args_size -= this_delta; + if (saw_unknown) + args_size = INT_MIN; + else + args_size -= this_delta; } - return saw_unknown ? INT_MIN : args_size; + return args_size; } #ifdef PUSH_ROUNDING -- Markus git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@255159 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index ee07de5aaa4..e9d8555c945 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4100,10 +4100,13 @@ fixup_args_size_notes (rtx_insn *prev, rtx_insn *last, int end_args_size)
if (STACK_GROWS_DOWNWARD)
this_delta = -(unsigned HOST_WIDE_INT) this_delta;
- args_size -= this_delta;
+ if (saw_unknown)
+ args_size = INT_MIN;
+ else
+ args_size -= this_delta;
}
- return saw_unknown ? INT_MIN : args_size;
+ return args_size;
}
#ifdef PUSH_ROUNDING