This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
more pointer mode madness
- From: DJ Delorie <dj at redhat dot com>
- To: gcc at gcc dot gnu dot org
- Date: Fri, 18 Nov 2011 16:41:56 -0500
- Subject: more pointer mode madness
I can't produce a small test case for this because it involves copied
variables vanishing, but...
in expand_debug_locations() we have an assert thusly:
gcc_assert (mode == GET_MODE (val)
In the failing case I'm seeing (s390) I've got a pointer variable
that's SImode, being set from the address of another variable
(simplified example):
t = &s;
The vartrack stuff sees that t's own storage goes away, and sets its
var_location to an expression involving s. However, the expression is
DImode (the default pointer mode) where T is SImode, and the assert
fails. I.e. there's a lost cast somewhere.
I can work around this by testing for this specific case and just tossing
the debug info:
if (targetm.valid_pointer_mode (mode)
&& targetm.valid_pointer_mode (GET_MODE (val))
&& mode != GET_MODE (val))
{
val = gen_rtx_UNKNOWN_VAR_LOC ();
}
else
... the assert ...
but this smells like a hack. However, i'm having a hard time finding
out where this stuff is being set up.
Suggestions?