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 | fa39f5b76bafdf536c5e305f821eb1b7f11079bd (patch) | |
tree | 528de0b5b68b4224054dd10b2da1e86303ad7099 | |
parent | 4bf34d19b80bbcd26519b6ab32d17d876c8b8dcc (diff) |
[libclang] Install a fatal error handler that will call abort() instead of exit()
when there is a report_fatal_error() call.
rdar://10507984
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146641 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | tools/libclang/CIndex.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 9c057e5520..bccd927ca2 100644 --- a/tools/libclang/CIndex.cpp +++ b/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; } |