This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix debug info for parameters passed by invisible parameters (PR debug/41238)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org, Alexandre Oliva <aoliva at redhat dot com>
- Date: Thu, 3 Sep 2009 18:04:07 +0200
- Subject: [PATCH] Fix debug info for parameters passed by invisible parameters (PR debug/41238)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
Arguments passed by invisible reference (not using DECL_BY_REFERENCE though)
have DECL_INCOMING_RTL set with set_decl_incoming_rtl (..., true) and don't
have a REG_EXPR (or shouldn't have a MEM_EXPR), given that the parameter
isn't in the DECL_INCOMING_RTL REG (or MEM), but in what it points to.
This patch teaches var-tracking.c about those (this bug existed before VTA
merge, but there was no assert later on which would make it obvious), and
also prevents stack slots with the pointers to the memory from having bogus
MEM_ATTRS).
Bootstrapped/regtested on x86_64-linux and i686-linux, Uros said it allowed
him to at least get past stage1 on alpha-linux, where it previously ICEd
during libgcc stage1 build. Ok for trunk?
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.
--- gcc/function.c.jj 2009-09-03 09:59:36.000000000 +0200
+++ gcc/function.c 2009-09-03 13:31:30.000000000 +0200
@@ -2433,20 +2433,25 @@ assign_parm_find_stack_rtl (tree parm, s
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))
- {
- 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));
+ if (!data->passed_pointer)
+ {
+ 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))
+ {
+ 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));
+ }
}
}
--- gcc/var-tracking.c.jj 2009-09-03 09:59:40.000000000 +0200
+++ gcc/var-tracking.c 2009-09-03 13:45:27.000000000 +0200
@@ -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)
Jakub