summaryrefslogtreecommitdiffstats
path: root/clang/tools/libclang/CIndex.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-11-05 07:19:31 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-11-05 07:19:31 +0000
commitb7383e6d80af774880784587b0e7d7edceb4b295 (patch)
treea36f5896a2709d9d43f3e5d81aa161fb37ded22f /clang/tools/libclang/CIndex.cpp
parent9aff85e41e419ff11602092540f2d7c386dd39f8 (diff)
downloadbcm5719-llvm-b7383e6d80af774880784587b0e7d7edceb4b295.tar.gz
bcm5719-llvm-b7383e6d80af774880784587b0e7d7edceb4b295.zip
libclang: Add some support for running certain entry points in a "safety"
thread, primarily to get a larger stack. - Yes, I feel dirty. llvm-svn: 118274
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
-rw-r--r--clang/tools/libclang/CIndex.cpp25
1 files changed, 23 insertions, 2 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() {
OpenPOWER on IntegriCloud