RFA: Generate normal DWARF DW_LOC descriptors for non integer mode pointers
Jeff Law
law@redhat.com
Mon May 16 20:08:00 GMT 2016
On 05/16/2016 08:12 AM, Nick Clifton wrote:
> 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.
I'm not real familiar with dwarf, so if one of other maintainers steps
in and says this is OK, then ignore my comments/questions.
I may be missing something, but isn't it the transition to an FP
relative address rather than a SP relative address that's the problem
here? Where does that happen? Is it possible we've got the wrong
DECL_RTL or somesuch?
Jeff
More information about the Gdb-patches
mailing list