Fix nested CrashRecoveryContexts with LLVM_ENABLE_THREADS=OFF, allow them.
authorNico Weber <nicolasweber@gmx.de>
Thu, 6 Aug 2015 19:21:25 +0000 (19:21 +0000)
committerNico Weber <nicolasweber@gmx.de>
Thu, 6 Aug 2015 19:21:25 +0000 (19:21 +0000)
commita57926b847cd89613a47e07a5af7d67b676aa240
tree1e85025f7a54136e644f0865ac980d5ff5502052
parent397ed3e704b42b19af6e1b12b09df29970cac4e7
Fix nested CrashRecoveryContexts with LLVM_ENABLE_THREADS=OFF, allow them.

libclang uses a CrashRecoveryContext, and building a module does too. If a
module gets built through libclang, nested CrashRecoveryContexts are used.  They
work fine with threads as things are stored in ThreadLocal variables, but in
LLVM_ENABLE_THREADS=OFF builds the two recovery contexts would write to the
same globals.

To fix, keep active CrashRecoveryContextImpls in a list and have the global
point to the innermost one, and do something similar for
tlIsRecoveringFromCrash.

Necessary (but not sufficient) for PR11974 and PR20325

http://reviews.llvm.org/D11770

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244251 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Support/CrashRecoveryContext.h
lib/Support/CrashRecoveryContext.cpp