OSDN Git Service

PR debug/41238
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Sep 2009 16:32:07 +0000 (16:32 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Sep 2009 16:32:07 +0000 (16:32 +0000)
* 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.

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

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

index ca35f9c..a4e3758 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 3257254..85e2f05 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 a24755f..4d30324 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)