[PATCH 1/2] Allow function prologues to have multiple repeating lines

Simon Marchi simark@simark.ca
Mon Nov 5 03:50:00 GMT 2018


Hi Alan,

A side-note, I wasn't able to apply your patch directly, because the diff contains
CRLF line terminators.  I took the body of your message, which is base64-encoded
(this is not an issue, git-am can deal with this) and decoded it to a file (named
patch2 below).  As-is, it wouldn't apply, but after passing it in dos2unix it worked
fine.

$ git apply patch2
error: patch failed: gdb/symtab.c:3925
error: gdb/symtab.c: patch does not apply
$ file patch2
patch2: unified diff output, UTF-8 Unicode text, with CRLF line terminators
$ dos2unix patch2
dos2unix: converting file patch2 to Unix format...
$ file patch2
patch2: unified diff output, UTF-8 Unicode text
$ git apply patch2
* works *

Since you are working on a mac (according to the tail of the patch), which doesn't
usually uses CRLF, I wonder how they got there.  Are you able to git-am your
patch directly?

Anyway, comments on the actual patch:

I am able to generate a somewhat similar debug info using this ugly code:

int hello(int a) {int b = a + 1;
    return a;
}

int main()
{
  return hello(2);
}

$ readelf --debug-dump=decodedline a.out
Contents of the .debug_line section:

CU: ./test.c:
File name                            Line number    Starting address    View
test.c                                         1              0x1119
test.c                                         1              0x1120
test.c                                         2              0x1129
test.c                                         3              0x112c
...

The user code starts at 0x1120.  How would the debugger know that in this case
the prologue shouldn't extend up to 0x1129 (exclusive)?  With your patch applied,
skip_prologue_using_sal returns 0x1129.  However, GDB ends up getting it right
(I don't really know how and don't really have time right now to dig more):

(gdb) b hello
Breakpoint 1 at 0x1120: file test.c, line 1.

So I'm just wondering if you see some potential problems with this.

On 2018-10-24 5:04 a.m., Alan Hayward wrote:
> Compiling gdb.cp/ovldbreak.cc on Ubuntu places two identical line numbers
> in the function prologue.
> 
> x86_64 Ubtunu 16.04 with GCC 5.4.0-6ubuntu1~16.04.4
> 000000000040052f <main>:
> Line 48
>   40052f:	55                   	push   %rbp
>   400530:	48 89 e5             	mov    %rsp,%rbp
>   400533:	53                   	push   %rbx
>   400534:	48 81 ec 88 00 00 00 	sub    $0x88,%rsp
> Line 48
>   40053b:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
>   400542:	00 00
>   400544:	48 89 45 e8          	mov    %rax,-0x18(%rbp)
>   400548:	31 c0                	xor    %eax,%eax
> Line 49
>   40054a:	c6 45 85 02          	movb   $0x2,-0x7b(%rbp)
> Line 50
>   40054e:	c6 45 86 03          	movb   $0x3,-0x7a(%rbp)
> etc
> 
> Aarch64 Ubuntu 16.04 with GCC 7.2.0-1ubuntu1~16.04
> 0000000000400708 <main>:
> Line 48
>   400708:	d102c3ff 	sub	sp, sp, #0xb0
>   40070c:	a9027bfd 	stp	x29, x30, [sp,#32]
>   400710:	910083fd 	add	x29, sp, #0x20
>   400714:	f9001bf3 	str	x19, [sp,#48]
> Line 48
>   400718:	90000100 	adrp	x0, 420000 <_GLOBAL_OFFSET_TABLE_+0x28>
>   40071c:	9100e000 	add	x0, x0, #0x38
>   400720:	f9400001 	ldr	x1, [x0]
>   400724:	f90047a1 	str	x1, [x29,#136]
>   400728:	d2800001 	mov	x1, #0x0                   	// #0
> Line 49
>   40072c:	52800040 	mov	w0, #0x2                   	// #2
>   400730:	3900b7a0 	strb	w0, [x29,#45]
> Line 50
>   400734:	52800060 	mov	w0, #0x3                   	// #3
>   400738:	3900bba0 	strb	w0, [x29,#46]
> etc
> 
> Compare to openSUSE 13.3 AArch64 with GCC 7.2.1 20171020
> 
> 00000000004005e4 <main>:
> Line 48
>   4005e4:	d102c3ff 	sub	sp, sp, #0xb0
>   4005e8:	a9027bfd 	stp	x29, x30, [sp, #32]
>   4005ec:	910083fd 	add	x29, sp, #0x20
>   4005f0:	f9001bf3 	str	x19, [sp, #48]
> Line 49
>   4005f4:	52800040 	mov	w0, #0x2                   	// #2
>   4005f8:	39023fa0 	strb	w0, [x29, #143]
> Line 50
>   4005fc:	52800060 	mov	w0, #0x3                   	// #3
>   400600:	39023ba0 	strb	w0, [x29, #142]

Just curious, did you get this output directly from using a tool, and if so which one?

> 
> skip_prologue_using_sal () does did not allow for the case where there might
> be two SALs with the same line number in a function prologue. Allow this.
> 
> Fixes over 50 tests on Aarch64 Ubuntu.
> 
> 2018-10-24  Alan Hayward  <alan.hayward@arm.com>
> 
> 	* symtab.c (skip_prologue_using_sal): Don't break for equal line
> 	numbers.
> ---
>  gdb/symtab.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index 2e48d6527e..67ab5d40fa 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -3925,9 +3925,9 @@ skip_prologue_using_sal (struct gdbarch *gdbarch, CORE_ADDR func_addr)
>  	  sal = find_pc_line (prologue_sal.end, 0);
>  	  if (sal.line == 0)
>  	    break;
> -	  /* Assume that a consecutive SAL for the same (or larger)
> -	     line mark the prologue -> body transition.  */
> -	  if (sal.line >= prologue_sal.line)
> +	  /* Assume that a SAL to a larger line marks the prologue -> body
> +	     transition.  */
> +	  if (sal.line > prologue_sal.line)
>  	    break;
>  	  /* Likewise if we are in a different symtab altogether
>  	     (e.g. within a file included via #include).  */
> 

There is a comments just lower:

	  /* The line number is smaller.  Check that it's from the
	     same function, not something inlined.  If it's inlined,
	     then there is no point comparing the line numbers.  */

It would probably need to be updated, smaller -> smaller or equal?

Simon



More information about the Gdb-patches mailing list