labath created this revision.
labath added reviewers: tberghammer, tfiala, nitesh.jain, omjavaid, emaste,
krytarowski.
labath added a subscriber: lldb-commits.
Recent increase in the usage of std::weak_ptr has caused us to rediscover an
issue in libstdc++
versions prior to 4.9 <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59656>,
which make this class
unusable without exceptions in the presence of multiple threads. It's virtualy
impossible to work
around this issue without implementing our own shared_ptr/weak_ptr substitutes,
which does not
seem like a good idea.
Therefore, I am adding a big CMake warning which warns you about this issue if
you're attempting
a to do a build which is suceptible to this problem and suggests possible
alternatives. Right
now, nothing spectacular will happen if you ignore this warning (all the
crashes I have seen
occur during process shutdown), but there's no guarantee the situation will not
change in the
future.
http://reviews.llvm.org/D20671
Files:
cmake/modules/LLDBConfig.cmake
Index: cmake/modules/LLDBConfig.cmake
===================================================================
--- cmake/modules/LLDBConfig.cmake
+++ cmake/modules/LLDBConfig.cmake
@@ -1,3 +1,5 @@
+include(CheckCXXSymbolExists)
+
set(LLDB_PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
set(LLDB_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/source")
set(LLDB_INCLUDE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/include")
@@ -415,3 +417,25 @@
list(APPEND system_libs ${CURSES_LIBRARIES})
include_directories(${CURSES_INCLUDE_DIR})
endif ()
+
+check_cxx_symbol_exists("__GLIBCXX__" "string" LLDB_USING_LIBSTDCXX)
+if(LLDB_USING_LIBSTDCXX)
+ # There doesn't seem to be an easy way to check the library version.
Instead, we rely on the
+ # fact that std::set did not have the allocator constructor available
until version 4.9
+ check_cxx_source_compiles("
+ #include <set>
+ std::set<int> s = std::set<int>(std::allocator<int>());
+ int main() { return 0; }"
+ LLDB_USING_LIBSTDCXX_4_9)
+ if (NOT LLDB_USING_LIBSTDCXX_4_9 AND NOT LLVM_ENABLE_EH)
+ message(WARNING
+ "You appear to be using linking to libstdc++ version lesser than
4.9 without "
+ "exceptions enabled. These versions of the library have an issue,
which causes "
+ "occasional lldb crashes. See
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59656> "
+ "for details. Possible courses of action are:\n"
+ "- use libstdc++ version 4.9 or newer\n"
+ "- use libc++ (via LLVM_ENABLE_LIBCXX)\n"
+ "- enable exceptions (via LLVM_ENABLE_EH)\n"
+ "- ignore this warning and accept occasional instability")
+ endif()
+endif()
Index: cmake/modules/LLDBConfig.cmake
===================================================================
--- cmake/modules/LLDBConfig.cmake
+++ cmake/modules/LLDBConfig.cmake
@@ -1,3 +1,5 @@
+include(CheckCXXSymbolExists)
+
set(LLDB_PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
set(LLDB_SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/source")
set(LLDB_INCLUDE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/include")
@@ -415,3 +417,25 @@
list(APPEND system_libs ${CURSES_LIBRARIES})
include_directories(${CURSES_INCLUDE_DIR})
endif ()
+
+check_cxx_symbol_exists("__GLIBCXX__" "string" LLDB_USING_LIBSTDCXX)
+if(LLDB_USING_LIBSTDCXX)
+ # There doesn't seem to be an easy way to check the library version. Instead, we rely on the
+ # fact that std::set did not have the allocator constructor available until version 4.9
+ check_cxx_source_compiles("
+ #include <set>
+ std::set<int> s = std::set<int>(std::allocator<int>());
+ int main() { return 0; }"
+ LLDB_USING_LIBSTDCXX_4_9)
+ if (NOT LLDB_USING_LIBSTDCXX_4_9 AND NOT LLVM_ENABLE_EH)
+ message(WARNING
+ "You appear to be using linking to libstdc++ version lesser than 4.9 without "
+ "exceptions enabled. These versions of the library have an issue, which causes "
+ "occasional lldb crashes. See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59656> "
+ "for details. Possible courses of action are:\n"
+ "- use libstdc++ version 4.9 or newer\n"
+ "- use libc++ (via LLVM_ENABLE_LIBCXX)\n"
+ "- enable exceptions (via LLVM_ENABLE_EH)\n"
+ "- ignore this warning and accept occasional instability")
+ endif()
+endif()
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits