re PR debug/41238 (VTA: bootstrap failure, ICE in loc_cmp, at var-tracking.c:2456)
authorJakub Jelinek <jakub@redhat.com>
Thu, 3 Sep 2009 16:32:07 +0000 (18:32 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 3 Sep 2009 16:32:07 +0000 (18:32 +0200)
PR debug/41238
* function.c (assign_parm_find_stack_rtl): Don't set mem attributes on
the stack slot if it is passed by invisible reference.
* var-tracking.c (vt_add_function_parameters): Handle arguments passed by
invisible reference.

From-SVN: r151384

gcc/ChangeLog
gcc/function.c
gcc/var-tracking.c

index ca35f9c3cf97b5a8236ef018dd294d902b845733..a4e3758bf0064c1c3c6a2a39598beb117e1a9ca1 100644 (file)
@@ -1,3 +1,11 @@
+2009-09-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/41238
+       * function.c (assign_parm_find_stack_rtl): Don't set mem attributes on
+       the stack slot if it is passed by invisible reference.
+       * var-tracking.c (vt_add_function_parameters): Handle arguments passed by
+       invisible reference.
+
 2009-09-03  Bernd Schmidt  <bernd.schmidt@analog.com>
 
        * config/bfin/linux.h (TARGET_SUPPORTS_SYNC_CALLS): Define to 1.
index 3257254429867387cd49a93833539e546e9665a1..85e2f05893282cc38fc61919d50b8d59c4d250ff 100644 (file)
@@ -2433,20 +2433,25 @@ assign_parm_find_stack_rtl (tree parm, struct assign_parm_data_one *data)
     stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
   stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
 
-  set_mem_attributes (stack_parm, parm, 1);
-  /* set_mem_attributes could set MEM_SIZE to the passed mode's size,
-     while promoted mode's size is needed.  */
-  if (data->promoted_mode != BLKmode
-      && data->promoted_mode != DECL_MODE (parm))
+  if (!data->passed_pointer)
     {
-      set_mem_size (stack_parm, GEN_INT (GET_MODE_SIZE (data->promoted_mode)));
-      if (MEM_EXPR (stack_parm) && MEM_OFFSET (stack_parm))
+      set_mem_attributes (stack_parm, parm, 1);
+      /* set_mem_attributes could set MEM_SIZE to the passed mode's size,
+        while promoted mode's size is needed.  */
+      if (data->promoted_mode != BLKmode
+         && data->promoted_mode != DECL_MODE (parm))
        {
-         int offset = subreg_lowpart_offset (DECL_MODE (parm),
-                                             data->promoted_mode);
-         if (offset)
-           set_mem_offset (stack_parm,
-                           plus_constant (MEM_OFFSET (stack_parm), -offset));
+         set_mem_size (stack_parm,
+                       GEN_INT (GET_MODE_SIZE (data->promoted_mode)));
+         if (MEM_EXPR (stack_parm) && MEM_OFFSET (stack_parm))
+           {
+             int offset = subreg_lowpart_offset (DECL_MODE (parm),
+                                                 data->promoted_mode);
+             if (offset)
+               set_mem_offset (stack_parm,
+                               plus_constant (MEM_OFFSET (stack_parm),
+                                              -offset));
+           }
        }
     }
 
index a24755fe07effb8965de5b52967e3557a7db726f..4d30324569ba9143edf6d67d5fa0f3dfc02ad551 100644 (file)
@@ -7058,10 +7058,20 @@ vt_add_function_parameters (void)
 
       if (!vt_get_decl_and_offset (incoming, &decl, &offset))
        {
-         if (!vt_get_decl_and_offset (decl_rtl, &decl, &offset))
-           continue;
-         offset += byte_lowpart_offset (GET_MODE (incoming),
-                                        GET_MODE (decl_rtl));
+         if (REG_P (incoming) || MEM_P (incoming))
+           {
+             /* This means argument is passed by invisible reference.  */
+             offset = 0;
+             decl = parm;
+             incoming = gen_rtx_MEM (GET_MODE (decl_rtl), incoming);
+           }
+         else
+           {
+             if (!vt_get_decl_and_offset (decl_rtl, &decl, &offset))
+               continue;
+             offset += byte_lowpart_offset (GET_MODE (incoming),
+                                            GET_MODE (decl_rtl));
+           }
        }
 
       if (!decl)