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