* Is this a gcc, gdb or readelf bug?
@ 2004-12-22 1:16 H. J. Lu
2004-12-22 11:09 ` Nick Clifton
0 siblings, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-22 1:16 UTC (permalink / raw)
To: gcc, GDB, binutils
I can't debug gcc 4.0 with gdb:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19124
When I used idb, I got
(idb) stop in tls_symbolic_operand
Info: Optimized variables show as <no value> when no location is
allocated.
[#1: stop in int tls_symbolic_operand(rtx, enum machine_mode)]
(idb) r
Is that a gdb/readelf or gcc bug?
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Is this a gcc, gdb or readelf bug?
2004-12-22 1:16 Is this a gcc, gdb or readelf bug? H. J. Lu
@ 2004-12-22 11:09 ` Nick Clifton
2004-12-22 18:25 ` H. J. Lu
0 siblings, 1 reply; 21+ messages in thread
From: Nick Clifton @ 2004-12-22 11:09 UTC (permalink / raw)
To: H. J. Lu; +Cc: gcc, GDB, binutils
Hi H. J.
> I can't debug gcc 4.0 with gdb:
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19124
Note - I have just committed a patch to readelf to make its output
slightly more helpful when it encounters problems like this.
The 19124 bug is definitely a GCC problem - readelf is just reporting
the facts, and as Andrew Pinkski has reported if you compile with
-fno-var-tracking the problem goes away.
> When I used idb, I got
>
> (idb) stop in tls_symbolic_operand
>
> Info: Optimized variables show as <no value> when no location is
> allocated.
> [#1: stop in int tls_symbolic_operand(rtx, enum machine_mode)]
> (idb) r
>
> Is that a gdb/readelf or gcc bug?
GDB not being able to debug GCC is a GDB problem. (Or possibly a
problem of the compiler than was used to compile the GCC being
debugged). Either way I am pretty sure that readelf is blameless in
this situation.
Cheers
Nick
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Is this a gcc, gdb or readelf bug?
2004-12-22 11:09 ` Nick Clifton
@ 2004-12-22 18:25 ` H. J. Lu
2004-12-23 3:43 ` Daniel Jacobowitz
0 siblings, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-22 18:25 UTC (permalink / raw)
To: Nick Clifton; +Cc: gcc, GDB, binutils
On Wed, Dec 22, 2004 at 11:16:13AM +0000, Nick Clifton wrote:
> Hi H. J.
>
> >I can't debug gcc 4.0 with gdb:
> >
> >http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19124
>
> Note - I have just committed a patch to readelf to make its output
> slightly more helpful when it encounters problems like this.
I believe there is a readelf bug:
http://sources.redhat.com/bugzilla/show_bug.cgi?id=615
>
> The 19124 bug is definitely a GCC problem - readelf is just reporting
> the facts, and as Andrew Pinkski has reported if you compile with
> -fno-var-tracking the problem goes away.
>
> >When I used idb, I got
> >
> >(idb) stop in tls_symbolic_operand
> >
> >Info: Optimized variables show as <no value> when no location is
> >allocated.
> >[#1: stop in int tls_symbolic_operand(rtx, enum machine_mode)]
> >(idb) r
> >
> >Is that a gdb/readelf or gcc bug?
>
> GDB not being able to debug GCC is a GDB problem. (Or possibly a
> problem of the compiler than was used to compile the GCC being
> debugged). Either way I am pretty sure that readelf is blameless in
> this situation.
I think gcc may be correct and gdb just can't handle location list
correctly.
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Is this a gcc, gdb or readelf bug?
2004-12-22 18:25 ` H. J. Lu
@ 2004-12-23 3:43 ` Daniel Jacobowitz
2004-12-30 19:24 ` GDB 6.3 assumes that DW_AT_frame_base exists H. J. Lu
0 siblings, 1 reply; 21+ messages in thread
From: Daniel Jacobowitz @ 2004-12-23 3:43 UTC (permalink / raw)
To: H. J. Lu; +Cc: Nick Clifton, gcc, GDB, binutils
On Wed, Dec 22, 2004 at 10:24:49AM -0800, H. J. Lu wrote:
> > GDB not being able to debug GCC is a GDB problem. (Or possibly a
> > problem of the compiler than was used to compile the GCC being
> > debugged). Either way I am pretty sure that readelf is blameless in
> > this situation.
>
> I think gcc may be correct and gdb just can't handle location list
> correctly.
If you believe there is a GDB bug, please submit a bug report with
self-contained test case.
--
Daniel Jacobowitz
^ permalink raw reply [flat|nested] 21+ messages in thread
* GDB 6.3 assumes that DW_AT_frame_base exists
2004-12-23 3:43 ` Daniel Jacobowitz
@ 2004-12-30 19:24 ` H. J. Lu
2004-12-30 19:36 ` H. J. Lu
0 siblings, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-30 19:24 UTC (permalink / raw)
To: gcc, GDB
On Wed, Dec 22, 2004 at 10:43:19PM -0500, Daniel Jacobowitz wrote:
> On Wed, Dec 22, 2004 at 10:24:49AM -0800, H. J. Lu wrote:
> > > GDB not being able to debug GCC is a GDB problem. (Or possibly a
> > > problem of the compiler than was used to compile the GCC being
> > > debugged). Either way I am pretty sure that readelf is blameless in
> > > this situation.
> >
> > I think gcc may be correct and gdb just can't handle location list
> > correctly.
>
> If you believe there is a GDB bug, please submit a bug report with
> self-contained test case.
I don't know if it is a gcc or gdb bug, and I don't have a
self-contained testcase. The only thing I see is gdb crushes on
cc1 from gcc 4.0. It seems that gdb 6.3 assumes DW_AT_frame_base
exists for a function. But not all functions in cc1 in gcc 4.0
have DW_AT_frame_base and gdb 6.3 crushes in dwarf_expr_frame_base.
BTW, does gdb use bugzilla?
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: GDB 6.3 assumes that DW_AT_frame_base exists
2004-12-30 19:24 ` GDB 6.3 assumes that DW_AT_frame_base exists H. J. Lu
@ 2004-12-30 19:36 ` H. J. Lu
2004-12-30 19:56 ` H. J. Lu
0 siblings, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-30 19:36 UTC (permalink / raw)
To: gcc, GDB
On Thu, Dec 30, 2004 at 11:24:24AM -0800, H. J. Lu wrote:
> On Wed, Dec 22, 2004 at 10:43:19PM -0500, Daniel Jacobowitz wrote:
> > On Wed, Dec 22, 2004 at 10:24:49AM -0800, H. J. Lu wrote:
> > > > GDB not being able to debug GCC is a GDB problem. (Or possibly a
> > > > problem of the compiler than was used to compile the GCC being
> > > > debugged). Either way I am pretty sure that readelf is blameless in
> > > > this situation.
> > >
> > > I think gcc may be correct and gdb just can't handle location list
> > > correctly.
> >
> > If you believe there is a GDB bug, please submit a bug report with
> > self-contained test case.
>
> I don't know if it is a gcc or gdb bug, and I don't have a
> self-contained testcase. The only thing I see is gdb crushes on
> cc1 from gcc 4.0. It seems that gdb 6.3 assumes DW_AT_frame_base
> exists for a function. But not all functions in cc1 in gcc 4.0
> have DW_AT_frame_base and gdb 6.3 crushes in dwarf_expr_frame_base.
I think it is a gdb 6.3 bug since idb has no problem. When evaluating
a location list, gdb does
...
ctx->get_frame_base = dwarf_expr_frame_base;
...
dwarf_expr_frame_base uses DW_AT_frame_base to get frame base. Since
DW_AT_frame_base doesn't exist for tls_symbolic_operand, gdb crushes.
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: GDB 6.3 assumes that DW_AT_frame_base exists
2004-12-30 19:36 ` H. J. Lu
@ 2004-12-30 19:56 ` H. J. Lu
2004-12-30 20:07 ` Daniel Jacobowitz
0 siblings, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-30 19:56 UTC (permalink / raw)
To: gcc, GDB
On Thu, Dec 30, 2004 at 11:36:18AM -0800, H. J. Lu wrote:
> On Thu, Dec 30, 2004 at 11:24:24AM -0800, H. J. Lu wrote:
> > On Wed, Dec 22, 2004 at 10:43:19PM -0500, Daniel Jacobowitz wrote:
> > > On Wed, Dec 22, 2004 at 10:24:49AM -0800, H. J. Lu wrote:
> > > > > GDB not being able to debug GCC is a GDB problem. (Or possibly a
> > > > > problem of the compiler than was used to compile the GCC being
> > > > > debugged). Either way I am pretty sure that readelf is blameless in
> > > > > this situation.
> > > >
> > > > I think gcc may be correct and gdb just can't handle location list
> > > > correctly.
> > >
> > > If you believe there is a GDB bug, please submit a bug report with
> > > self-contained test case.
> >
> > I don't know if it is a gcc or gdb bug, and I don't have a
> > self-contained testcase. The only thing I see is gdb crushes on
> > cc1 from gcc 4.0. It seems that gdb 6.3 assumes DW_AT_frame_base
> > exists for a function. But not all functions in cc1 in gcc 4.0
> > have DW_AT_frame_base and gdb 6.3 crushes in dwarf_expr_frame_base.
>
> I think it is a gdb 6.3 bug since idb has no problem. When evaluating
> a location list, gdb does
>
> ...
> ctx->get_frame_base = dwarf_expr_frame_base;
> ...
>
> dwarf_expr_frame_base uses DW_AT_frame_base to get frame base. Since
> DW_AT_frame_base doesn't exist for tls_symbolic_operand, gdb crushes.
DW_AT_frame_base may be needed for location lists of local variables.
But in case of tls_symbolic_operand, there is no local variable.
Location lists are used for function parameters.
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: GDB 6.3 assumes that DW_AT_frame_base exists
2004-12-30 19:56 ` H. J. Lu
@ 2004-12-30 20:07 ` Daniel Jacobowitz
2004-12-30 20:23 ` Gdb generates location list without DW_AT_frame_base H. J. Lu
0 siblings, 1 reply; 21+ messages in thread
From: Daniel Jacobowitz @ 2004-12-30 20:07 UTC (permalink / raw)
To: H. J. Lu; +Cc: gcc, GDB
On Thu, Dec 30, 2004 at 11:56:42AM -0800, H. J. Lu wrote:
> DW_AT_frame_base may be needed for location lists of local variables.
> But in case of tls_symbolic_operand, there is no local variable.
> Location lists are used for function parameters.
Then why is GDB calling get_frame_base? It is only called for
DW_OP_fbreg. If we don't have a frame base, we don't know what
DW_OP_fbreg refers to.
GDB should issue an error instead of crashing, but that's as far as we
can go.
--
Daniel Jacobowitz
^ permalink raw reply [flat|nested] 21+ messages in thread
* Gdb generates location list without DW_AT_frame_base
2004-12-30 20:07 ` Daniel Jacobowitz
@ 2004-12-30 20:23 ` H. J. Lu
2004-12-30 20:28 ` Daniel Jacobowitz
0 siblings, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-30 20:23 UTC (permalink / raw)
To: gcc, GDB
On Thu, Dec 30, 2004 at 03:07:20PM -0500, Daniel Jacobowitz wrote:
> On Thu, Dec 30, 2004 at 11:56:42AM -0800, H. J. Lu wrote:
> > DW_AT_frame_base may be needed for location lists of local variables.
> > But in case of tls_symbolic_operand, there is no local variable.
> > Location lists are used for function parameters.
>
> Then why is GDB calling get_frame_base? It is only called for
> DW_OP_fbreg. If we don't have a frame base, we don't know what
> DW_OP_fbreg refers to.
Gcc generates:
<1><28c955>: Abbrev Number: 47 (DW_TAG_subprogram)
DW_AT_sibling : <28c98f>
DW_AT_external : 1
DW_AT_name : (indirect string, offset: 0x3875d):
tls_symbolic_operand
DW_AT_decl_file : 1
DW_AT_decl_line : 471
DW_AT_prototyped : 1
DW_AT_type : <2887cb>
DW_AT_low_pc : 0x826c1d0
DW_AT_high_pc : 0x826c1fc
<2><28c96f>: Abbrev Number: 48 (DW_TAG_formal_parameter)
DW_AT_name : op
DW_AT_decl_file : 1
DW_AT_decl_line : 470
DW_AT_type : <288a7b>
DW_AT_location : 120fbf (location list)
<2><28c97e>: Abbrev Number: 49 (DW_TAG_formal_parameter)
DW_AT_name : (indirect string, offset: 0x3db66): mode
DW_AT_decl_file : 1
DW_AT_decl_line : 470
DW_AT_type : <288e5d>
DW_AT_location : 121018 (location list)
for
int
tls_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
{
return ((GET_CODE (op) == SYMBOL_REF) && (SYMBOL_REF_TLS_MODEL (op)
!= 0)) && (mode == VOIDmode || GET_MODE (op) == mode);
}
It may be a gcc bug after all.
>
> GDB should issue an error instead of crashing, but that's as far as we
> can go.
This patch does something like that
--- dwarf2loc.c 2004-12-30 12:01:34.140350763 -0800
+++ dwarf2loc.c.new 2004-12-30 11:54:24.759408333 -0800
@@ -164,13 +164,16 @@ dwarf_expr_frame_base (void *baton, unsi
*start = find_location_expression (symbaton, length,
get_frame_pc
(debaton->frame));
}
- else
+ else if (SYMBOL_OPS (framefunc) == &dwarf2_locexpr_funcs)
{
struct dwarf2_locexpr_baton *symbaton;
symbaton = SYMBOL_LOCATION_BATON (framefunc);
*length = symbaton->size;
*start = symbaton->data;
}
+ else
+ error ("Invalid frame base function for \"%s\".",
+ SYMBOL_NATURAL_NAME (framefunc));
if (*start == NULL)
error ("Could not find the frame base for \"%s\".",
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-30 20:23 ` Gdb generates location list without DW_AT_frame_base H. J. Lu
@ 2004-12-30 20:28 ` Daniel Jacobowitz
2004-12-30 20:52 ` Gdb generates DW_OP_fbreg in " H. J. Lu
2004-12-30 20:56 ` Gdb generates " Daniel Berlin
0 siblings, 2 replies; 21+ messages in thread
From: Daniel Jacobowitz @ 2004-12-30 20:28 UTC (permalink / raw)
To: H. J. Lu; +Cc: gcc, GDB
On Thu, Dec 30, 2004 at 12:23:46PM -0800, H. J. Lu wrote:
> On Thu, Dec 30, 2004 at 03:07:20PM -0500, Daniel Jacobowitz wrote:
> > On Thu, Dec 30, 2004 at 11:56:42AM -0800, H. J. Lu wrote:
> > > DW_AT_frame_base may be needed for location lists of local variables.
> > > But in case of tls_symbolic_operand, there is no local variable.
> > > Location lists are used for function parameters.
> >
> > Then why is GDB calling get_frame_base? It is only called for
> > DW_OP_fbreg. If we don't have a frame base, we don't know what
> > DW_OP_fbreg refers to.
>
> Gcc generates:
>
> <1><28c955>: Abbrev Number: 47 (DW_TAG_subprogram)
> DW_AT_sibling : <28c98f>
> DW_AT_external : 1
> DW_AT_name : (indirect string, offset: 0x3875d):
> tls_symbolic_operand
> DW_AT_decl_file : 1
> DW_AT_decl_line : 471
> DW_AT_prototyped : 1
> DW_AT_type : <2887cb>
> DW_AT_low_pc : 0x826c1d0
> DW_AT_high_pc : 0x826c1fc
> <2><28c96f>: Abbrev Number: 48 (DW_TAG_formal_parameter)
> DW_AT_name : op
> DW_AT_decl_file : 1
> DW_AT_decl_line : 470
> DW_AT_type : <288a7b>
> DW_AT_location : 120fbf (location list)
> <2><28c97e>: Abbrev Number: 49 (DW_TAG_formal_parameter)
> DW_AT_name : (indirect string, offset: 0x3db66): mode
> DW_AT_decl_file : 1
> DW_AT_decl_line : 470
> DW_AT_type : <288e5d>
> DW_AT_location : 121018 (location list)
>
> for
>
> int
> tls_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
> {
> return ((GET_CODE (op) == SYMBOL_REF) && (SYMBOL_REF_TLS_MODEL (op)
> != 0)) && (mode == VOIDmode || GET_MODE (op) == mode);
> }
>
> It may be a gcc bug after all.
And what's in the location lists? If it's DW_OP_fbreg, then I presume
it's a GCC bug. According to my reading of the DWARF spec, anyway.
--
Daniel Jacobowitz
^ permalink raw reply [flat|nested] 21+ messages in thread
* Gdb generates DW_OP_fbreg in location list without DW_AT_frame_base
2004-12-30 20:28 ` Daniel Jacobowitz
@ 2004-12-30 20:52 ` H. J. Lu
2004-12-30 20:56 ` Gdb generates " Daniel Berlin
1 sibling, 0 replies; 21+ messages in thread
From: H. J. Lu @ 2004-12-30 20:52 UTC (permalink / raw)
To: gcc, GDB
On Thu, Dec 30, 2004 at 03:28:28PM -0500, Daniel Jacobowitz wrote:
> On Thu, Dec 30, 2004 at 12:23:46PM -0800, H. J. Lu wrote:
> > On Thu, Dec 30, 2004 at 03:07:20PM -0500, Daniel Jacobowitz wrote:
> > > On Thu, Dec 30, 2004 at 11:56:42AM -0800, H. J. Lu wrote:
> > > > DW_AT_frame_base may be needed for location lists of local variables.
> > > > But in case of tls_symbolic_operand, there is no local variable.
> > > > Location lists are used for function parameters.
> > >
> > > Then why is GDB calling get_frame_base? It is only called for
> > > DW_OP_fbreg. If we don't have a frame base, we don't know what
> > > DW_OP_fbreg refers to.
> >
> > Gcc generates:
> >
> > <1><28c955>: Abbrev Number: 47 (DW_TAG_subprogram)
> > DW_AT_sibling : <28c98f>
> > DW_AT_external : 1
> > DW_AT_name : (indirect string, offset: 0x3875d):
> > tls_symbolic_operand
> > DW_AT_decl_file : 1
> > DW_AT_decl_line : 471
> > DW_AT_prototyped : 1
> > DW_AT_type : <2887cb>
> > DW_AT_low_pc : 0x826c1d0
> > DW_AT_high_pc : 0x826c1fc
> > <2><28c96f>: Abbrev Number: 48 (DW_TAG_formal_parameter)
> > DW_AT_name : op
> > DW_AT_decl_file : 1
> > DW_AT_decl_line : 470
> > DW_AT_type : <288a7b>
> > DW_AT_location : 120fbf (location list)
> > <2><28c97e>: Abbrev Number: 49 (DW_TAG_formal_parameter)
> > DW_AT_name : (indirect string, offset: 0x3db66): mode
> > DW_AT_decl_file : 1
> > DW_AT_decl_line : 470
> > DW_AT_type : <288e5d>
> > DW_AT_location : 121018 (location list)
> >
> > for
> >
> > int
> > tls_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
> > {
> > return ((GET_CODE (op) == SYMBOL_REF) && (SYMBOL_REF_TLS_MODEL (op)
> > != 0)) && (mode == VOIDmode || GET_MODE (op) == mode);
> > }
> >
> > It may be a gcc bug after all.
>
> And what's in the location lists? If it's DW_OP_fbreg, then I presume
> it's a GCC bug. According to my reading of the DWARF spec, anyway.
>
<1><418c>: Abbrev Number: 47 (DW_TAG_subprogram)
DW_AT_sibling : <41c6>
DW_AT_external : 1
DW_AT_name : (indirect string, offset: 0x3133): tls_symbolic_operand
DW_AT_decl_file : 1
DW_AT_decl_line : 471
DW_AT_prototyped : 1
DW_AT_type : <2c>
DW_AT_low_pc : 0x2f0
DW_AT_high_pc : 0x31c
<2><41a6>: Abbrev Number: 48 (DW_TAG_formal_parameter)
DW_AT_name : op
DW_AT_decl_file : 1
DW_AT_decl_line : 470
DW_AT_type : <2dc>
DW_AT_location : 549 (location list)
<2><41b5>: Abbrev Number: 49 (DW_TAG_formal_parameter)
DW_AT_name : (indirect string, offset: 0x44e5): mode
DW_AT_decl_file : 1
DW_AT_decl_line : 470
DW_AT_type : <6be>
DW_AT_location : 5a2 (location list)
00000549 000002f0 000002fe (DW_OP_fbreg: 4)
00000549 000002fe 00000300 (DW_OP_reg0)
00000549 00000300 00000301 (DW_OP_fbreg: 4)
00000549 00000301 0000030b (DW_OP_reg0)
00000549 0000030b 00000311 (DW_OP_fbreg: 4)
00000549 00000311 00000315 (DW_OP_reg0)
00000549 00000315 0000031c (DW_OP_fbreg: 4)
000005a2 000002f0 000002fe (DW_OP_fbreg: 8)
000005a2 000002fe 0000031c (DW_OP_reg2)
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-30 20:28 ` Daniel Jacobowitz
2004-12-30 20:52 ` Gdb generates DW_OP_fbreg in " H. J. Lu
@ 2004-12-30 20:56 ` Daniel Berlin
2004-12-30 21:05 ` H. J. Lu
1 sibling, 1 reply; 21+ messages in thread
From: Daniel Berlin @ 2004-12-30 20:56 UTC (permalink / raw)
To: Daniel Jacobowitz; +Cc: H. J. Lu, gcc, GDB
> And what's in the location lists? If it's DW_OP_fbreg, then I presume
> it's a GCC bug. According to my reading of the DWARF spec, anyway.
It is.
I added code to tell it when not to use fbreg, but i only told it not to
use fbreg in the location expression when we were outputting the
frame_base attribute.
However, it appears we don't output a frame base attribute for external
procedures, so we need to tell it it can't use if we don't have a frame
base attribute.
You just need to change when loc_descriptor is called with a second
parameter of true/1 to fix this.
--Dan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-30 20:56 ` Gdb generates " Daniel Berlin
@ 2004-12-30 21:05 ` H. J. Lu
2004-12-31 0:35 ` Daniel Berlin
0 siblings, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-30 21:05 UTC (permalink / raw)
To: Daniel Berlin; +Cc: Daniel Jacobowitz, gcc, GDB
On Thu, Dec 30, 2004 at 03:56:33PM -0500, Daniel Berlin wrote:
>
> > And what's in the location lists? If it's DW_OP_fbreg, then I presume
> > it's a GCC bug. According to my reading of the DWARF spec, anyway.
> It is.
>
> I added code to tell it when not to use fbreg, but i only told it not to
> use fbreg in the location expression when we were outputting the
> frame_base attribute.
>
> However, it appears we don't output a frame base attribute for external
> procedures, so we need to tell it it can't use if we don't have a frame
> base attribute.
>
> You just need to change when loc_descriptor is called with a second
> parameter of true/1 to fix this.
Do you have a patch I can try?
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-30 21:05 ` H. J. Lu
@ 2004-12-31 0:35 ` Daniel Berlin
2004-12-31 19:57 ` H. J. Lu
[not found] ` <20041231163806.GA1335@lucon.org>
0 siblings, 2 replies; 21+ messages in thread
From: Daniel Berlin @ 2004-12-31 0:35 UTC (permalink / raw)
To: H. J. Lu; +Cc: Daniel Jacobowitz, gcc, GDB
[-- Attachment #1: Type: TEXT/PLAIN, Size: 804 bytes --]
On Thu, 30 Dec 2004, H. J. Lu wrote:
> On Thu, Dec 30, 2004 at 03:56:33PM -0500, Daniel Berlin wrote:
>>
>>> And what's in the location lists? If it's DW_OP_fbreg, then I presume
>>> it's a GCC bug. According to my reading of the DWARF spec, anyway.
>> It is.
>>
>> I added code to tell it when not to use fbreg, but i only told it not to
>> use fbreg in the location expression when we were outputting the
>> frame_base attribute.
>>
>> However, it appears we don't output a frame base attribute for external
>> procedures, so we need to tell it it can't use if we don't have a frame
>> base attribute.
>>
>> You just need to change when loc_descriptor is called with a second
>> parameter of true/1 to fix this.
>
> Do you have a patch I can try?
This may not fix all of them, but it should help.
[-- Attachment #2: Type: TEXT/PLAIN, Size: 1148 bytes --]
Index: dwarf2out.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v
retrieving revision 1.564
diff -u -p -r1.564 dwarf2out.c
--- dwarf2out.c 24 Dec 2004 05:23:07 -0000 1.564
+++ dwarf2out.c 31 Dec 2004 00:34:38 -0000
@@ -9980,6 +9980,7 @@ add_location_or_const_value_attribute (d
rtx rtl;
dw_loc_descr_ref descr;
var_loc_list *loc_list;
+ bool can_use_fb = attr != DW_AT_frame_base && !DECL_EXTERNAL (decl);
if (TREE_CODE (decl) == ERROR_MARK)
return;
@@ -10049,7 +10050,7 @@ add_location_or_const_value_attribute (d
varloc = NOTE_VAR_LOCATION (node->var_loc_note);
add_loc_descr_to_loc_list (&list,
loc_descriptor (varloc,
- attr != DW_AT_frame_base),
+ can_use_fb),
node->label, node->next->label, secname);
}
@@ -10070,7 +10071,7 @@ add_location_or_const_value_attribute (d
}
add_loc_descr_to_loc_list (&list,
loc_descriptor (varloc,
- attr != DW_AT_frame_base),
+ can_use_fb),
node->label, endname, secname);
}
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-31 0:35 ` Daniel Berlin
@ 2004-12-31 19:57 ` H. J. Lu
2004-12-31 20:09 ` Daniel Berlin
2004-12-31 20:11 ` H. J. Lu
[not found] ` <20041231163806.GA1335@lucon.org>
1 sibling, 2 replies; 21+ messages in thread
From: H. J. Lu @ 2004-12-31 19:57 UTC (permalink / raw)
To: Daniel Berlin; +Cc: Daniel Jacobowitz, gcc, GDB
On Thu, Dec 30, 2004 at 07:35:13PM -0500, Daniel Berlin wrote:
>
>
> On Thu, 30 Dec 2004, H. J. Lu wrote:
>
> >On Thu, Dec 30, 2004 at 03:56:33PM -0500, Daniel Berlin wrote:
> >>
> >>>And what's in the location lists? If it's DW_OP_fbreg, then I presume
> >>>it's a GCC bug. According to my reading of the DWARF spec, anyway.
> >>It is.
> >>
> >>I added code to tell it when not to use fbreg, but i only told it not to
> >>use fbreg in the location expression when we were outputting the
> >>frame_base attribute.
> >>
> >>However, it appears we don't output a frame base attribute for external
> >>procedures, so we need to tell it it can't use if we don't have a frame
> >>base attribute.
> >>
> >>You just need to change when loc_descriptor is called with a second
> >>parameter of true/1 to fix this.
> >
> >Do you have a patch I can try?
>
> This may not fix all of them, but it should help.
> Index: dwarf2out.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v
> retrieving revision 1.564
> diff -u -p -r1.564 dwarf2out.c
> --- dwarf2out.c 24 Dec 2004 05:23:07 -0000 1.564
> +++ dwarf2out.c 31 Dec 2004 00:34:38 -0000
> @@ -9980,6 +9980,7 @@ add_location_or_const_value_attribute (d
> rtx rtl;
> dw_loc_descr_ref descr;
> var_loc_list *loc_list;
> + bool can_use_fb = attr != DW_AT_frame_base && !DECL_EXTERNAL (decl);
>
> if (TREE_CODE (decl) == ERROR_MARK)
> return;
> @@ -10049,7 +10050,7 @@ add_location_or_const_value_attribute (d
> varloc = NOTE_VAR_LOCATION (node->var_loc_note);
> add_loc_descr_to_loc_list (&list,
> loc_descriptor (varloc,
> - attr != DW_AT_frame_base),
> + can_use_fb),
> node->label, node->next->label, secname);
> }
>
> @@ -10070,7 +10071,7 @@ add_location_or_const_value_attribute (d
> }
> add_loc_descr_to_loc_list (&list,
> loc_descriptor (varloc,
> - attr != DW_AT_frame_base),
> + can_use_fb),
> node->label, endname, secname);
> }
>
There are several problems with this patch:
1. It checks DECL_EXTERNAL. Did you mean TREE_PUBLIC?
2. It doesn't cover PARM_DECL nor RESULT_DECL.
3. For
#0 loc_descriptor (rtl=0xb7d67abc, can_use_fbreg=1 '\001')
at /net/gnu/export/gnu/src/gcc/gcc/gcc/dwarf2out.c:8740
#1 0x0813bd45 in loc_descriptor_from_tree_1 (loc=0xb7d60870,
want_address=2)
at /net/gnu/export/gnu/src/gcc/gcc/gcc/dwarf2out.c:8928
#2 0x0813c2b7 in add_location_or_const_value_attribute
(die=0xb7d66f3c,
decl=0xb7d60870, attr=DW_AT_location)
at /net/gnu/export/gnu/src/gcc/gcc/gcc/dwarf2out.c:9247
#3 0x08141ec6 in gen_formal_parameter_die (node=0xb7d60870,
context_die=0xb7d66ea0)
at /net/gnu/export/gnu/src/gcc/gcc/gcc/dwarf2out.c:11001
#4 0x0813ded2 in gen_decl_die (decl=0xb7d60870,
context_die=0xb7d66ea0)
at /net/gnu/export/gnu/src/gcc/gcc/gcc/dwarf2out.c:12700
#5 0x08140479 in gen_subprogram_die (decl=0xb7d601b0,
context_die=0x84da799)
at /net/gnu/export/gnu/src/gcc/gcc/gcc/dwarf2out.c:11382
it comes from
8926 /* Certain constructs can only be represented at
top-level. */
8927 if (want_address == 2)
8928 return loc_descriptor (rtl, true);
8929
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-31 19:57 ` H. J. Lu
@ 2004-12-31 20:09 ` Daniel Berlin
2004-12-31 20:11 ` H. J. Lu
1 sibling, 0 replies; 21+ messages in thread
From: Daniel Berlin @ 2004-12-31 20:09 UTC (permalink / raw)
To: H. J. Lu; +Cc: Daniel Jacobowitz, gcc, GDB
>
> There are several problems with this patch:
>
> 1. It checks DECL_EXTERNAL. Did you mean TREE_PUBLIC?
No.
Look at the conditions for generating a frame_base.
I'll fix the other cases.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-31 19:57 ` H. J. Lu
2004-12-31 20:09 ` Daniel Berlin
@ 2004-12-31 20:11 ` H. J. Lu
2004-12-31 20:16 ` Daniel Berlin
1 sibling, 1 reply; 21+ messages in thread
From: H. J. Lu @ 2004-12-31 20:11 UTC (permalink / raw)
To: Daniel Berlin; +Cc: Daniel Jacobowitz, gcc, GDB
On Fri, Dec 31, 2004 at 11:57:34AM -0800, H. J. Lu wrote:
> On Thu, Dec 30, 2004 at 07:35:13PM -0500, Daniel Berlin wrote:
> >
> >
> > On Thu, 30 Dec 2004, H. J. Lu wrote:
> >
> > >On Thu, Dec 30, 2004 at 03:56:33PM -0500, Daniel Berlin wrote:
> > >>
> > >>>And what's in the location lists? If it's DW_OP_fbreg, then I presume
> > >>>it's a GCC bug. According to my reading of the DWARF spec, anyway.
> > >>It is.
> > >>
> > >>I added code to tell it when not to use fbreg, but i only told it not to
> > >>use fbreg in the location expression when we were outputting the
> > >>frame_base attribute.
> > >>
> > >>However, it appears we don't output a frame base attribute for external
> > >>procedures, so we need to tell it it can't use if we don't have a frame
> > >>base attribute.
> > >>
> > >>You just need to change when loc_descriptor is called with a second
> > >>parameter of true/1 to fix this.
> > >
> > >Do you have a patch I can try?
> >
> > This may not fix all of them, but it should help.
>
> > Index: dwarf2out.c
> > ===================================================================
> > RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v
> > retrieving revision 1.564
> > diff -u -p -r1.564 dwarf2out.c
> > --- dwarf2out.c 24 Dec 2004 05:23:07 -0000 1.564
> > +++ dwarf2out.c 31 Dec 2004 00:34:38 -0000
> > @@ -9980,6 +9980,7 @@ add_location_or_const_value_attribute (d
> > rtx rtl;
> > dw_loc_descr_ref descr;
> > var_loc_list *loc_list;
> > + bool can_use_fb = attr != DW_AT_frame_base && !DECL_EXTERNAL (decl);
> >
> > if (TREE_CODE (decl) == ERROR_MARK)
> > return;
> > @@ -10049,7 +10050,7 @@ add_location_or_const_value_attribute (d
> > varloc = NOTE_VAR_LOCATION (node->var_loc_note);
> > add_loc_descr_to_loc_list (&list,
> > loc_descriptor (varloc,
> > - attr != DW_AT_frame_base),
> > + can_use_fb),
> > node->label, node->next->label, secname);
> > }
> >
> > @@ -10070,7 +10071,7 @@ add_location_or_const_value_attribute (d
> > }
> > add_loc_descr_to_loc_list (&list,
> > loc_descriptor (varloc,
> > - attr != DW_AT_frame_base),
> > + can_use_fb),
> > node->label, endname, secname);
> > }
> >
>
> There are several problems with this patch:
>
> 1. It checks DECL_EXTERNAL. Did you mean TREE_PUBLIC?
> 2. It doesn't cover PARM_DECL nor RESULT_DECL.
> 3. For
>
This patch seems to generate better debug info.
H.J.
--- dwarf2out.c.loc 2004-12-27 12:04:10.000000000 -0800
+++ dwarf2out.c 2004-12-31 12:10:01.400120743 -0800
@@ -3919,8 +3919,8 @@ static int is_based_loc (rtx);
static dw_loc_descr_ref mem_loc_descriptor (rtx, enum machine_mode mode, bool);
static dw_loc_descr_ref concat_loc_descriptor (rtx, rtx);
static dw_loc_descr_ref loc_descriptor (rtx, bool);
-static dw_loc_descr_ref loc_descriptor_from_tree_1 (tree, int);
-static dw_loc_descr_ref loc_descriptor_from_tree (tree);
+static dw_loc_descr_ref loc_descriptor_from_tree_1 (tree, bool, int);
+static dw_loc_descr_ref loc_descriptor_from_tree (tree, bool);
static HOST_WIDE_INT ceiling (HOST_WIDE_INT, unsigned int);
static tree field_type (tree);
static unsigned int simple_type_align_in_bits (tree);
@@ -8815,7 +8815,7 @@ loc_descriptor (rtx rtl, bool can_use_fb
the value of LOC. */
static dw_loc_descr_ref
-loc_descriptor_from_tree_1 (tree loc, int want_address)
+loc_descriptor_from_tree_1 (tree loc, bool can_use_fb, int want_address)
{
dw_loc_descr_ref ret, ret1;
int have_address = 0;
@@ -8854,7 +8854,7 @@ loc_descriptor_from_tree_1 (tree loc, in
return 0;
/* Otherwise, process the argument and look for the address. */
- return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 1);
+ return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), can_use_fb, 1);
case VAR_DECL:
if (DECL_THREAD_LOCAL (loc))
@@ -8895,7 +8895,8 @@ loc_descriptor_from_tree_1 (tree loc, in
case PARM_DECL:
if (DECL_VALUE_EXPR (loc))
- return loc_descriptor_from_tree_1 (DECL_VALUE_EXPR (loc), want_address);
+ return loc_descriptor_from_tree_1 (DECL_VALUE_EXPR (loc), can_use_fb,
+ want_address);
/* FALLTHRU */
case RESULT_DECL:
@@ -8925,7 +8926,7 @@ loc_descriptor_from_tree_1 (tree loc, in
/* Certain constructs can only be represented at top-level. */
if (want_address == 2)
- return loc_descriptor (rtl, true);
+ return loc_descriptor (rtl, can_use_fb);
mode = GET_MODE (rtl);
if (MEM_P (rtl))
@@ -8933,18 +8934,19 @@ loc_descriptor_from_tree_1 (tree loc, in
rtl = XEXP (rtl, 0);
have_address = 1;
}
- ret = mem_loc_descriptor (rtl, mode, true);
+ ret = mem_loc_descriptor (rtl, mode, can_use_fb);
}
}
break;
case INDIRECT_REF:
- ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
+ ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), can_use_fb, 0);
have_address = 1;
break;
case COMPOUND_EXPR:
- return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), want_address);
+ return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), can_use_fb,
+ want_address);
case NOP_EXPR:
case CONVERT_EXPR:
@@ -8952,7 +8954,8 @@ loc_descriptor_from_tree_1 (tree loc, in
case VIEW_CONVERT_EXPR:
case SAVE_EXPR:
case MODIFY_EXPR:
- return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), want_address);
+ return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), can_use_fb,
+ want_address);
case COMPONENT_REF:
case BIT_FIELD_REF:
@@ -8970,7 +8973,7 @@ loc_descriptor_from_tree_1 (tree loc, in
if (obj == loc)
return 0;
- ret = loc_descriptor_from_tree_1 (obj, 1);
+ ret = loc_descriptor_from_tree_1 (obj, can_use_fb, 1);
if (ret == 0
|| bitpos % BITS_PER_UNIT != 0 || bitsize % BITS_PER_UNIT != 0)
return 0;
@@ -8978,7 +8981,8 @@ loc_descriptor_from_tree_1 (tree loc, in
if (offset != NULL_TREE)
{
/* Variable offset. */
- add_loc_descr (&ret, loc_descriptor_from_tree_1 (offset, 0));
+ add_loc_descr (&ret, loc_descriptor_from_tree_1 (offset, can_use_fb,
+ 0));
add_loc_descr (&ret, new_loc_descr (DW_OP_plus, 0, 0));
}
@@ -9012,7 +9016,7 @@ loc_descriptor_from_tree_1 (tree loc, in
return 0;
mode = GET_MODE (rtl);
rtl = XEXP (rtl, 0);
- ret = mem_loc_descriptor (rtl, mode, true);
+ ret = mem_loc_descriptor (rtl, mode, can_use_fb);
have_address = 1;
break;
}
@@ -9068,7 +9072,7 @@ loc_descriptor_from_tree_1 (tree loc, in
if (TREE_CODE (TREE_OPERAND (loc, 1)) == INTEGER_CST
&& host_integerp (TREE_OPERAND (loc, 1), 0))
{
- ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
+ ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), can_use_fb, 0);
if (ret == 0)
return 0;
@@ -9120,8 +9124,8 @@ loc_descriptor_from_tree_1 (tree loc, in
goto do_binop;
do_binop:
- ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
- ret1 = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), 0);
+ ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), can_use_fb, 0);
+ ret1 = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), can_use_fb, 0);
if (ret == 0 || ret1 == 0)
return 0;
@@ -9143,7 +9147,7 @@ loc_descriptor_from_tree_1 (tree loc, in
goto do_unop;
do_unop:
- ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
+ ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), can_use_fb, 0);
if (ret == 0)
return 0;
@@ -9167,12 +9171,12 @@ loc_descriptor_from_tree_1 (tree loc, in
case COND_EXPR:
{
dw_loc_descr_ref lhs
- = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), 0);
+ = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), can_use_fb, 0);
dw_loc_descr_ref rhs
- = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 2), 0);
+ = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 2), can_use_fb, 0);
dw_loc_descr_ref bra_node, jump_node, tmp;
- ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
+ ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), can_use_fb, 0);
if (ret == 0 || lhs == 0 || rhs == 0)
return 0;
@@ -9242,9 +9246,9 @@ loc_descriptor_from_tree_1 (tree loc, in
}
static inline dw_loc_descr_ref
-loc_descriptor_from_tree (tree loc)
+loc_descriptor_from_tree (tree loc, bool can_use_fb)
{
- return loc_descriptor_from_tree_1 (loc, 2);
+ return loc_descriptor_from_tree_1 (loc, can_use_fb, 2);
}
/* Given a value, round it up to the lowest multiple of `boundary'
@@ -9980,6 +9984,7 @@ add_location_or_const_value_attribute (d
rtx rtl;
dw_loc_descr_ref descr;
var_loc_list *loc_list;
+ bool can_use_fb;
if (TREE_CODE (decl) == ERROR_MARK)
return;
@@ -9987,6 +9992,17 @@ add_location_or_const_value_attribute (d
gcc_assert (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL
|| TREE_CODE (decl) == RESULT_DECL);
+ switch (TREE_CODE (decl))
+ {
+ default:
+ can_use_fb = attr != DW_AT_frame_base && !TREE_PUBLIC (decl);
+ break;
+ case PARM_DECL:
+ case RESULT_DECL:
+ can_use_fb = attr != DW_AT_frame_base && !TREE_PUBLIC (DECL_CONTEXT (decl));
+ break;
+ }
+
/* See if we possibly have multiple locations for this variable. */
loc_list = lookup_decl_loc (decl);
@@ -10037,7 +10053,7 @@ add_location_or_const_value_attribute (d
node = loc_list->first;
varloc = NOTE_VAR_LOCATION (node->var_loc_note);
- list = new_loc_list (loc_descriptor (varloc, attr != DW_AT_frame_base),
+ list = new_loc_list (loc_descriptor (varloc, can_use_fb),
node->label, node->next->label, secname, 1);
node = node->next;
@@ -10049,7 +10065,7 @@ add_location_or_const_value_attribute (d
varloc = NOTE_VAR_LOCATION (node->var_loc_note);
add_loc_descr_to_loc_list (&list,
loc_descriptor (varloc,
- attr != DW_AT_frame_base),
+ can_use_fb),
node->label, node->next->label, secname);
}
@@ -10070,7 +10086,7 @@ add_location_or_const_value_attribute (d
}
add_loc_descr_to_loc_list (&list,
loc_descriptor (varloc,
- attr != DW_AT_frame_base),
+ can_use_fb),
node->label, endname, secname);
}
@@ -10086,7 +10102,7 @@ add_location_or_const_value_attribute (d
return;
}
- descr = loc_descriptor_from_tree (decl);
+ descr = loc_descriptor_from_tree (decl, can_use_fb);
if (descr)
add_AT_location_description (die, attr, descr);
}
@@ -10205,7 +10221,7 @@ add_bound_info (dw_die_ref subrange_die,
dw_die_ref ctx, decl_die;
dw_loc_descr_ref loc;
- loc = loc_descriptor_from_tree (bound);
+ loc = loc_descriptor_from_tree (bound, false);
if (loc == NULL)
break;
@@ -11331,7 +11347,7 @@ gen_subprogram_die (tree decl, dw_die_re
if (cfun->static_chain_decl)
add_AT_location_description (subr_die, DW_AT_static_link,
- loc_descriptor_from_tree (cfun->static_chain_decl));
+ loc_descriptor_from_tree (cfun->static_chain_decl, false));
}
/* Now output descriptions of the arguments for this function. This gets
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Gdb generates location list without DW_AT_frame_base
2004-12-31 20:11 ` H. J. Lu
@ 2004-12-31 20:16 ` Daniel Berlin
0 siblings, 0 replies; 21+ messages in thread
From: Daniel Berlin @ 2004-12-31 20:16 UTC (permalink / raw)
To: H. J. Lu; +Cc: Daniel Jacobowitz, gcc, GDB
>
> This patch seems to generate better debug info.
You missed a whole bunch of cases where we are arbitrarily passing true to
mem_loc_descriptor or loc_descriptor.
You also *can* generate a frame base for the testcase you sent me, we just
don't use all the info we could to generate it.
See the last patch i sent you which adds code to the
add_location_or_const_value_attribute routine.
Also, whether we generate a frame_base has *nothing* to do with the
setting of TREE_PUBLIC.
The code says:
else if (!DECL_EXTERNAL (decl))
{
....
/* Define the "frame base" location for this routine. We use the
frame pointer or stack pointer registers, since the RTL for local
variables is relative to one of them. */
if (frame_base_decl && lookup_decl_loc (frame_base_decl) != NULL)
{
add_location_or_const_value_attribute (subr_die,
frame_base_decl,
DW_AT_frame_base);
}
else
{
fp_reg
= frame_pointer_needed ? hard_frame_pointer_rtx :
stack_pointer_rtx;
add_AT_loc (subr_die, DW_AT_frame_base, reg_loc_descriptor
(fp_reg));
}
}
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: gcc 4.0 generates location list without DW_AT_frame_base
[not found] ` <20041231220324.GA5987@lucon.org>
@ 2005-01-01 19:15 ` H. J. Lu
2005-01-01 20:09 ` Daniel Jacobowitz
2005-01-01 20:50 ` Daniel Berlin
0 siblings, 2 replies; 21+ messages in thread
From: H. J. Lu @ 2005-01-01 19:15 UTC (permalink / raw)
To: Daniel Berlin; +Cc: gcc, GDB
On Fri, Dec 31, 2004 at 02:03:24PM -0800, H. J. Lu wrote:
> On Fri, Dec 31, 2004 at 04:57:17PM -0500, Daniel Berlin wrote:
> > >0x000000000055c84d in add_location_or_const_value_attribute
> > >(die=0x2a96205820,
> > > decl=0x2a961ad000, attr=DW_AT_location)
> > > at /export/gnu/src/gcc/gcc/gcc/dwarf2out.c:10108
> > >10108 descr = loc_descriptor (NOTE_VAR_LOCATION
> > >(node->var_loc_note),
> > >(gdb) p *loc_list
> > >$4 = {first = 0x0, last = 0x0, decl_id = 14047}
> > >(gdb)
> >
> > Oh, that's weird.
> > Wonder why we added it then.
> > anyway, just change
> > if (loc_list)
> > to
> > if (loc_list && loc_list->first)
>
> I am testing it now. Bootstrap has passed the previous failure. It will
> take a while to finish.
The modified patch works with tls_symbolic_operand in i386. However,
I do see
<2><427491>: Abbrev Number: 39 (DW_TAG_inlined_subroutine)
DW_AT_sibling : <427510>
DW_AT_abstract_origin: <427159>
DW_AT_low_pc : 0x8399aea
DW_AT_high_pc : 0x8399b3c
<3><4274a2>: Abbrev Number: 37 (DW_TAG_formal_parameter)
DW_AT_abstract_origin: <42716b>
<3><4274a7>: Abbrev Number: 37 (DW_TAG_formal_parameter)
DW_AT_abstract_origin: <427177>
<3><4274ac>: Abbrev Number: 44 (DW_TAG_lexical_block)
DW_AT_low_pc : 0x8399aea
DW_AT_high_pc : 0x8399b3c
<4><4274b5>: Abbrev Number: 42 (DW_TAG_variable)
DW_AT_abstract_origin: <427183>
DW_AT_location : 2 byte block: 91 54 (DW_OP_fbreg: -44)
[without DW_AT_frame_base]
I assume it is normal.
H.J.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: gcc 4.0 generates location list without DW_AT_frame_base
2005-01-01 19:15 ` gcc 4.0 " H. J. Lu
@ 2005-01-01 20:09 ` Daniel Jacobowitz
2005-01-01 20:50 ` Daniel Berlin
1 sibling, 0 replies; 21+ messages in thread
From: Daniel Jacobowitz @ 2005-01-01 20:09 UTC (permalink / raw)
To: H. J. Lu; +Cc: Daniel Berlin, gcc, GDB
On Sat, Jan 01, 2005 at 11:15:00AM -0800, H. J. Lu wrote:
> The modified patch works with tls_symbolic_operand in i386. However,
> I do see
>
> <2><427491>: Abbrev Number: 39 (DW_TAG_inlined_subroutine)
> DW_AT_sibling : <427510>
> DW_AT_abstract_origin: <427159>
> DW_AT_low_pc : 0x8399aea
> DW_AT_high_pc : 0x8399b3c
> <3><4274a2>: Abbrev Number: 37 (DW_TAG_formal_parameter)
> DW_AT_abstract_origin: <42716b>
> <3><4274a7>: Abbrev Number: 37 (DW_TAG_formal_parameter)
> DW_AT_abstract_origin: <427177>
Do the abstract origins have locations? Otherwise, that's a problem...
--
Daniel Jacobowitz
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: gcc 4.0 generates location list without DW_AT_frame_base
2005-01-01 19:15 ` gcc 4.0 " H. J. Lu
2005-01-01 20:09 ` Daniel Jacobowitz
@ 2005-01-01 20:50 ` Daniel Berlin
1 sibling, 0 replies; 21+ messages in thread
From: Daniel Berlin @ 2005-01-01 20:50 UTC (permalink / raw)
To: H. J. Lu; +Cc: gcc, GDB
> I do see
>
> <2><427491>: Abbrev Number: 39 (DW_TAG_inlined_subroutine)
> DW_AT_sibling : <427510>
> DW_AT_abstract_origin: <427159>
> DW_AT_low_pc : 0x8399aea
> DW_AT_high_pc : 0x8399b3c
> <3><4274a2>: Abbrev Number: 37 (DW_TAG_formal_parameter)
> DW_AT_abstract_origin: <42716b>
> <3><4274a7>: Abbrev Number: 37 (DW_TAG_formal_parameter)
> DW_AT_abstract_origin: <427177>
> <3><4274ac>: Abbrev Number: 44 (DW_TAG_lexical_block)
> DW_AT_low_pc : 0x8399aea
> DW_AT_high_pc : 0x8399b3c
> <4><4274b5>: Abbrev Number: 42 (DW_TAG_variable)
> DW_AT_abstract_origin: <427183>
> DW_AT_location : 2 byte block: 91 54 (DW_OP_fbreg: -44)
> [without DW_AT_frame_base]
>
> I assume it is normal.
No.
I'll fix the whole damn thing in a moment the right way (by having it
verify the nearest enclosing subroutine die has a at_frame attribute and
using that as the value of can_use_fb)
>
>
> H.J.
>
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2005-01-01 20:50 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-22 1:16 Is this a gcc, gdb or readelf bug? H. J. Lu
2004-12-22 11:09 ` Nick Clifton
2004-12-22 18:25 ` H. J. Lu
2004-12-23 3:43 ` Daniel Jacobowitz
2004-12-30 19:24 ` GDB 6.3 assumes that DW_AT_frame_base exists H. J. Lu
2004-12-30 19:36 ` H. J. Lu
2004-12-30 19:56 ` H. J. Lu
2004-12-30 20:07 ` Daniel Jacobowitz
2004-12-30 20:23 ` Gdb generates location list without DW_AT_frame_base H. J. Lu
2004-12-30 20:28 ` Daniel Jacobowitz
2004-12-30 20:52 ` Gdb generates DW_OP_fbreg in " H. J. Lu
2004-12-30 20:56 ` Gdb generates " Daniel Berlin
2004-12-30 21:05 ` H. J. Lu
2004-12-31 0:35 ` Daniel Berlin
2004-12-31 19:57 ` H. J. Lu
2004-12-31 20:09 ` Daniel Berlin
2004-12-31 20:11 ` H. J. Lu
2004-12-31 20:16 ` Daniel Berlin
[not found] ` <20041231163806.GA1335@lucon.org>
[not found] ` <Pine.LNX.4.60.0412311158280.27590@dberlin.org>
[not found] ` <20041231184405.GA2182@lucon.org>
[not found] ` <Pine.LNX.4.60.0412311451060.6844@dberlin.org>
[not found] ` <Pine.LNX.4.60.0412311509360.6844@dberlin.org>
[not found] ` <20041231215010.GA5722@lucon.org>
[not found] ` <20041231215443.GA5853@lucon.org>
[not found] ` <Pine.LNX.4.60.0412311656360.6844@dberlin.org>
[not found] ` <20041231220324.GA5987@lucon.org>
2005-01-01 19:15 ` gcc 4.0 " H. J. Lu
2005-01-01 20:09 ` Daniel Jacobowitz
2005-01-01 20:50 ` Daniel Berlin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox