This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils 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]

Re: curious check in dwarf2_gen_line_info()



On 29/12/2004, at 2:05 AM, David Mosberger wrote:


[Resend^2: I mistakenly typed .com instead of .org for his domain... ;-( ]

In dwarf2dbg.c:dwarf2_gen_line_info(), one finds this curious code and
comment:

  /* Don't emit sequences of line symbols for the same line when the
     symbols apply to assembler code.  It is necessary to emit
     duplicate line symbols when a compiler asks for them, because GDB
     uses them to determine the end of the prologue.  */
  if (debug_type == DEBUG_DWARF2
        && line == loc->line && filenum == loc->filenum)
    return;

The "debug_type == DEBUG_DWARF2" checks has the effect that for
compiler-generated files, the line info is replicated for each
instruction, even when that info doesn't change at all.

The change seems to have been introduced back in 2002:

2002-04-17 Geoffrey Keating <geoffk@redhat.com>
* dwarf2dbg.c (dwarf2_gen_line_info): Do emit duplicate line
numbers, gdb relies on them to detect the start of the prologue.


but there is no hint on which platform needed this workaround.

My understanding is that it was needed on all platforms. It's used when the user writes


break foo

in GDB, to break after foo's prologue, rather than on its first instruction. As I wrote in 2002,

GDB uses duplicate line numbers to detect the end of the prologue.
GCC would carefully emit them... and gas was stripping them out.

I don't believe this patch will significantly affect the size of the
debug info for assembler source, because having multiple instructions
on a line is rare.

I tested this by running the GAS and GDB testsuites on
powerpc-eabisim.

[the patch was later revised to not apply to assembler source.]


Maybe the GDB people have implemented some other technique for this, in which case it could go away. Running the GDB testsuite should show the problem. (Actually, IMO, the whole thing is wrong; GDB really should be breaking on the first instruction. The problem with that is that GCC+GDB isn't smart enough to permit the user to print the contents of incoming arguments at a breakpoint on the first instruction of a routine, it needs the prologue to be executed. It would be very cool to fix that.)

This is not a change that should be first made in the assembler. Instead of having the compiler emit duplicates and have the assembler remove them, the compiler should be changed to not emit duplicates in the first place if they are no longer needed.

The overhead of the duplicates should not be very significant (compared to the information that is required), because the compiler should already be suppressing duplicate line information except where it is needed.

Attachment: smime.p7s
Description: S/MIME cryptographic signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]