[cfe-dev] Problem with DW_AT_abstract_origin references
David Blaikie
dblaikie at gmail.com
Thu Jul 24 08:43:32 PDT 2014
Yep - that'd be a known bug in Clang 3.4 (well, known when I looked at
the code, saw that it was no good, and fixed it) that has, hopefully,
since been fixed. At least I think that's what you're seeing.
Have you tried reproducing this with Clang ToT? (or a 3.5 release candidate?)
You should be able to reproduce this by writing a small example with
__attribute__((force_inline)) (or is it always_inline, I forget...
maybe it's one word, without the underscore... ), I would imagine -
even without LTO.
Anyway, if you have some preprocessed source, I can compile it with
Clang ToT and show you the dwarfdump to see if it makes more sense
(but I can't easily verify that GDB doesn't infinitely recurse without
a fully linkable/executable example).
- David
On Thu, Jul 24, 2014 at 8:26 AM, Vladimir Nikulichev <nvs at tbricks.com> wrote:
> Hi!
>
> I have two class methods implemented in the same .cpp file. They inline each other after code optimization.
> The problem is that each of them contains a tag DW_TAG_inlined_subroutine with attribute DW_AT_abstract_origin referring
> to other one. It only happens when LTO is enabled.
>
> When loading debug information, GDB gets into infinite loop and crashes with stack overflow.
>
> Here is a piece of dwarf dump, search for text "HERE" to find the references. I tried to reproduce it with minimal code with no results.
>
> < 1><0x00021c68> DW_TAG_subprogram
> DW_AT_specification <global die offset 0x000ed3fd>
> DW_AT_low_pc 0x00108da0
> DW_AT_high_pc 0x00108e96
> DW_AT_frame_base DW_OP_reg7
> DW_AT_object_pointer <0x00021c85>
> DW_AT_APPLE_omit_frame_ptr yes(1)
> DW_AT_inline DW_INL_inlined
> < 2><0x00021c85> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x001102e2>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 3 entries follows>
> [ 0]<lowpc=0x00108da0><highpc=0x00108da8>DW_OP_reg5
> [ 1]<lowpc=0x00108da8><highpc=0x00108de5>DW_OP_reg3
> [ 2]<lowpc=0x00108deb><highpc=0x00108e83>DW_OP_reg3
> < 2><0x00021c93> DW_TAG_formal_parameter
> DW_AT_name f
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x0000070c
> DW_AT_type <global die offset 0x0005ee33>
> DW_AT_location <loclist with 2 entries follows>
> [ 0]<lowpc=0x00108da0><highpc=0x00108da8>DW_OP_reg4
> [ 1]<lowpc=0x00108da8><highpc=0x00108dc3>DW_OP_reg4
> < 2><0x00021ca4> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f1920
> < 3><0x00021caa> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f18f0
> < 4><0x00021cb0> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f18c0
> < 5><0x00021cb6> DW_TAG_variable
> DW_AT_name _layer
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x00000714
> DW_AT_type <global die offset 0x000f2254>
> < 5><0x00021cc3> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f1890
> < 6><0x00021cc9> DW_TAG_lexical_block
> DW_AT_low_pc 0x00108df0
> DW_AT_high_pc 0x00108e96
> < 7><0x00021cdb> DW_TAG_variable
> DW_AT_name _log
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x00000714
> DW_AT_type <global die offset 0x0017c8f6>
> DW_AT_location DW_OP_reg14
> < 7><0x00021cea> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x0009ff85>
> DW_AT_low_pc 0x00108e19
> DW_AT_high_pc 0x00108e6f
> DW_AT_call_file 0x0000000a src/Session.cpp
> DW_AT_call_line 0x00000714
> < 8><0x00021d03> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x0010867e>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108df8><highpc=0x00108e83>DW_OP_reg14
> < 8><0x00021d11> DW_TAG_formal_parameter
> DW_AT_name __out
> DW_AT_decl_file 0x00000039 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/ostream
> DW_AT_decl_line 0x000001f9
> DW_AT_type <global die offset 0x0016764f>
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108e24><highpc=0x00108e83>DW_OP_reg15
> < 8><0x00021d22> DW_TAG_formal_parameter
> DW_AT_name __os
> DW_AT_decl_file 0x00000050 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h
> DW_AT_decl_line 0x000009c2
> DW_AT_type <global die offset 0x0016764f>
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108e24><highpc=0x00108e47>DW_OP_reg15
> < 8><0x00021d33> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x00117ac5>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108e31><highpc=0x00108e83>DW_OP_reg3
> < 8><0x00021d41> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x00084edf>
> DW_AT_low_pc 0x00108e31
> DW_AT_high_pc 0x00108e3c
> DW_AT_call_file 0x00000050 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h
> DW_AT_call_line 0x000009c7
> < 9><0x00021d5a> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x00084ef1>
> DW_AT_low_pc 0x00108e31
> DW_AT_high_pc 0x00108e38
> DW_AT_call_file 0x00000050 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h
> DW_AT_call_line 0x00000657
> < 4><0x00021d78> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x00021db1> # <<<< HERE
> DW_AT_low_pc 0x00108dd5
> DW_AT_high_pc 0x00108de5
> DW_AT_call_file 0x0000000a src/Session.cpp
> DW_AT_call_line 0x00000715
> < 5><0x00021d91> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x001102e2>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108dd5><highpc=0x00108de5>DW_OP_reg3
> < 5><0x00021d9f> DW_TAG_formal_parameter
> DW_AT_name f
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x00000719
> DW_AT_type <global die offset 0x0005ee33>
> DW_AT_const_value 0x00000000
>
>
>
>
>
>
> < 1><0x00021db1> DW_TAG_subprogram
> DW_AT_specification <global die offset 0x000ed42e>
> DW_AT_low_pc 0x00108ea0
> DW_AT_high_pc 0x00108f96
> DW_AT_frame_base DW_OP_reg7
> DW_AT_object_pointer <0x00021dce>
> DW_AT_APPLE_omit_frame_ptr yes(1)
> DW_AT_inline DW_INL_inlined
> < 2><0x00021dce> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x001102e2>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 3 entries follows>
> [ 0]<lowpc=0x00108ea0><highpc=0x00108ea8>DW_OP_reg5
> [ 1]<lowpc=0x00108ea8><highpc=0x00108ee5>DW_OP_reg3
> [ 2]<lowpc=0x00108eeb><highpc=0x00108f83>DW_OP_reg3
> < 2><0x00021ddc> DW_TAG_formal_parameter
> DW_AT_name f
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x00000719
> DW_AT_type <global die offset 0x0005ee33>
> DW_AT_location <loclist with 2 entries follows>
> [ 0]<lowpc=0x00108ea0><highpc=0x00108ea8>DW_OP_reg4
> [ 1]<lowpc=0x00108ea8><highpc=0x00108ec3>DW_OP_reg4
> < 2><0x00021ded> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f19e0
> < 3><0x00021df3> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f19b0
> < 4><0x00021df9> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f1980
> < 5><0x00021dff> DW_TAG_variable
> DW_AT_name _layer
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x00000721
> DW_AT_type <global die offset 0x000f2254>
> < 5><0x00021e0c> DW_TAG_lexical_block
> fails to find DW_AT_ranges offset attr 0x55 form 0x6 DW_AT_ranges 0x000f1950
> < 6><0x00021e12> DW_TAG_lexical_block
> DW_AT_low_pc 0x00108ef0
> DW_AT_high_pc 0x00108f96
> < 7><0x00021e24> DW_TAG_variable
> DW_AT_name _log
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x00000721
> DW_AT_type <global die offset 0x0017c8f6>
> DW_AT_location DW_OP_reg14
> < 7><0x00021e33> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x0009ff85>
> DW_AT_low_pc 0x00108f19
> DW_AT_high_pc 0x00108f6f
> DW_AT_call_file 0x0000000a src/Session.cpp
> DW_AT_call_line 0x00000721
> < 8><0x00021e4c> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x0010867e>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108ef8><highpc=0x00108f83>DW_OP_reg14
> < 8><0x00021e5a> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x0010867e>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108ef8><highpc=0x00108f83>DW_OP_reg14
> < 8><0x00021e68> DW_TAG_formal_parameter
> DW_AT_name __out
> DW_AT_decl_file 0x00000039 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/ostream
> DW_AT_decl_line 0x000001f9
> DW_AT_type <global die offset 0x0016764f>
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108f24><highpc=0x00108f83>DW_OP_reg15
> < 8><0x00021e79> DW_TAG_formal_parameter
> DW_AT_name __os
> DW_AT_decl_file 0x00000050 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h
> DW_AT_decl_line 0x000009c2
> DW_AT_type <global die offset 0x0016764f>
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108f24><highpc=0x00108f47>DW_OP_reg15
> < 8><0x00021e8a> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x00117ac5>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108f31><highpc=0x00108f83>DW_OP_reg3
> < 8><0x00021e98> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x00084edf>
> DW_AT_low_pc 0x00108f31
> DW_AT_high_pc 0x00108f3c
> DW_AT_call_file 0x00000050 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h
> DW_AT_call_line 0x000009c7
> < 9><0x00021eb1> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x00084ef1>
> DW_AT_low_pc 0x00108f31
> DW_AT_high_pc 0x00108f38
> DW_AT_call_file 0x00000050 /usr/bin/../lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/basic_string.h
> DW_AT_call_line 0x00000657
> < 4><0x00021ecf> DW_TAG_inlined_subroutine
> DW_AT_abstract_origin <0x00021c68> # <<<< HERE
> DW_AT_low_pc 0x00108ed5
> DW_AT_high_pc 0x00108ee5
> DW_AT_call_file 0x0000000a src/Session.cpp
> DW_AT_call_line 0x00000722
> < 5><0x00021ee8> DW_TAG_formal_parameter
> DW_AT_name this
> DW_AT_type <global die offset 0x001102e2>
> DW_AT_artificial yes(1)
> DW_AT_location <loclist with 1 entries follows>
> [ 0]<lowpc=0x00108ed5><highpc=0x00108ee5>DW_OP_reg3
> < 5><0x00021ef6> DW_TAG_formal_parameter
> DW_AT_name f
> DW_AT_decl_file 0x0000000a src/Session.cpp
> DW_AT_decl_line 0x0000070c
> DW_AT_type <global die offset 0x0005ee33>
> DW_AT_const_value 0x00000000
>
>
>
>
> clang version 3.4 (tags/RELEASE_34/final)
> Target: x86_64-unknown-linux-gnu
> Thread model: posix
>
> Compiler options: -m64 -flto -pipe -ffast-math -fno-finite-math-only -pthread -march=core2 -mtune=corei7 -O3 -g -fvisibility=hidden -fvisibility-inlines-hidden -fPIC
> Linker options: -m64 -flto -pipe -ffast-math -fno-finite-math-only -pthread -march=core2 -mtune=corei7 -O3 -g -fvisibility=hidden -fvisibility-inlines-hidden -fuse-ld=gold -shared -Wl,-zdefs
>
> Thanks!
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
More information about the cfe-dev
mailing list