Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LTO support #30

Closed
raybellis opened this issue Feb 9, 2024 · 8 comments
Closed

LTO support #30

raybellis opened this issue Feb 9, 2024 · 8 comments

Comments

@raybellis
Copy link
Collaborator

The code crashes on start up with LTO enabled (-flto in CXXFLAGS) as the list of parsers is being constructed. The reason is unknown:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ccd4ae in std::local_Rb_tree_decrement (__x=0x55555557f708 <StringsetParser::parsers[abi:cxx11]+8>)
    at ../../../../../libstdc++-v3/src/c++98/tree.cc:98
Downloading source file /usr/src/debug/gcc-13.2.1-4.fc38.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/src/c++98/../../../../../libstdc++-v3/src/c++98/tree.cc
98              && __x->_M_parent->_M_parent == __x)                                                                  
(gdb) bt
#0  0x00007ffff7ccd4ae in std::local_Rb_tree_decrement (__x=0x55555557f708 <StringsetParser::parsers[abi:cxx11]+8>)
    at ../../../../../libstdc++-v3/src/c++98/tree.cc:98
#1  std::_Rb_tree_decrement (__x=__x@entry=0x55555557f708 <StringsetParser::parsers[abi:cxx11]+8>)
    at ../../../../../libstdc++-v3/src/c++98/tree.cc:123
#2  0x000055555555fcb0 in std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> >::operator-- (this=<synthetic pointer>)
    at /usr/include/c++/13/bits/stl_tree.h:302
#3  std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> > >::_M_get_insert_unique_pos(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) [clone .constprop.0] (__k="fsl_dpaa2_eth", this=<optimized out>) at /usr/include/c++/13/bits/stl_tree.h:2127
#4  0x000055555555ef96 in std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> > >::_M_get_insert_hint_unique_pos (this=0x55555557f700 <StringsetParser::parsers[abi:cxx11]>, 
    __k="fsl_dpaa2_eth", __position=...) at /usr/include/c++/13/bits/stl_tree.h:2256
#5  std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, std::tuple<> >(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> >, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>&&, std::tuple<>&&) (
    this=0x55555557f700 <StringsetParser::parsers[abi:cxx11]>, __pos=...) at /usr/include/c++/13/bits/stl_tree.h:2463
#6  std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, StringsetParser*, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, StringsetParser*> > >::operator[] (
    this=0x55555557f700 <StringsetParser::parsers[abi:cxx11]>, __k=...) at /usr/include/c++/13/bits/stl_map.h:513
#7  StringsetParser::save (name=..., this=<optimized out>) at /home/pemensik/upstream/ethq/ethq-0_6_3/parser.cc:29
#8  StringsetParser::save (this=this@entry=0x55555557f800 <nxp_daap2>, drivers=...)
    at /home/pemensik/upstream/ethq/ethq-0_6_3/parser.cc:24
#9  0x000055555555f1ce in StringsetParser::StringsetParser (drivers=..., this=<optimized out>)
    at /home/pemensik/upstream/ethq/ethq-0_6_3/parser.cc:19
#10 RegexParser::RegexParser (this=<optimized out>, drivers=..., total=..., queue=..., this=<optimized out>, 
    drivers=..., total=..., queue=...) at /home/pemensik/upstream/ethq/ethq-0_6_3/parser.cc:54
#11 0x000055555555ff12 in _sub_I_65535_0.0 ()
#12 0x00007ffff7a49cc4 in call_init (env=<optimized out>, argv=0x7fffffffddc8, argc=1) at ../csu/libc-start.c:145
#13 __libc_start_main_impl (main=0x55555555c4f0 <main(int, char**)>, argc=1, argv=0x7fffffffddc8, 
    init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffddb8)
    at ../csu/libc-start.c:347
#14 0x0000555555560de5 in _start ()

https://bugzilla.redhat.com/show_bug.cgi?id=2263560#c2

@pemensik
Copy link
Contributor

pemensik commented Feb 9, 2024

It could be caused by multiple static constructors happening in undefined order. Something described on: https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use

That should be created by a function, which would first ensure static storage (parsermap_t) is initialized, before anyone else tries to insert items into it. I have tries few experiments, but that leads to non-functional ethq.

@pemensik
Copy link
Contributor

pemensik commented Feb 9, 2024

Pushed my attempts to PR #31 draft. My attempt does not crash, but does not work anyway. I failed to spot why.

@raybellis
Copy link
Collaborator Author

potentially fixed by 313a343

@pemensik
Copy link
Contributor

pemensik commented Jun 5, 2024

It does not seem to be changed, when I include also -flto=auto parameter. It is still broken even after this change.

@raybellis
Copy link
Collaborator Author

I can't replicate that here. Has the stack trace changed?

@pemensik
Copy link
Contributor

pemensik commented Jun 5, 2024

no, it does not crash anymore, but does not parse the driver also. It fails to match_total for my driver. As soon as I remove -flto flag, the parsing works.

It ends now with:
error: couldn't parse NIC stats for e1000e:enp0s31f6

@pemensik
Copy link
Contributor

pemensik commented Jun 5, 2024

It seems it fails on if (total.first.mark_count() == 0) return false; in RegexParser::match_total. Depending RegexParser static members does not yet seem to be constructed.

@pemensik
Copy link
Contributor

pemensik commented Jun 5, 2024

Updated PR #31 with small change, after which it finally works even with LTO enabled.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants