diff options
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 185 |
1 files changed, 65 insertions, 120 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 3579fc77c77..f6710a096e7 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2988,35 +2988,19 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, Options); } -struct ParseTranslationUnitInfo { - CXIndex CIdx; - const char *source_filename; - const char *const *command_line_args; - int num_command_line_args; - ArrayRef<CXUnsavedFile> unsaved_files; - unsigned options; - CXTranslationUnit *out_TU; - CXErrorCode &result; -}; -static void clang_parseTranslationUnit_Impl(void *UserData) { - const ParseTranslationUnitInfo *PTUI = - static_cast<ParseTranslationUnitInfo *>(UserData); - CXIndex CIdx = PTUI->CIdx; - const char *source_filename = PTUI->source_filename; - const char * const *command_line_args = PTUI->command_line_args; - int num_command_line_args = PTUI->num_command_line_args; - unsigned options = PTUI->options; - CXTranslationUnit *out_TU = PTUI->out_TU; - +static CXErrorCode +clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename, + const char *const *command_line_args, + int num_command_line_args, + ArrayRef<CXUnsavedFile> unsaved_files, + unsigned options, CXTranslationUnit *out_TU) { // Set up the initial return values. if (out_TU) *out_TU = nullptr; // Check arguments. - if (!CIdx || !out_TU) { - PTUI->result = CXError_InvalidArguments; - return; - } + if (!CIdx || !out_TU) + return CXError_InvalidArguments; CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); @@ -3050,7 +3034,7 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar< std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get()); - for (auto &UF : PTUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); @@ -3109,10 +3093,8 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { /*UserFilesAreVolatile=*/true, ForSerialization, &ErrUnit)); // Early failures in LoadFromCommandLine may return with ErrUnit unset. - if (!Unit && !ErrUnit) { - PTUI->result = CXError_ASTReadError; - return; - } + if (!Unit && !ErrUnit) + return CXError_ASTReadError; if (NumErrors != Diags->getClient()->getNumErrors()) { // Make sure to check that 'Unit' is non-NULL. @@ -3120,12 +3102,11 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get()); } - if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) { - PTUI->result = CXError_ASTReadError; - } else { - *PTUI->out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release()); - PTUI->result = *PTUI->out_TU ? CXError_Success : CXError_Failure; - } + if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) + return CXError_ASTReadError; + + *out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release()); + return *out_TU ? CXError_Success : CXError_Failure; } CXTranslationUnit @@ -3165,18 +3146,14 @@ enum CXErrorCode clang_parseTranslationUnit2( return CXError_InvalidArguments; CXErrorCode result = CXError_Failure; - ParseTranslationUnitInfo PTUI = { - CIdx, - source_filename, - command_line_args, - num_command_line_args, - llvm::makeArrayRef(unsaved_files, num_unsaved_files), - options, - out_TU, - result}; + auto ParseTranslationUnitImpl = [=, &result] { + result = clang_parseTranslationUnit_Impl( + CIdx, source_filename, command_line_args, num_command_line_args, + llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU); + }; llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) { + if (!RunSafely(CRC, ParseTranslationUnitImpl)) { fprintf(stderr, "libclang: crash detected during parsing: {\n"); fprintf(stderr, " 'source_filename' : '%s'\n", source_filename); fprintf(stderr, " 'command_line_args' : ["); @@ -3199,7 +3176,7 @@ enum CXErrorCode clang_parseTranslationUnit2( return CXError_Crashed; } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { - if (CXTranslationUnit *TU = PTUI.out_TU) + if (CXTranslationUnit *TU = out_TU) PrintLibclangResourceUsage(*TU); } @@ -3210,27 +3187,15 @@ unsigned clang_defaultSaveOptions(CXTranslationUnit TU) { return CXSaveTranslationUnit_None; } -namespace { - -struct SaveTranslationUnitInfo { - CXTranslationUnit TU; - const char *FileName; - unsigned options; - CXSaveError result; -}; - -} - -static void clang_saveTranslationUnit_Impl(void *UserData) { - SaveTranslationUnitInfo *STUI = - static_cast<SaveTranslationUnitInfo*>(UserData); - - CIndexer *CXXIdx = STUI->TU->CIdx; +static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU, + const char *FileName, + unsigned options) { + CIndexer *CXXIdx = TU->CIdx; if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) setThreadBackgroundPriority(); - bool hadError = cxtu::getASTUnit(STUI->TU)->Save(STUI->FileName); - STUI->result = hadError ? CXSaveError_Unknown : CXSaveError_None; + bool hadError = cxtu::getASTUnit(TU)->Save(FileName); + return hadError ? CXSaveError_Unknown : CXSaveError_None; } int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, @@ -3249,16 +3214,19 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, if (!CXXUnit->hasSema()) return CXSaveError_InvalidTU; - SaveTranslationUnitInfo STUI = { TU, FileName, options, CXSaveError_None }; + CXSaveError result; + auto SaveTranslationUnitImpl = [=, &result]() { + result = clang_saveTranslationUnit_Impl(TU, FileName, options); + }; if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() || getenv("LIBCLANG_NOTHREADS")) { - clang_saveTranslationUnit_Impl(&STUI); + SaveTranslationUnitImpl(); if (getenv("LIBCLANG_RESOURCE_USAGE")) PrintLibclangResourceUsage(TU); - return STUI.result; + return result; } // We have an AST that has invalid nodes due to compiler errors. @@ -3266,7 +3234,7 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_saveTranslationUnit_Impl, &STUI)) { + if (!RunSafely(CRC, SaveTranslationUnitImpl)) { fprintf(stderr, "libclang: crash detected during AST saving: {\n"); fprintf(stderr, " 'filename' : '%s'\n", FileName); fprintf(stderr, " 'options' : %d,\n", options); @@ -3278,7 +3246,7 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, PrintLibclangResourceUsage(TU); } - return STUI.result; + return result; } void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { @@ -3302,25 +3270,14 @@ unsigned clang_defaultReparseOptions(CXTranslationUnit TU) { return CXReparse_None; } -struct ReparseTranslationUnitInfo { - CXTranslationUnit TU; - ArrayRef<CXUnsavedFile> unsaved_files; - unsigned options; - CXErrorCode &result; -}; - -static void clang_reparseTranslationUnit_Impl(void *UserData) { - const ReparseTranslationUnitInfo *RTUI = - static_cast<ReparseTranslationUnitInfo *>(UserData); - CXTranslationUnit TU = RTUI->TU; - unsigned options = RTUI->options; - (void) options; - +static CXErrorCode +clang_reparseTranslationUnit_Impl(CXTranslationUnit TU, + ArrayRef<CXUnsavedFile> unsaved_files, + unsigned options) { // Check arguments. if (isNotUsableTU(TU)) { LOG_BAD_TU(TU); - RTUI->result = CXError_InvalidArguments; - return; + return CXError_InvalidArguments; } // Reset the associated diagnostics. @@ -3341,7 +3298,7 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar< std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get()); - for (auto &UF : RTUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); @@ -3349,9 +3306,10 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(), *RemappedFiles.get())) - RTUI->result = CXError_Success; - else if (isASTReadError(CXXUnit)) - RTUI->result = CXError_ASTReadError; + return CXError_Success; + if (isASTReadError(CXXUnit)) + return CXError_ASTReadError; + return CXError_Failure; } int clang_reparseTranslationUnit(CXTranslationUnit TU, @@ -3365,19 +3323,20 @@ int clang_reparseTranslationUnit(CXTranslationUnit TU, if (num_unsaved_files && !unsaved_files) return CXError_InvalidArguments; - CXErrorCode result = CXError_Failure; - ReparseTranslationUnitInfo RTUI = { - TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, - result}; + CXErrorCode result; + auto ReparseTranslationUnitImpl = [=, &result]() { + result = clang_reparseTranslationUnit_Impl( + TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options); + }; if (getenv("LIBCLANG_NOTHREADS")) { - clang_reparseTranslationUnit_Impl(&RTUI); + ReparseTranslationUnitImpl(); return result; } llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) { + if (!RunSafely(CRC, ReparseTranslationUnitImpl)) { fprintf(stderr, "libclang: crash detected during reparsing\n"); cxtu::getASTUnit(TU)->setUnsafeToFree(true); return CXError_Crashed; @@ -6063,16 +6022,6 @@ MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent, parent); } -namespace { - struct clang_annotateTokens_Data { - CXTranslationUnit TU; - ASTUnit *CXXUnit; - CXToken *Tokens; - unsigned NumTokens; - CXCursor *Cursors; - }; -} - /// \brief Used by \c annotatePreprocessorTokens. /// \returns true if lexing was finished, false otherwise. static bool lexNext(Lexer &Lex, Token &Tok, @@ -6192,13 +6141,9 @@ static void annotatePreprocessorTokens(CXTranslationUnit TU, } // This gets run a separate thread to avoid stack blowout. -static void clang_annotateTokensImpl(void *UserData) { - CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU; - ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit; - CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens; - const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens; - CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors; - +static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit, + CXToken *Tokens, unsigned NumTokens, + CXCursor *Cursors) { CIndexer *CXXIdx = TU->CIdx; if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) setThreadBackgroundPriority(); @@ -6334,11 +6279,12 @@ void clang_annotateTokens(CXTranslationUnit TU, return; ASTUnit::ConcurrencyCheck Check(*CXXUnit); - - clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors }; + + auto AnnotateTokensImpl = [=]() { + clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors); + }; llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_annotateTokensImpl, &data, - GetSafetyThreadStackSize() * 2)) { + if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) { fprintf(stderr, "libclang: crash detected while annotating tokens\n"); } } @@ -7187,14 +7133,13 @@ static unsigned SafetyStackThreadSize = 8 << 20; namespace clang { -bool RunSafely(llvm::CrashRecoveryContext &CRC, - void (*Fn)(void*), void *UserData, +bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn, unsigned Size) { if (!Size) Size = GetSafetyThreadStackSize(); if (Size) - return CRC.RunSafelyOnThread(Fn, UserData, Size); - return CRC.RunSafely(Fn, UserData); + return CRC.RunSafelyOnThread(Fn, Size); + return CRC.RunSafely(Fn); } unsigned GetSafetyThreadStackSize() { |

