http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59090

            Bug ID: 59090
           Summary: Broken debug information for a function containing
                    __sync_compare_and_swap
           Product: gcc
           Version: 4.6.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kostja.osipov at gmail dot com

gcc 4.6.3 fails to produce a correct debuggable binary when a function uses
an atomic built-iin and an infinite loop.

In the example below a breakpoint on 'pop' never hits, even though pop is
clearly called from main.

kostja@olah ~ % cat bug.c 
void *
pop(void **ptr)
{
    for (;;) {
        void *p=  *ptr;
        if (__sync_val_compare_and_swap(ptr, p, 0) == p)
            return p;
    }
}

int main()
{
    void *ptr = 0;
    void *val = pop(&ptr);

    return 0;
}

kostja@olah ~ % gcc -O0 -g bug.c; gdb ./a.out 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/kostja/a.out...done.
(gdb) b pop
Breakpoint 1 at 0x4004be: file bug.c, line 8.
(gdb) run
Starting program: /home/kostja/a.out 
[Inferior 1 (process 1034) exited normally]


kostja@olah ~ % gcc -O0 -ggdb -S bug.c 
kostja@olah ~ % cat bug.s 
    .file    "bug.c"
    .text
.Ltext0:
    .globl    pop
    .type    pop, @function
pop:
.LFB0:
    .file 1 "bug.c"
    .loc 1 3 0
    .cfi_startproc
    pushq    %rbp
.LCFI0:
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
.LCFI1:
    .cfi_def_cfa_register 6
    movq    %rdi, -24(%rbp)
    jmp    .L3
.L4:
    .loc 1 8 0
    nop
.L3:
.LBB2:
    .loc 1 5 0
    movq    -24(%rbp), %rax
    movq    (%rax), %rax
    movq    %rax, -8(%rbp)
    .loc 1 6 0
    movq    -8(%rbp), %rax
    movq    -24(%rbp), %rdx
    movl    $0, %ecx
    lock cmpxchgq    %rcx, (%rdx)
    cmpq    -8(%rbp), %rax
    jne    .L4
    .loc 1 7 0
    movq    -8(%rbp), %rax
.LBE2:
    .loc 1 9 0
    popq    %rbp
.LCFI2:
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size    pop, .-pop
    .globl    main
    .type    main, @function
main:
.LFB1:
    .loc 1 12 0
    .cfi_startproc
    pushq    %rbp
.LCFI3:
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
.LCFI4:
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    .loc 1 13 0
    movq    $0, -16(%rbp)
    .loc 1 14 0
    leaq    -16(%rbp), %rax
    movq    %rax, %rdi
    call    pop
    movq    %rax, -8(%rbp)
    .loc 1 16 0
    movl    $0, %eax
    .loc 1 17 0
    leave
.LCFI5:
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size    main, .-main
.Letext0:
    .section    .debug_info,"",@progbits
.Ldebug_info0:
    .long    0xcc
    .value    0x2
    .long    .Ldebug_abbrev0
    .byte    0x8
    .uleb128 0x1
    .long    .LASF0
    .byte    0x1
    .long    .LASF1
    .long    .LASF2
    .quad    .Ltext0
    .quad    .Letext0
    .long    .Ldebug_line0
    .uleb128 0x2
    .byte    0x1
    .string    "pop"
    .byte    0x1
    .byte    0x2
    .byte    0x1
    .long    0x7f
    .quad    .LFB0
    .quad    .LFE0
    .long    .LLST0
    .long    0x7f
    .uleb128 0x3
    .string    "ptr"
    .byte    0x1
    .byte    0x2
    .long    0x81
    .byte    0x2
    .byte    0x91
    .sleb128 -40
    .uleb128 0x4
    .quad    .LBB2
    .quad    .LBE2
    .uleb128 0x5
    .string    "p"
    .byte    0x1
    .byte    0x5
    .long    0x7f
    .byte    0x2
    .byte    0x91
    .sleb128 -24
    .byte    0
    .byte    0
    .uleb128 0x6
    .byte    0x8
    .uleb128 0x7
    .byte    0x8
    .long    0x7f
    .uleb128 0x8
    .byte    0x1
    .long    .LASF3
    .byte    0x1
    .byte    0xb
    .long    0xc8
    .quad    .LFB1
    .quad    .LFE1
    .long    .LLST1
    .long    0xc8
    .uleb128 0x5
    .string    "ptr"
    .byte    0x1
    .byte    0xd
    .long    0x7f
    .byte    0x2
    .byte    0x91
    .sleb128 -32
    .uleb128 0x5
    .string    "val"
    .byte    0x1
    .byte    0xe
    .long    0x7f
    .byte    0x2
    .byte    0x91
    .sleb128 -24
    .byte    0
    .uleb128 0x9
    .byte    0x4
    .byte    0x5
    .string    "int"
    .byte    0
    .section    .debug_abbrev,"",@progbits
