From: DJ Delorie Date: Mon, 19 Apr 2010 23:25:31 +0000 (-0400) Subject: cfgexpand.c (expand_debug_expr): Check for mismatched modes in POINTER_PLUS_EXPR... X-Git-Tag: releases/gcc-4.6.0~7775 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=576319a79ad554e2537b0d97a355f7896c8c3a35;p=thirdparty%2Fgcc.git cfgexpand.c (expand_debug_expr): Check for mismatched modes in POINTER_PLUS_EXPR and fix them. * cfgexpand.c (expand_debug_expr): Check for mismatched modes in POINTER_PLUS_EXPR and fix them. From-SVN: r158532 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 682983ec38ea..5fc2dfcca46e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-04-19 DJ Delorie + + * cfgexpand.c (expand_debug_expr): Check for mismatched modes in + POINTER_PLUS_EXPR and fix them. + 2010-04-19 Eric B. Weddington * config/avr/avr-devices.c (avr_mcu_types): Add support for new diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 48173d9b992b..084772b26b9b 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2616,6 +2616,22 @@ expand_debug_expr (tree exp) return gen_rtx_FIX (mode, op0); case POINTER_PLUS_EXPR: + /* For the rare target where pointers are not the same size as + size_t, we need to check for mis-matched modes and correct + the addend. */ + if (op0 && op1 + && GET_MODE (op0) != VOIDmode && GET_MODE (op1) != VOIDmode + && GET_MODE (op0) != GET_MODE (op1)) + { + if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE (op1))) + op1 = gen_rtx_TRUNCATE (GET_MODE (op0), op1); + else + /* We always sign-extend, regardless of the signedness of + the operand, because the operand is always unsigned + here even if the original C expression is signed. */ + op1 = gen_rtx_SIGN_EXTEND (GET_MODE (op0), op1); + } + /* Fall through. */ case PLUS_EXPR: return gen_rtx_PLUS (mode, op0, op1);