diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-15 04:52:41 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-15 04:52:41 +0000 |
commit | be52b5ff6ada56dcefcabe76c0f30e52889db464 (patch) | |
tree | 4b1c8e607b547cc165a1be3155894f8a26619d6c | |
parent | f9322415dc9f6c1433fe728e0ebfa4659e594093 (diff) | |
download | bcm5719-llvm-be52b5ff6ada56dcefcabe76c0f30e52889db464.tar.gz bcm5719-llvm-be52b5ff6ada56dcefcabe76c0f30e52889db464.zip |
[libclang] Install a fatal error handler that will call abort() instead of exit()
when there is a report_fatal_error() call.
rdar://10507984
llvm-svn: 146641
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 9c057e5520c..bccd927ca2c 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2336,6 +2336,17 @@ RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr, static llvm::sys::Mutex EnableMultithreadingMutex; static bool EnabledMultithreading; +static void fatal_error_handler(void *user_data, const std::string& reason) { + llvm::SmallString<64> Buffer; + llvm::raw_svector_ostream OS(Buffer); + OS << "LIBCLANG FATAL ERROR: " << reason << "\n"; + StringRef MessageStr = OS.str(); + // Write the result out to stderr avoiding errs() because raw_ostreams can + // call report_fatal_error. + ::write(2, MessageStr.data(), MessageStr.size()); + ::abort(); +} + extern "C" { CXIndex clang_createIndex(int excludeDeclarationsFromPCH, int displayDiagnostics) { @@ -2351,6 +2362,7 @@ CXIndex clang_createIndex(int excludeDeclarationsFromPCH, { llvm::sys::ScopedLock L(EnableMultithreadingMutex); if (!EnabledMultithreading) { + llvm::install_fatal_error_handler(fatal_error_handler, 0); llvm::llvm_start_multithreaded(); EnabledMultithreading = true; } |