diff options
| author | Chandler Carruth <chandlerc@gmail.com> | 2014-06-27 16:37:27 +0000 |
|---|---|---|
| committer | Chandler Carruth <chandlerc@gmail.com> | 2014-06-27 16:37:27 +0000 |
| commit | 6666074876eff651e25bd1cd3cfa0848b26f7c28 (patch) | |
| tree | 661dd0f01b6895218c3f6fd04258d3d4f7a7d38e | |
| parent | 637f6cceeed31dbbcf441b5dcd71ad4f9606cde4 (diff) | |
| download | bcm5719-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.cpp | 15 |
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) |

