OSDN Git Service

* cfgexpand.c (expand_debug_expr): Check for mismatched modes in
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Apr 2010 23:25:31 +0000 (23:25 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Apr 2010 23:25:31 +0000 (23:25 +0000)
POINTER_PLUS_EXPR and fix them.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158532 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgexpand.c

index 682983e..5fc2dfc 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 48173d9..084772b 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);