From 0cebf9262b4ab79d9c8780e61dee504d6a15986a Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Fri, 27 Jun 2014 16:37:27 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211905 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/libclang/CIndex.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 1d6258b0cb..fdd6334bac 100644 --- a/tools/libclang/CIndex.cpp +++ b/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 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) -- 2.50.1