Hi Guys,
Currently dwarf2out.c:mem_loc_descriptor() has some special case
code to handle the situation where an address is held in a register
whose mode is not of type MODE_INT. It generates a
DW_OP_GNU_regval_type expression which may later on be converted into
a frame pointer based expression. This is a problem for targets which
use a partial integer mode for their pointers (eg the msp430). In
such cases the conversion to a frame pointer based expression could
be wrong if the frame pointer is not being used.
For example the GDB testfile gdb/testsuite/gdb.base/advance.c contains
this code fragment:
int
main ()
{
int result;
int b, c;
c = 5;
b = 3; /* advance this location */
func (c); /* stop here after leaving current frame */
which compiles to these instructions:
suba #6, r1
mov #5, 4(r1)
mov #3, 2(r1)
mov 4(r1), r12
calla #0 ;<func>
(Note that only r1 - the stack pointer - is used. r4 - the frame
pointer - is not).
The debug information produced for the "c" local variable looks like
this:
Abbrev Number: 3 (DW_TAG_variable)
DW_AT_name : c
DW_AT_decl_file : 1
DW_AT_decl_line : 40
DW_AT_type : <0x37>
DW_AT_location : 5 byte block: f5 4 21 32 1c (DW_OP_GNU_regval_type: 4 (r4) <0x21>; DW_OP_lit2; DW_OP_minus)
ie it says that "c" is stored in memory location "r4 - 2", which is
wrong since register r4 is not even used in this function.
The patch below addresses this problem by allowing the normal,
register based descriptor to be produced when the mode is Pmode.
With this patch applied the unexpected failure count in the GDB
testsuite for the MSP430's -mlarge multilib changes from 2253 to 367.
There are no regressions, for MSP430 or x86_64, and no changes to
the GCC testsuite results for either target.
OK to apply ?
Cheers
Nick
gcc/ChangeLog
2016-05-16 Nick Clifton <nickc@redhat.com>
* dwarf2out.c (mem_loc_descriptor): Convert REG based addresses
whose mode is Pmode into basereg descriptors even if Pmode is
not an integer mode.