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?

Reply via email to