summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-12-15 04:52:41 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-12-15 04:52:41 +0000
commitbe52b5ff6ada56dcefcabe76c0f30e52889db464 (patch)
tree4b1c8e607b547cc165a1be3155894f8a26619d6c
parentf9322415dc9f6c1433fe728e0ebfa4659e594093 (diff)
downloadbcm5719-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.cpp12
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;
}
OpenPOWER on IntegriCloud