diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-11-05 07:19:31 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-11-05 07:19:31 +0000 |
commit | b7383e6d80af774880784587b0e7d7edceb4b295 (patch) | |
tree | a36f5896a2709d9d43f3e5d81aa161fb37ded22f | |
parent | 9aff85e41e419ff11602092540f2d7c386dd39f8 (diff) | |
download | bcm5719-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
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 25 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexCodeCompletion.cpp | 2 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexer.h | 20 |
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 |