This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB 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] | |
Hello,
I writing a better pass (variable tracking) for GCC which finally emits
location lists for variables. (If you are insterested it is at
http://artax.karlin.mff.cuni.cz/~zlomj9am/download/vt-main.patch
It still contains many debugging checks and (disabled) prints.)
Let the local variables and (some) arguments be addressed using stack pointer,
for example x86-64 architecture with variables addressed using %rsp.
The address emitted for variables located on stack by my new patch is always
DW_OP_fbreg + constant.
When I was testing the emitted debug info with mainline GDB I found that
GDB probably does not adjust addresses of variables when stack pointer changes
(like because of "pushq" instruction) if using location lists.
I think GDB should adjust the address of %rsp addressed variables according to
change of %rsp (probably DWARF2 sais so for DW_OP_fbreg). I think it is a
better solution than emitting new locations to location list for all variables
located on stack after each "push" and "pop" which would cause too large debug
info.
When I looked to gdb/dwarf2loc.c I see there:
/* FIXME: cagney/2003-03-26: This code should be using
get_frame_base_address(), and then implement a dwarf2 specific
this_base method. */
Probably this is related to my problem.
I tested it on attached C file, assembler with debug info and x86-64 binary
is attached too.
GDB's output:
# g is the first argument on stack, the first 6 arguments are in registers
Breakpoint 1, func1 (a=10, b=20, c=30, d=40, e=50, f=60, g=70, seq=0) at m.c:5
5 {
2: x/i $pc 0x400400 <func1>: push %r12
1: g = 70
(gdb) ni
0x0000000000400402 5 {
2: x/i $pc 0x400402 <func1+2>: mov %rcx,%r12
# here it looks GDB did not recompute address
1: g = 4195497
(gdb)
0x0000000000400405 5 {
2: x/i $pc 0x400405 <func1+5>: mov %r8,%rcx
1: g = 4195497
(gdb)
0x0000000000400408 5 {
2: x/i $pc 0x400408 <func1+8>: mov %rdx,%r10
1: g = 4195497
(gdb)
0x000000000040040b 5 {
2: x/i $pc 0x40040b <func1+11>: push %rbp
1: g = 4195497
(gdb)
0x000000000040040c 5 {
2: x/i $pc 0x40040c <func1+12>: mov %rdi,%rbp
1: g = 4195520
(gdb)
0x000000000040040f 5 {
2: x/i $pc 0x40040f <func1+15>: push %rbx
1: g = 4195520
(gdb)
0x0000000000400410 5 {
2: x/i $pc 0x400410 <func1+16>: mov 0x20(%rsp,1),%r8
1: g = 548682067112
# here g was loaded from stack to %r8
(gdb)
0x0000000000400415 5 {
2: x/i $pc 0x400415 <func1+21>: mov %rsi,%rbx
1: g = 70
(gdb)
Josef
long volatile vol;
long
func1 (long a, long b, long c, long d, long e, long f, long g, int seq)
{
vol = a + b + c + d + e + f + g;
if (seq == 3)
return vol;
return func1 (g, f, e, d, c, b, a, seq + 1);
}
int
main ()
{
vol = func1 (10, 20, 30, 40, 50, 60, 70, 0);
return (int) vol;
}
Attachment:
m.s
Description: Text document
Attachment:
a.out
Description: Binary data
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |