Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 02 Apr 2013 18:51:20 +0300
From:      Andriy Gapon <avg@FreeBSD.org>
To:        toolchain@FreeBSD.org
Subject:   clang may generate incorrect dwarf info?
Message-ID:  <515AFE78.1060804@FreeBSD.org>

next in thread | raw e-mail | index | archive | help

Function signature in FreeBSD source code:
void _sx_xunlock(struct sx *sx, const char *file, int line);

DWARF (reported by objdump -x -w -W) when compiled with gcc:
 <1><8337>: Abbrev Number: 63 (DW_TAG_subprogram)
  <8338>     DW_AT_external    : 1
  <8339>     DW_AT_name        : (indirect string, offset: 0x48c9): _sx_xunlock
  <833d>     DW_AT_decl_file   : 1
  <833e>     DW_AT_decl_line   : 373
  <8340>     DW_AT_prototyped  : 1
  <8341>     DW_AT_low_pc      : 0x13a7
  <8349>     DW_AT_high_pc     : 0x143e
  <8351>     DW_AT_frame_base  : 0x3cd3 (location list)
  <8355>     DW_AT_sibling     : <84a4>
 <2><8359>: Abbrev Number: 59 (DW_TAG_formal_parameter)
  <835a>     DW_AT_name        : sx
  <835d>     DW_AT_decl_file   : 1
  <835e>     DW_AT_decl_line   : 372
  <8360>     DW_AT_type        : <2cac>
  <8364>     DW_AT_location    : 0x3d1f (location list)
 <2><8368>: Abbrev Number: 60 (DW_TAG_formal_parameter)
  <8369>     DW_AT_name        : (indirect string, offset: 0x9016): file
  <836d>     DW_AT_decl_file   : 1
  <836e>     DW_AT_decl_line   : 372
  <8370>     DW_AT_type        : <1ea>
  <8374>     DW_AT_location    : 0x3d8e (location list)
 <2><8378>: Abbrev Number: 60 (DW_TAG_formal_parameter)
  <8379>     DW_AT_name        : (indirect string, offset: 0x12a): line
  <837d>     DW_AT_decl_file   : 1
  <837e>     DW_AT_decl_line   : 372
  <8380>     DW_AT_type        : <5f>
  <8384>     DW_AT_location    : 0x3dd7 (location list)

Ditto when compiled with clang:
 <1><2c70>: Abbrev Number: 55 (DW_TAG_subprogram)
  <2c71>     DW_AT_name        : (indirect string, offset: 0x1817): _sx_xunlock
  <2c75>     DW_AT_decl_file   : 1
  <2c76>     DW_AT_decl_line   : 373
  <2c78>     DW_AT_prototyped  : 1
  <2c78>     DW_AT_external    : 1
  <2c78>     DW_AT_inline      : 1      (inlined)
 <2><2c79>: Abbrev Number: 51 (DW_TAG_formal_parameter)
  <2c7a>     DW_AT_name        : (indirect string, offset: 0xd061): line
  <2c7e>     DW_AT_decl_file   : 1
  <2c7f>     DW_AT_decl_line   : 373
  <2c81>     DW_AT_type        : <a2>
 <2><2c85>: Abbrev Number: 51 (DW_TAG_formal_parameter)
  <2c86>     DW_AT_name        : (indirect string, offset: 0xd056): sx
  <2c8a>     DW_AT_decl_file   : 1
  <2c8b>     DW_AT_decl_line   : 373
  <2c8d>     DW_AT_type        : <782c>
 <2><2c91>: Abbrev Number: 51 (DW_TAG_formal_parameter)
  <2c92>     DW_AT_name        : (indirect string, offset: 0xc67): file
  <2c96>     DW_AT_decl_file   : 1
  <2c97>     DW_AT_decl_line   : 373
  <2c99>     DW_AT_type        : <32>

First, looks like the parameters come in a wrong order.

Then:
(kgdb) disassemble _sx_xunlock
Dump of assembler code for function _sx_xunlock:
0xffffffff805bad20 <_sx_xunlock+0>:     push   %rbp
0xffffffff805bad21 <_sx_xunlock+1>:     mov    %rsp,%rbp
0xffffffff805bad24 <_sx_xunlock+4>:     push   %r14
0xffffffff805bad26 <_sx_xunlock+6>:     push   %rbx
0xffffffff805bad27 <_sx_xunlock+7>:     mov    %rdi,%rbx
0xffffffff805bad2a <_sx_xunlock+10>:    mov    %gs:0x0,%r14
0xffffffff805bad33 <_sx_xunlock+19>:    cmpw   $0x0,0x10a(%r14)
0xffffffff805bad3c <_sx_xunlock+28>:    jne    0xffffffff805bad80 <_sx_xunlock+96>
0xffffffff805bad3e <_sx_xunlock+30>:    decw   0x104(%r14)
0xffffffff805bad46 <_sx_xunlock+38>:    cmpl   $0x0,0xc(%rbx)
0xffffffff805bad4a <_sx_xunlock+42>:    jne    0xffffffff805bad6b <_sx_xunlock+75>
0xffffffff805bad4c <_sx_xunlock+44>:    mov    0xffffffff80cb4d84,%edi
0xffffffff805bad53 <_sx_xunlock+51>:    test   %edi,%edi
0xffffffff805bad55 <_sx_xunlock+53>:    je     0xffffffff805bad6b <_sx_xunlock+75>
0xffffffff805bad57 <_sx_xunlock+55>:    mov    %rbx,%rsi
0xffffffff805bad5a <_sx_xunlock+58>:    xor    %edx,%edx
0xffffffff805bad5c <_sx_xunlock+60>:    xor    %ecx,%ecx
0xffffffff805bad5e <_sx_xunlock+62>:    xor    %r8d,%r8d
0xffffffff805bad61 <_sx_xunlock+65>:    xor    %r9d,%r9d
0xffffffff805bad64 <_sx_xunlock+68>:    callq  *0xffffffff80cb4d20
0xffffffff805bad6b <_sx_xunlock+75>:    mov    $0x1,%ecx
0xffffffff805bad70 <_sx_xunlock+80>:    mov    %r14,%rax
0xffffffff805bad73 <_sx_xunlock+83>:    lock cmpxchg %rcx,0x18(%rbx)
0xffffffff805bad79 <_sx_xunlock+89>:    sete   %al
0xffffffff805bad7c <_sx_xunlock+92>:    test   %al,%al
0xffffffff805bad7e <_sx_xunlock+94>:    je     0xffffffff805bad85 <_sx_xunlock+101>
0xffffffff805bad80 <_sx_xunlock+96>:    pop    %rbx
0xffffffff805bad81 <_sx_xunlock+97>:    pop    %r14
0xffffffff805bad83 <_sx_xunlock+99>:    pop    %rbp
0xffffffff805bad84 <_sx_xunlock+100>:   retq
0xffffffff805bad85 <_sx_xunlock+101>:   mov    %rbx,%rdi
0xffffffff805bad88 <_sx_xunlock+104>:   pop    %rbx
0xffffffff805bad89 <_sx_xunlock+105>:   pop    %r14
0xffffffff805bad8b <_sx_xunlock+107>:   pop    %rbp
0xffffffff805bad8c <_sx_xunlock+108>:   jmpq   0xffffffff805bb420 <_sx_xunlock_hard>
End of assembler dump.

This does not look too inlined to me :-)

-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?515AFE78.1060804>