From: Ted Kremenek Date: Sun, 14 Nov 2010 17:47:35 +0000 (+0000) Subject: "Fix" some unintentional fallout from converting X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c53fdd88f0d75875365463822fa817d7b1a9573;p=clang "Fix" some unintentional fallout from converting the Stmt* visitation in CursorVisitor to be data-recursive. Since AnnotationTokensWorker explicitly calls CursorVisitor::VisitChildren(), it essentially transforms the data-recursive algorithm in CursorVisitor back into a non-data recursive one. This is particularly bad because the data-recursive algorithm uses more stack space per stack frame, which can cause us to blow the stack in some cases. "Fix" this by making the stack that AnnotationTokensWorker runs in really huge. The real fix is to modify AnnotationTokensWorker not to do the explicit recursive call. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119047 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 98c74c79bd..6b8bec767e 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -4251,8 +4251,14 @@ void clang_annotateTokens(CXTranslationUnit TU, CXXUnit, RegionOfInterest); // Run the worker within a CrashRecoveryContext. + // FIXME: We use a ridiculous stack size here because the data-recursion + // algorithm uses a large stack frame than the non-data recursive version, + // and AnnotationTokensWorker currently transforms the data-recursion + // algorithm back into a traditional recursion by explicitly calling + // VisitChildren(). We will need to remove this explicit recursive call. llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, runAnnotateTokensWorker, &W)) { + if (!RunSafely(CRC, runAnnotateTokensWorker, &W, + GetSafetyThreadStackSize() * 2)) { fprintf(stderr, "libclang: crash detected while annotating tokens\n"); } } @@ -4597,8 +4603,11 @@ static unsigned SafetyStackThreadSize = 8 << 20; namespace clang { bool RunSafely(llvm::CrashRecoveryContext &CRC, - void (*Fn)(void*), void *UserData) { - if (unsigned Size = GetSafetyThreadStackSize()) + void (*Fn)(void*), void *UserData, + unsigned Size) { + if (!Size) + Size = GetSafetyThreadStackSize(); + if (Size) return CRC.RunSafelyOnThread(Fn, UserData, Size); return CRC.RunSafely(Fn, UserData); } diff --git a/tools/libclang/CIndexer.h b/tools/libclang/CIndexer.h index b6a82818a8..32cfa971f3 100644 --- a/tools/libclang/CIndexer.h +++ b/tools/libclang/CIndexer.h @@ -83,7 +83,7 @@ namespace clang { /// /// \return False if a crash was detected. bool RunSafely(llvm::CrashRecoveryContext &CRC, - void (*Fn)(void*), void *UserData); + void (*Fn)(void*), void *UserData, unsigned Size = 0); } #endif