summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/tools/libclang/CIndex.cpp25
-rw-r--r--clang/tools/libclang/CIndexCodeCompletion.cpp2
-rw-r--r--clang/tools/libclang/CIndexer.h20
3 files changed, 43 insertions, 4 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 2c68aa50766..e24a622d902 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -2139,7 +2139,7 @@ CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx,
num_unsaved_files, options, 0 };
llvm::CrashRecoveryContext CRC;
- if (!CRC.RunSafely(clang_parseTranslationUnit_Impl, &PTUI)) {
+ if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) {
fprintf(stderr, "libclang: crash detected during parsing: {\n");
fprintf(stderr, " 'source_filename' : '%s'\n", source_filename);
fprintf(stderr, " 'command_line_args' : [");
@@ -2238,7 +2238,7 @@ int clang_reparseTranslationUnit(CXTranslationUnit TU,
options, 0 };
llvm::CrashRecoveryContext CRC;
- if (!CRC.RunSafely(clang_reparseTranslationUnit_Impl, &RTUI)) {
+ if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) {
fprintf(stderr, "libclang: crash detected during reparsing\n");
static_cast<ASTUnit *>(TU)->setUnsafeToFree(true);
return 1;
@@ -4431,6 +4431,27 @@ CXString createCXString(llvm::StringRef String, bool DupString) {
// Misc. utility functions.
//===----------------------------------------------------------------------===//
+static unsigned SafetyStackThreadSize = 0;
+
+namespace clang {
+
+bool RunSafely(llvm::CrashRecoveryContext &CRC,
+ void (*Fn)(void*), void *UserData) {
+ if (unsigned Size = GetSafetyThreadStackSize())
+ return CRC.RunSafelyOnThread(Fn, UserData, Size);
+ return CRC.RunSafely(Fn, UserData);
+}
+
+unsigned GetSafetyThreadStackSize() {
+ return SafetyStackThreadSize;
+}
+
+void SetSafetyThreadStackSize(unsigned Value) {
+ SafetyStackThreadSize = Value;
+}
+
+}
+
extern "C" {
CXString clang_getClangVersion() {
diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp
index c92e2afaf3c..f22f5eeff64 100644
--- a/clang/tools/libclang/CIndexCodeCompletion.cpp
+++ b/clang/tools/libclang/CIndexCodeCompletion.cpp
@@ -480,7 +480,7 @@ CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU,
options, 0 };
llvm::CrashRecoveryContext CRC;
- if (!CRC.RunSafely(clang_codeCompleteAt_Impl, &CCAI)) {
+ if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) {
fprintf(stderr, "libclang: crash detected in code completion\n");
static_cast<ASTUnit *>(TU)->setUnsafeToFree(true);
return 0;
diff --git a/clang/tools/libclang/CIndexer.h b/clang/tools/libclang/CIndexer.h
index 1fcb964c6ef..b6a82818a80 100644
--- a/clang/tools/libclang/CIndexer.h
+++ b/clang/tools/libclang/CIndexer.h
@@ -1,4 +1,4 @@
-//===- CIndexer.h - Clang-C Source Indexing Library -----------------------===//
+//===- CIndexer.h - Clang-C Source Indexing Library -------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -20,6 +20,10 @@
#include "llvm/System/Path.h"
#include <vector>
+namespace llvm {
+ class CrashRecoveryContext;
+}
+
namespace clang {
namespace cxstring {
CXString createCXString(const char *String, bool DupString = false);
@@ -66,6 +70,20 @@ namespace clang {
struct CXUnsavedFile *unsaved_files,
std::vector<std::string> &RemapArgs,
std::vector<llvm::sys::Path> &TemporaryFiles);
+
+ /// \brief Return the current size to request for "safety".
+ unsigned GetSafetyThreadStackSize();
+
+ /// \brief Set the current size to request for "safety" (or 0, if safety
+ /// threads should not be used).
+ void SetSafetyThreadStackSize(unsigned Value);
+
+ /// \brief Execution the given code "safely", using crash recovery or safety
+ /// threads when possible.
+ ///
+ /// \return False if a crash was detected.
+ bool RunSafely(llvm::CrashRecoveryContext &CRC,
+ void (*Fn)(void*), void *UserData);
}
#endif
OpenPOWER on IntegriCloud