.Ldebug_abbrev0:
    .uleb128 0x1
    .uleb128 0x11
    .byte    0x1
    .uleb128 0x25
    .uleb128 0xe
    .uleb128 0x13
    .uleb128 0xb
    .uleb128 0x3
    .uleb128 0xe
    .uleb128 0x1b
    .uleb128 0xe
    .uleb128 0x11
    .uleb128 0x1
    .uleb128 0x12
    .uleb128 0x1
    .uleb128 0x10
    .uleb128 0x6
    .byte    0
    .byte    0
    .uleb128 0x2
    .uleb128 0x2e
    .byte    0x1
    .uleb128 0x3f
    .uleb128 0xc
    .uleb128 0x3
    .uleb128 0x8
    .uleb128 0x3a
    .uleb128 0xb
    .uleb128 0x3b
    .uleb128 0xb
    .uleb128 0x27
    .uleb128 0xc
    .uleb128 0x49
    .uleb128 0x13
    .uleb128 0x11
    .uleb128 0x1
    .uleb128 0x12
    .uleb128 0x1
    .uleb128 0x40
    .uleb128 0x6
    .uleb128 0x1
    .uleb128 0x13
    .byte    0
    .byte    0
    .uleb128 0x3
    .uleb128 0x5
    .byte    0
    .uleb128 0x3
    .uleb128 0x8
    .uleb128 0x3a
    .uleb128 0xb
    .uleb128 0x3b
    .uleb128 0xb
    .uleb128 0x49
    .uleb128 0x13
    .uleb128 0x2
    .uleb128 0xa
    .byte    0
    .byte    0
    .uleb128 0x4
    .uleb128 0xb
    .byte    0x1
    .uleb128 0x11
    .uleb128 0x1
    .uleb128 0x12
    .uleb128 0x1
    .byte    0
    .byte    0
    .uleb128 0x5
    .uleb128 0x34
    .byte    0
    .uleb128 0x3
    .uleb128 0x8
    .uleb128 0x3a
    .uleb128 0xb
    .uleb128 0x3b
    .uleb128 0xb
    .uleb128 0x49
    .uleb128 0x13
    .uleb128 0x2
    .uleb128 0xa
    .byte    0
    .byte    0
    .uleb128 0x6
    .uleb128 0xf
    .byte    0
    .uleb128 0xb
    .uleb128 0xb
    .byte    0
    .byte    0
    .uleb128 0x7
    .uleb128 0xf
    .byte    0
    .uleb128 0xb
    .uleb128 0xb
    .uleb128 0x49
    .uleb128 0x13
    .byte    0
    .byte    0
    .uleb128 0x8
    .uleb128 0x2e
    .byte    0x1
    .uleb128 0x3f
    .uleb128 0xc
    .uleb128 0x3
    .uleb128 0xe
    .uleb128 0x3a
    .uleb128 0xb
    .uleb128 0x3b
    .uleb128 0xb
    .uleb128 0x49
    .uleb128 0x13
    .uleb128 0x11
    .uleb128 0x1
    .uleb128 0x12
    .uleb128 0x1
    .uleb128 0x40
    .uleb128 0x6
    .uleb128 0x1
    .uleb128 0x13
    .byte    0
    .byte    0
    .uleb128 0x9
    .uleb128 0x24
    .byte    0
    .uleb128 0xb
    .uleb128 0xb
    .uleb128 0x3e
    .uleb128 0xb
    .uleb128 0x3
    .uleb128 0x8
    .byte    0
    .byte    0
    .byte    0
    .section    .debug_loc,"",@progbits
.Ldebug_loc0:
.LLST0:
    .quad    .LFB0-.Ltext0
    .quad    .LCFI0-.Ltext0
    .value    0x2
    .byte    0x77
    .sleb128 8
    .quad    .LCFI0-.Ltext0
    .quad    .LCFI1-.Ltext0
    .value    0x2
    .byte    0x77
    .sleb128 16
    .quad    .LCFI1-.Ltext0
    .quad    .LCFI2-.Ltext0
    .value    0x2
    .byte    0x76
    .sleb128 16
    .quad    .LCFI2-.Ltext0
    .quad    .LFE0-.Ltext0
    .value    0x2
    .byte    0x77
    .sleb128 8
    .quad    0
    .quad    0
.LLST1:
    .quad    .LFB1-.Ltext0
    .quad    .LCFI3-.Ltext0
    .value    0x2
    .byte    0x77
    .sleb128 8
    .quad    .LCFI3-.Ltext0
    .quad    .LCFI4-.Ltext0
    .value    0x2
    .byte    0x77
    .sleb128 16
    .quad    .LCFI4-.Ltext0
    .quad    .LCFI5-.Ltext0
    .value    0x2
    .byte    0x76
    .sleb128 16
    .quad    .LCFI5-.Ltext0
    .quad    .LFE1-.Ltext0
    .value    0x2
    .byte    0x77
    .sleb128 8
    .quad    0
    .quad    0
    .section    .debug_aranges,"",@progbits
    .long    0x2c
    .value    0x2
    .long    .Ldebug_info0
    .byte    0x8
    .byte    0
    .value    0
    .value    0
    .quad    .Ltext0
    .quad    .Letext0-.Ltext0
    .quad    0
    .quad    0
    .section    .debug_line,"",@progbits
.Ldebug_line0:
    .section    .debug_str,"MS",@progbits,1
.LASF2:
    .string    "/home/kostja"
.LASF0:
    .string    "GNU C 4.6.3"
.LASF1:
    .string    "bug.c"
.LASF3:
    .string    "main"
    .ident    "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",@progbits

Reply via email to