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>