clang may generate incorrect dwarf info?
Andriy Gapon
avg at FreeBSD.org
Tue Apr 2 15:51:29 UTC 2013
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
More information about the freebsd-toolchain
mailing list