diff options
-rw-r--r-- | clang/include/clang-c/Index.h | 55 | ||||
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 48 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexCodeCompletion.cpp | 4 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexer.h | 15 | ||||
-rw-r--r-- | clang/tools/libclang/CXTranslationUnit.h | 4 | ||||
-rw-r--r-- | clang/tools/libclang/Indexing.cpp | 9 | ||||
-rw-r--r-- | clang/tools/libclang/libclang.exports | 2 |
7 files changed, 131 insertions, 6 deletions
diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 8d7d8595bd2..54f461b9a10 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -204,6 +204,61 @@ CINDEX_LINKAGE CXIndex clang_createIndex(int excludeDeclarationsFromPCH, */ CINDEX_LINKAGE void clang_disposeIndex(CXIndex index); +typedef enum { + /** + * \brief Used to indicate that no special CXIndex options are needed. + */ + CXGlobalOpt_None = 0x0, + + /** + * \brief Used to indicate that threads that libclang creates for indexing + * purposes should use background priority. + * Affects \see clang_indexSourceFile, \see clang_indexTranslationUnit, + * \see clang_parseTranslationUnit, \see clang_saveTranslationUnit. + */ + CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 0x1, + + /** + * \brief Used to indicate that threads that libclang creates for editing + * purposes should use background priority. + * Affects \see clang_reparseTranslationUnit, \see clang_codeCompleteAt, + * \see clang_annotateTokens + */ + CXGlobalOpt_ThreadBackgroundPriorityForEditing = 0x2, + + /** + * \brief Used to indicate that all threads that libclang creates should use + * background priority. + */ + CXGlobalOpt_ThreadBackgroundPriorityForAll = + CXGlobalOpt_ThreadBackgroundPriorityForIndexing | + CXGlobalOpt_ThreadBackgroundPriorityForEditing + +} CXGlobalOptFlags; + +/** + * \brief Sets general options associated with a CXIndex. + * + * For example: + * \code + * CXIndex idx = ...; + * clang_CXIndex_setGlobalOptions(idx, + * clang_CXIndex_getGlobalOptions(idx) | + * CXGlobalOpt_ThreadBackgroundPriorityForIndexing); + * \endcode + * + * \param options A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags. + */ +CINDEX_LINKAGE void clang_CXIndex_setGlobalOptions(CXIndex, unsigned options); + +/** + * \brief Gets the general options associated with a CXIndex. + * + * \returns A bitmask of options, a bitwise OR of CXGlobalOpt_XXX flags that + * are associated with the given CXIndex object. + */ +CINDEX_LINKAGE unsigned clang_CXIndex_getGlobalOptions(CXIndex); + /** * \defgroup CINDEX_FILES File manipulation routines * diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index b3a29ef1052..3882d7bc953 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -52,10 +52,11 @@ using namespace clang::cxcursor; using namespace clang::cxstring; using namespace clang::cxtu; -CXTranslationUnit cxtu::MakeCXTranslationUnit(ASTUnit *TU) { +CXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *TU) { if (!TU) return 0; CXTranslationUnit D = new CXTranslationUnitImpl(); + D->CIdx = CIdx; D->TUData = TU; D->StringPool = createCXStringPool(); D->Diagnostics = 0; @@ -2411,6 +2412,14 @@ CXIndex clang_createIndex(int excludeDeclarationsFromPCH, CIdxr->setOnlyLocalDecls(); if (displayDiagnostics) CIdxr->setDisplayDiagnostics(); + + if (getenv("LIBCLANG_BGPRIO_INDEX")) + CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | + CXGlobalOpt_ThreadBackgroundPriorityForIndexing); + if (getenv("LIBCLANG_BGPRIO_EDIT")) + CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | + CXGlobalOpt_ThreadBackgroundPriorityForEditing); + return CIdxr; } @@ -2419,6 +2428,17 @@ void clang_disposeIndex(CXIndex CIdx) { delete static_cast<CIndexer *>(CIdx); } +void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) { + if (CIdx) + static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options); +} + +unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) { + if (CIdx) + return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags(); + return 0; +} + void clang_toggleCrashRecovery(unsigned isEnabled) { if (isEnabled) llvm::CrashRecoveryContext::Enable(); @@ -2441,7 +2461,7 @@ CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, 0, 0, /*CaptureDiagnostics=*/true, /*AllowPCHWithCompilerErrors=*/true); - return MakeCXTranslationUnit(TU); + return MakeCXTranslationUnit(CXXIdx, TU); } unsigned clang_defaultEditingTranslationUnitOptions() { @@ -2490,6 +2510,9 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) + setBackGroundPriority(); + bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble; // FIXME: Add a flag for modules. TranslationUnitKind TUKind @@ -2601,7 +2624,7 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { } } - PTUI->result = MakeCXTranslationUnit(Unit.take()); + PTUI->result = MakeCXTranslationUnit(CXXIdx, Unit.take()); } CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, const char *source_filename, @@ -2663,6 +2686,10 @@ static void clang_saveTranslationUnit_Impl(void *UserData) { SaveTranslationUnitInfo *STUI = static_cast<SaveTranslationUnitInfo*>(UserData); + CIndexer *CXXIdx = (CIndexer*)STUI->TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) + setBackGroundPriority(); + STUI->result = static_cast<ASTUnit *>(STUI->TU->TUData)->Save(STUI->FileName); } @@ -2750,6 +2777,10 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { if (!TU) return; + CIndexer *CXXIdx = (CIndexer*)TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) + setBackGroundPriority(); + ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); ASTUnit::ConcurrencyCheck Check(*CXXUnit); @@ -5133,6 +5164,10 @@ static void clang_annotateTokensImpl(void *UserData) { const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens; CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors; + CIndexer *CXXIdx = (CIndexer*)TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) + setBackGroundPriority(); + // Determine the region of interest, which contains all of the tokens. SourceRange RegionOfInterest; RegionOfInterest.setBegin( @@ -5704,6 +5739,13 @@ void SetSafetyThreadStackSize(unsigned Value) { SafetyStackThreadSize = Value; } +void clang::setBackGroundPriority() { + // FIXME: Move to llvm/Support and make it cross-platform. +#ifdef __APPLE__ + setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG); +#endif +} + } extern "C" { diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp index 1b4a7e48000..c5bc8c8dd4d 100644 --- a/clang/tools/libclang/CIndexCodeCompletion.cpp +++ b/clang/tools/libclang/CIndexCodeCompletion.cpp @@ -666,6 +666,10 @@ void clang_codeCompleteAt_Impl(void *UserData) { if (!AST) return; + CIndexer *CXXIdx = (CIndexer*)TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) + setBackGroundPriority(); + ASTUnit::ConcurrencyCheck Check(*AST); // Perform the remapping of source files. diff --git a/clang/tools/libclang/CIndexer.h b/clang/tools/libclang/CIndexer.h index de7cc88a2c6..f8cb8dc1feb 100644 --- a/clang/tools/libclang/CIndexer.h +++ b/clang/tools/libclang/CIndexer.h @@ -29,12 +29,14 @@ namespace clang { class CIndexer { bool OnlyLocalDecls; bool DisplayDiagnostics; + unsigned Options; // CXGlobalOptFlags. llvm::sys::Path ResourcesPath; std::string WorkingDir; public: - CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false) { } + CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false), + Options(CXGlobalOpt_None) { } /// \brief Whether we only want to see "local" declarations (that did not /// come from a previous precompiled header). If false, we want to see all @@ -47,6 +49,13 @@ public: DisplayDiagnostics = Display; } + unsigned getCXGlobalOptFlags() const { return Options; } + void setCXGlobalOptFlags(unsigned options) { Options = options; } + + bool isOptEnabled(CXGlobalOptFlags opt) const { + return Options & ~unsigned(opt); + } + /// \brief Get the path of the clang resource files. std::string getClangResourcesPath(); @@ -79,6 +88,10 @@ public: bool RunSafely(llvm::CrashRecoveryContext &CRC, void (*Fn)(void*), void *UserData, unsigned Size = 0); + /// \brief Set the thread priority to background. + /// FIXME: Move to llvm/Support. + void setBackGroundPriority(); + /// \brief Print libclang's resource usage to standard error. void PrintLibclangResourceUsage(CXTranslationUnit TU); } diff --git a/clang/tools/libclang/CXTranslationUnit.h b/clang/tools/libclang/CXTranslationUnit.h index b2b1b840377..3ad867ca8bf 100644 --- a/clang/tools/libclang/CXTranslationUnit.h +++ b/clang/tools/libclang/CXTranslationUnit.h @@ -16,6 +16,7 @@ extern "C" { struct CXTranslationUnitImpl { + void *CIdx; void *TUData; void *StringPool; void *Diagnostics; @@ -24,10 +25,11 @@ struct CXTranslationUnitImpl { namespace clang { class ASTUnit; + class CIndexer; namespace cxtu { -CXTranslationUnitImpl *MakeCXTranslationUnit(ASTUnit *TU); +CXTranslationUnitImpl *MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *TU); class CXTUOwner { CXTranslationUnitImpl *TU; diff --git a/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp index 85b638530f1..905569dccd1 100644 --- a/clang/tools/libclang/Indexing.cpp +++ b/clang/tools/libclang/Indexing.cpp @@ -275,6 +275,9 @@ static void clang_indexSourceFile_Impl(void *UserData) { CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) + setBackGroundPriority(); + CaptureDiagnosticConsumer *CaptureDiag = new CaptureDiagnosticConsumer(); // Configure the diagnostics. @@ -351,7 +354,7 @@ static void clang_indexSourceFile_Impl(void *UserData) { ASTUnit *Unit = ASTUnit::create(CInvok.getPtr(), Diags, /*CaptureDiagnostics=*/true); - OwningPtr<CXTUOwner> CXTU(new CXTUOwner(MakeCXTranslationUnit(Unit))); + OwningPtr<CXTUOwner> CXTU(new CXTUOwner(MakeCXTranslationUnit(CXXIdx, Unit))); // Recover resources if we crash before exiting this method. llvm::CrashRecoveryContextCleanupRegistrar<CXTUOwner> @@ -502,6 +505,10 @@ static void clang_indexTranslationUnit_Impl(void *UserData) { if (!client_index_callbacks || index_callbacks_size == 0) return; + CIndexer *CXXIdx = (CIndexer*)TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) + setBackGroundPriority(); + IndexerCallbacks CB; memset(&CB, 0, sizeof(CB)); unsigned ClientCBSize = index_callbacks_size < sizeof(CB) diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index afdb0c90bc4..21861fb7097 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -1,5 +1,7 @@ clang_CXCursorSet_contains clang_CXCursorSet_insert +clang_CXIndex_getGlobalOptions +clang_CXIndex_setGlobalOptions clang_CXXMethod_isStatic clang_CXXMethod_isVirtual clang_Cursor_getTranslationUnit |