This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]