cfgexpand.c (expand_debug_expr): Check for mismatched modes in POINTER_PLUS_EXPR...
authorDJ Delorie <dj@redhat.com>
Mon, 19 Apr 2010 23:25:31 +0000 (19:25 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Mon, 19 Apr 2010 23:25:31 +0000 (19:25 -0400)
* cfgexpand.c (expand_debug_expr): Check for mismatched modes in
POINTER_PLUS_EXPR and fix them.

From-SVN: r158532

gcc/ChangeLog
gcc/cfgexpand.c

index 682983ec38eaa43e03ed87834cf142a8dae97151..5fc2dfcca46ed08831f4a875f468c5728cb1b86b 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-19  DJ Delorie  <dj@redhat.com>
+
+       * cfgexpand.c (expand_debug_expr): Check for mismatched modes in
+       POINTER_PLUS_EXPR and fix them.
+
 2010-04-19  Eric B. Weddington  <eric.weddington@atmel.com>
 
        * config/avr/avr-devices.c (avr_mcu_types): Add support for new
index 48173d9b992b4e795cc83c1157d41a272f27f7e9..084772b26b9b63ba6ad1c7e25bec0992ea66fd67 100644 (file)
@@ -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);