This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: break $function in coff/pe doesn't break exactly before the first statement?
- From: Pedro Alves <pedro_alves at portugalmail dot pt>
- To: gdb at sourceware dot org
- Cc: Eli Zaretskii <eliz at gnu dot org>
- Date: Sat, 09 Dec 2006 20:21:45 +0000
- Subject: Re: break $function in coff/pe doesn't break exactly before the first statement?
- References: <455EE79E.6000109@portugalmail.pt> <uveldatp9.fsf@gnu.org> <455EF845.40902@portugalmail.pt> <455F2754.5060703@portugalmail.pt> <20061118163738.GA14800@nevyn.them.org>
Daniel Jacobowitz escreveu:
On Sat, Nov 18, 2006 at 03:31:32PM +0000, Pedro Alves wrote:
.loc 1 15 0
pushl %ebp
LCFI0:
movl $16, %eax
movl %esp, %ebp
LCFI1:
subl $8, %esp
LCFI2:
.loc 1 15 0
andl $-16, %esp
call __alloca
call ___main
.loc 1 17 0
What do you think could be done to fix this?
Is it the .loc directives that are being output wrong? Or is it gdb's
prologue reader
(if there is such a thing) that is missing the fact that __main is not
user code?
Probably both. The second line number marker normally marks the end of
the prologue (...)
Here is a quick list of which target does what:
I see that there are a lot of targets that have similar
code in their *_skip_prologue version.
Most use something like:
form1:
if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
{
struct symtab_and_line sal;
sal = find_pc_line (func_addr, 0);
if (sal.line != 0 && sal.end < func_end)
return sal.end;
/* Either there's no line info, or the line after the prologue is after
the end of the function. In this case, there probably isn't a
prologue. */
return pc;
}
Some targets do the above and add a check for SYMBOL_LANGUAGE (sym) != language_asm:
check_asm:
/* Don't use line number debug info for assembly source files. */
if (sym && SYMBOL_LANGUAGE (sym) != language_asm)
{
sal = find_pc_line (func_addr, 0);
if (sal.end && sal.end < func_end)
{
/* Found a line number, use it as end of prologue. */
return sal.end;
}
}
A few others use skip_prologue_using_sal,
Some others don't look at the line info at all,
and others need to tweak the algorithm a bit, not falling in the
previous groups so I called them other/other.
Makes me wonder what is the best method of skipping the prologue in the presence of
debug info, and if it worth it to clean all the targets by having a common function?
nothing:
s390-tdep.c, spu-tdep.c, rs6000-tdep.c, m68k-tdep.c,
ia64-tdep.c, i386-tdep.c, amd64-tdep.c
form1 (find_pc_line):
sh64-tdep.c, sh-tdep.c, sparc64-tdep.c, sparc-tdep.c, v850-tdep.c,
m32r-tdep.c, hppa-tdep.c, h8300-tdep.c, frv-tdep.c, cris-tdep.c
form2 (skip_prologue_using_sal):
mips-tdep.c
check_asm:
mt-tdep.c, arm-tdep.c,
other/extra:
xtensa-tdep.c, xstormy-tdep.c, xstormy16-tdep.c, mn10300-tdep.c,
m32c-tdep.c, alpha-tdep.c,
I'm posting a i386 only patch at gdb-patches for now.
Cheers,
Pedro Alves