Once again we see the elegance of C++ never failing to impress...

I wonder if it wouldn't be simpler to make a copy constructor that just makes a 
new mutex.  The ThreadPlanStack is a vector of ThreadPlan shared pointers, so 
it is cheap to copy, and the stack just uses the mutex internally, so making a 
new one would be fine.  Slightly less efficient, but then we wouldn't have to 
deal with this sort of silliness.

But otherwise, if this is necessary, I have opinions but no serious objections 
to this change.  Feel free to put up a patch.

Jim


> On Aug 4, 2021, at 11:17 PM, Vadim Chugunov <vadi...@gmail.com> wrote:
> 
> Not sure what's up with clang's inclusion chain reporting, but I found a 
> couple of SO threads [1] [2] regarding the need of the copy constructor: 
> apparently, until GCC 6, std::unordered_map could not emplace non-copyable 
> values.  Following the advice in [2], I was able to overcome the error by 
> rewriting ThreadPlanStack::AddThread like this:
>   void AddThread(Thread &thread) {
>     lldb::tid_t tid = thread.GetID();
>     m_plans_list.emplace(std::piecewise_construct,
>                          std::forward_as_tuple(tid),
>                          std::forward_as_tuple(thread));
>   }
> 
> [1]: 
> https://stackoverflow.com/questions/44699545/why-does-stdmap-emplace-need-a-copy-constructor-on-gcc
> [2]: 
> https://stackoverflow.com/questions/27960325/stdmap-emplace-without-copying-valuseue
> 
> 
> On Wed, Aug 4, 2021 at 5:10 PM Jim Ingham <jing...@apple.com> wrote:
> That is certainly an odd chain of includes to end up complaining about 
> ThreadPlanStacks...
> 
> ABIMacOSX.cpp does see the definition of ThreadPlanStacks but not along that 
> path...  Something got fairly confused.
> 
> There IS an implicitly deleted copy constructor for ThreadPlanStacks, but it 
> doesn't get called anywhere.  This is code that is built pretty much 
> everywhere and this is the first time I've seen this error.
> 
> In the ThreadPlanStack header file, there are a couple of routines the 
> iterate over the map of ThreadPlanStacks like (m_plans_list is: 
> std::unordered_map<lldb:tid_t, ThreadPlanStack>):
> 
>   void ClearThreadCache() {
>     for (auto &plan_list : m_plans_list)
>       plan_list.second.ClearThreadCache();
>   }
> 
> But those get "auto &" so they should just be pulling references to 
> ThreadPlanStacks out, it shouldn't need to copy them.
> 
> And then we do call find on the ThreadPlanStackMap and do something with the 
> iterator returned:
> 
>   bool RemoveTID(lldb::tid_t tid) {
>     auto result = m_plans_list.find(tid);
>     if (result == m_plans_list.end())
>       return false;
>     result->second.ThreadDestroyed(nullptr);
>     m_plans_list.erase(result);
>     return true;
>   }
> 
> But the iterator of a map shouldn't require a copy of the value, that doesn't 
> make sense.
> 
> Other than that, I can't see anything funny here.  
> 
> Is this something triggered by -pedantic?
> 
> Jim
> 
> 
> > On Aug 4, 2021, at 4:22 PM, Vadim Chugunov via lldb-dev 
> > <lldb-dev@lists.llvm.org> wrote:
> > 
> > Not sure if this is a supported configuration, but I am hitting this error 
> > when compiling on Ubuntu 16.04 with clang 12:
> > 
> > FAILED: /usr/local/bin/clang++  -DGTEST_HAS_RTTI=0 -DHAVE_ROUND 
> > -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS 
> > -D__STDC_LIMIT_MACROS -Itools/lldb/source/Plugins/ABI/ARM 
> > -I/__w/1/s/llvm-project/lldb/source/Plugins/ABI/ARM -Itools/lldb/source 
> > -I/__w/1/s/llvm-project/lldb/include -Itools/lldb/include -Iinclude 
> > -I/__w/1/s/llvm-project/llvm/include 
> > -I/__w/1/python/install/include/python3.9 
> > -I/__w/1/s/llvm-project/llvm/../clang/include -Itools/lldb/../clang/include 
> > -I/__w/1/libxml2/install/include/libxml2 
> > -I/__w/1/s/llvm-project/lldb/source/. -target x86_64-linux-gnu -fPIC -fPIC 
> > -fvisibility-inlines-hidden -Werror=date-time 
> > -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter 
> > -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic 
> > -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough 
> > -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor 
> > -Wdelete-non-virtual-dtor -Wsuggest-override -Wno-comment 
> > -Wstring-conversion -Wmisleading-indentation -fdiagnostics-color 
> > -ffunction-sections -fdata-sections -Wno-deprecated-declarations 
> > -Wno-unknown-pragmas -Wno-strict-aliasing -Wno-deprecated-register 
> > -Wno-vla-extension -Os -DNDEBUG    -fno-exceptions -fno-rtti -std=c++14 -MD 
> > -MT 
> > tools/lldb/source/Plugins/ABI/ARM/CMakeFiles/lldbPluginABIARM.dir/ABIMacOSX_arm.cpp.o
> >  -MF 
> > tools/lldb/source/Plugins/ABI/ARM/CMakeFiles/lldbPluginABIARM.dir/ABIMacOSX_arm.cpp.o.d
> >  -o 
> > tools/lldb/source/Plugins/ABI/ARM/CMakeFiles/lldbPluginABIARM.dir/ABIMacOSX_arm.cpp.o
> >  -c /__w/1/s/llvm-project/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp
> > In file included from 
> > /__w/1/s/llvm-project/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp:9:
> > In file included from 
> > /__w/1/s/llvm-project/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.h:12:
> > In file included from 
> > /__w/1/s/llvm-project/lldb/include/lldb/Target/ABI.h:12:
> > In file included from 
> > /__w/1/s/llvm-project/lldb/include/lldb/Core/PluginInterface.h:12:
> > In file included from 
> > /__w/1/s/llvm-project/lldb/include/lldb/lldb-private.h:15:
> > In file included from 
> > /__w/1/s/llvm-project/lldb/include/lldb/lldb-private-enumerations.h:12:
> > In file included from 
> > /__w/1/s/llvm-project/llvm/include/llvm/ADT/StringRef.h:12:
> > In file included from 
> > /__w/1/s/llvm-project/llvm/include/llvm/ADT/STLExtras.h:19:
> > In file included from 
> > /__w/1/s/llvm-project/llvm/include/llvm/ADT/Optional.h:18:
> > In file included from 
> > /__w/1/s/llvm-project/llvm/include/llvm/ADT/Hashing.h:48:
> > In file included from 
> > /__w/1/s/llvm-project/llvm/include/llvm/Support/ErrorHandling.h:18:
> > In file included from 
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/string:40:
> > In file included from 
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/char_traits.h:39:
> > In file included from 
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/stl_algobase.h:64:
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/stl_pair.h:134:35:
> >  error: call to implicitly-deleted copy constructor of 
> > 'lldb_private::ThreadPlanStack'
> >         : first(std::forward<_U1>(__x)), second(__y) { }
> >                                          ^      ~~~
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/ext/new_allocator.h:120:23:
> >  note: in instantiation of function template specialization 
> > 'std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>::pair<unsigned long &, void>' requested here
> >         { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
> >                              ^
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/alloc_traits.h:530:8:
> >  note: in instantiation of function template specialization 
> > '__gnu_cxx::new_allocator<std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>>::construct<std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>, unsigned long &, lldb_private::Thread &>' 
> > requested here
> >         { __a.construct(__p, std::forward<_Args>(__args)...); }
> >               ^
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/hashtable_policy.h:1955:28:
> >  note: in instantiation of function template specialization 
> > 'std::allocator_traits<std::allocator<std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>>>::construct<std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>, unsigned long &, lldb_private::Thread &>' 
> > requested here
> >             __value_alloc_traits::construct(__a, __n->_M_valptr(),
> >                                   ^
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/hashtable.h:1526:30:
> >  note: in instantiation of function template specialization 
> > 'std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<const
> >  unsigned long, lldb_private::ThreadPlanStack>, 
> > false>>>::_M_allocate_node<unsigned long &, lldb_private::Thread &>' 
> > requested here
> >         __node_type* __node = 
> > this->_M_allocate_node(std::forward<_Args>(__args)...);
> >                                     ^
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/hashtable.h:726:11:
> >  note: in instantiation of function template specialization 
> > 'std::_Hashtable<unsigned long, std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>, std::allocator<std::pair<const unsigned 
> > long, lldb_private::ThreadPlanStack>>, std::__detail::_Select1st, 
> > std::equal_to<unsigned long>, std::hash<unsigned long>, 
> > std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, 
> > std::__detail::_Prime_rehash_policy, 
> > std::__detail::_Hashtable_traits<false, false, true>>::_M_emplace<unsigned 
> > long &, lldb_private::Thread &>' requested here
> >         { return _M_emplace(__unique_keys(), 
> > std::forward<_Args>(__args)...); }
> >                  ^
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/unordered_map.h:380:16:
> >  note: in instantiation of function template specialization 
> > 'std::_Hashtable<unsigned long, std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>, std::allocator<std::pair<const unsigned 
> > long, lldb_private::ThreadPlanStack>>, std::__detail::_Select1st, 
> > std::equal_to<unsigned long>, std::hash<unsigned long>, 
> > std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, 
> > std::__detail::_Prime_rehash_policy, 
> > std::__detail::_Hashtable_traits<false, false, true>>::emplace<unsigned 
> > long &, lldb_private::Thread &>' requested here
> >         { return _M_h.emplace(std::forward<_Args>(__args)...); }
> >                       ^
> > /__w/1/s/llvm-project/lldb/include/lldb/Target/ThreadPlanStack.h:127:18: 
> > note: in instantiation of function template specialization 
> > 'std::unordered_map<unsigned long, lldb_private::ThreadPlanStack, 
> > std::hash<unsigned long>, std::equal_to<unsigned long>, 
> > std::allocator<std::pair<const unsigned long, 
> > lldb_private::ThreadPlanStack>>>::emplace<unsigned long &, 
> > lldb_private::Thread &>' requested here
> >     m_plans_list.emplace(tid, thread);
> >                  ^
> > /__w/1/s/llvm-project/lldb/include/lldb/Target/ThreadPlanStack.h:113:32: 
> > note: copy constructor of 'ThreadPlanStack' is implicitly deleted because 
> > field 'm_stack_mutex' has a deleted copy constructor
> >   mutable std::recursive_mutex m_stack_mutex;
> >                                ^
> > /usr/lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/mutex:170:5:
> >  note: 'recursive_mutex' has been explicitly marked deleted here
> >     recursive_mutex(const recursive_mutex&) = delete;
> >     ^
> > 1 error generated.
> > 
> > _______________________________________________
> > lldb-dev mailing list
> > lldb-dev@lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
> 

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to