summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-06-27 16:37:27 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-06-27 16:37:27 +0000
commit6666074876eff651e25bd1cd3cfa0848b26f7c28 (patch)
tree661dd0f01b6895218c3f6fd04258d3d4f7a7d38e
parent637f6cceeed31dbbcf441b5dcd71ad4f9606cde4 (diff)
downloadbcm5719-llvm-6666074876eff651e25bd1cd3cfa0848b26f7c28.tar.gz
bcm5719-llvm-6666074876eff651e25bd1cd3cfa0848b26f7c28.zip
Fix a bug in my previous patch by restoring the behavior that the fatal
error handler is only registered once. To avoid the use of std::call_once (the obvious way to do this) I've wrapped everything up into a managed static and done the work in a constructor. Silly, but it should be effective. Some out-of-tree libclang users reported this to me, and I've asked them to put together a test case which exhibits this behavior, but I wanted to fix things ASAP since the nature of the fix is straight forward. llvm-svn: 211905
-rw-r--r--clang/tools/libclang/CIndex.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 1d6258b0cbf..fdd6334bac5 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -2600,6 +2600,16 @@ static void fatal_error_handler(void *user_data, const std::string& reason,
::abort();
}
+namespace {
+struct RegisterFatalErrorHandler {
+ RegisterFatalErrorHandler() {
+ llvm::install_fatal_error_handler(fatal_error_handler, nullptr);
+ }
+};
+}
+
+static llvm::ManagedStatic<RegisterFatalErrorHandler> RegisterFatalErrorHandlerOnce;
+
extern "C" {
CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
int displayDiagnostics) {
@@ -2608,7 +2618,10 @@ CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY"))
llvm::CrashRecoveryContext::Enable();
- llvm::install_fatal_error_handler(fatal_error_handler, nullptr);
+ // Look through the managed static to trigger construction of the managed
+ // static which registers our fatal error handler. This ensures it is only
+ // registered once.
+ (void)*RegisterFatalErrorHandlerOnce;
CIndexer *CIdxr = new CIndexer();
if (excludeDeclarationsFromPCH)
OpenPOWER on IntegriCloud