[PATCH/RFC] PR other/22313: Hot/cold sections vs. dwarf2 (take 2)
Nicolas Setton
setton@adacore.com
Fri Sep 8 10:39:00 GMT 2006
> I propose to apply this patch to mainline [and the 4.1 branch] in a
> few days, unless one of our debugging guru's can point out a flaw in
> my interpretation of dwarf-2 specification that seems to imply that
> advance_loc* can advance from either the previous advance_loc* or
> set_loc. [I'm also curious whether binutils/gcc can/should perform
> advance_loc relaxation. Currently we always emit advance_loc4, but
> for small deltas we could reduce the size of debugging information
> by using advance_loc1 and/or advance_loc2].
>
> Thoughts? Ok for mainline and the 4.1 branch?
I guess that this patch is incomplete, in that it breaks printing in
the debugger of variables allocated on the stack and for which the
dwarf-2 location is calculated relatively to the frame base.
To exhibit the problem, consider the following code:
typedef struct
{
int a;
} thing;
int main (void)
{
thing a;
a.a = 7;
return a.a;
}
Then try to break in "main" and print variable "a", you'll get the
following message:
Could not find the frame base for "main".
Further analysis. When compiling the example above with the patch
included, on x86-linux, the location expression for the frame base
starts with this:
.LLST0:
.long .LFB2-.Ltext0 # Location list begin address (*.LLST0)
.long .LFB2-.Ltext0 # Location list end address (*.LLST0)
The first location expression is a null address range, which is a
list terminator in dwarf-2.
I suspect that the problem comes from the current implementation of
convert_cfa_to_loc_list, which currently expects only
DW_CFA_advance_loc statements in the CFI instructions; it should be
enhanced to expect and handle the DW_CFA_set_loc statements as well.
What do the experts think about this?
(If this problem is already known and/or fixed, I apologize for the
noise.)
Nicolas
More information about the Gcc-patches
mailing list