Issue 139549
Summary prologue_end since LLVM20 misleads gdb into setting flawed breakpoints
Labels debuginfo
Assignees jmorse
Reporter jmorse
    While working on the reproducer from #135937, I discovered that gdb really doesn't like the new placement of `prologue_end` since #107849 and related patches. The code:

     1  int printf(const char *, ...);
     2  int a, c;
 3  unsigned b = 5;
     4  int d() {
     5    if (b)
     6      return b;
     7    c = 8;  // Dead code here
     8  }
     9  int main() {
 10    d();
    11    printf("%X\n", a);
    12  }

Compiled with clang 3b4f9c544274 `-g -O2` produces this code at the beginning of main:

 0000000000001160 <main>:
        1160:       83 3d c9 2e 00 00 00    cmpl $0x0,0x2ec9(%rip)        # 4030 <b>
        1167:       75 0a jne    1173 <main+0x13>
        1169:       c7 05 c5 2e 00 00 08    movl $0x8,0x2ec5(%rip)        # 4038 <c>
        1170:       00 00 00

Which has this linetable:

    0x0000000000001160      5      7      0   0 0  is_stmt prologue_end
    0x0000000000001169      7      5      0   0 0  is_stmt
    0x0000000000001174     11     18      0   0 0  is_stmt

i.e., the first line is part of `d` that's been inlined, and the prologue immediately ends. LLDB is happy with this, the SCE debugger is happy with this, however gdb:

    (gdb) start
    Temporary breakpoint 1 at 0x1169: file /tmp/wat.c, line 10.
    [runs to completion]

places the initial breakpoint for 'main' on the line entry /after/ prologue_end, which is past the first branch instruction. As a result, the path taken through `main` isn't completely covered by that breakpoint, and the program never stops. This is undesirable. The gdb version string I have locally is `GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1`.

DWARF5 describes the prologue_end flag thusly:

    A boolean indicating that the current address is one (of possibly many) where execution should be suspended for a breakpoint at the entry of a function

Which I feel naturally means that the address to suspend execution is that address where prologue_end _is_. i.e. 0x1160 in this example. gdb would appear to have an interpretation that I'm unfamiliar with.

Next steps are, I believe:
 * If someone has a different interpretation of prologue_end, or can explain why gdb behaves in this way, please do tell me!,
 * Otherwise I'll try to replicate with the latest version of gdb,
 * And if it replicates, I'll report to gdb to see what they think the correct behaviour should be.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to