From d85733c8e2e51ba2159d27fe10d36b0eba98884d Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 16 Apr 2009 08:52:27 +0000 Subject: [PATCH] gas/ 2009-04-16 Jan Beulich * expr.c: Include limits.h if available, and #define CHAR_BITS otherwise. (expr): Check range of shift count when evaluating a constant expression. --- gas/ChangeLog | 7 +++++++ gas/expr.c | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index 910f8b074d..b837c17c2b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2009-04-16 Jan Beulich + + * expr.c: Include limits.h if available, and #define CHAR_BITS + otherwise. + (expr): Check range of shift count when evaluating a constant + expression. + 2009-04-15 Jan Beulich * config/tc-i386.c (process_operands): Print operands in diff --git a/gas/expr.c b/gas/expr.c index 285b4381da..39f21ef797 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -31,6 +31,13 @@ #include "safe-ctype.h" #include "obstack.h" +#ifdef HAVE_LIMITS_H +#include +#endif +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif + static void floating_constant (expressionS * expressionP); static valueT generic_bignum_to_int32 (void); #ifdef BFD64 @@ -1779,6 +1786,14 @@ expr (int rankarg, /* Larger # is higher rank. */ as_warn (_("division by zero")); v = 1; } + if ((valueT) v >= sizeof(valueT) * CHAR_BIT + && (op_left == O_left_shift || op_left == O_right_shift)) + { + as_warn_value_out_of_range (_("shift count"), v, 0, + sizeof(valueT) * CHAR_BIT - 1, + NULL, 0); + resultP->X_add_number = v = 0; + } switch (op_left) { default: abort ();