was marked with the explicit identifier.
- Introduced the new ``CXIndex`` constructor function
- ``clang_createIndexWithOptions``, which allows overriding precompiled preamble
- storage path.
+ ``clang_createIndexWithOptions``, which allows storing precompiled preambles
+ in memory or overriding the precompiled preamble storage path.
- Deprecated two functions ``clang_CXIndex_setGlobalOptions`` and
``clang_CXIndex_setInvocationEmissionPathOption`` in favor of the new
* \see clang_createIndex()
*/
unsigned DisplayDiagnostics : 1;
- unsigned /*Reserved*/ : 14;
+ /**
+ * Store PCH in memory. If zero, PCH are stored in temporary files.
+ */
+ unsigned StorePreamblesInMemory : 1;
+ unsigned /*Reserved*/ : 13;
/**
* The path to a directory, in which to store temporary PCH files. If null or
* empty, the default system temporary directory is used. These PCH files are
* deleted on clean exit but stay on disk if the program crashes or is killed.
*
+ * This option is ignored if \a StorePreamblesInMemory is non-zero.
+ *
* Libclang does not create the directory at the specified path in the file
* system. Therefore it must exist, or storing PCH files will fail.
*/
std::shared_ptr<PreprocessorOptions> PPOpts;
IntrusiveRefCntPtr<ASTReader> Reader;
bool HadModuleLoaderFatalFailure = false;
+ bool StorePreamblesInMemory = false;
struct ASTWriterData;
std::unique_ptr<ASTWriterData> WriterData;
///
/// \param ResourceFilesPath - The path to the compiler resource files.
///
+ /// \param StorePreamblesInMemory - Whether to store PCH in memory. If false,
+ /// PCH are stored in temporary files.
+ ///
/// \param PreambleStoragePath - The path to a directory, in which to create
/// temporary PCH files. If empty, the default system temporary directory is
- /// used.
+ /// used. This parameter is ignored if \p StorePreamblesInMemory is true.
///
/// \param ModuleFormat - If provided, uses the specific module format.
///
const char **ArgBegin, const char **ArgEnd,
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
+ bool StorePreamblesInMemory = false,
StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,
CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::None,
ArrayRef<RemappedFile> RemappedFiles = std::nullopt,
llvm::ErrorOr<PrecompiledPreamble> NewPreamble = PrecompiledPreamble::Build(
PreambleInvocationIn, MainFileBuffer.get(), Bounds, *Diagnostics, VFS,
- PCHContainerOps, /*StoreInMemory=*/false, PreambleStoragePath,
+ PCHContainerOps, StorePreamblesInMemory, PreambleStoragePath,
Callbacks);
PreambleInvocationIn.getFrontendOpts().SkipFunctionBodies =
const char **ArgBegin, const char **ArgEnd,
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
- StringRef PreambleStoragePath, bool OnlyLocalDecls,
- CaptureDiagsKind CaptureDiagnostics, ArrayRef<RemappedFile> RemappedFiles,
- bool RemappedFilesKeepOriginalName, unsigned PrecompilePreambleAfterNParses,
- TranslationUnitKind TUKind, bool CacheCodeCompletionResults,
- bool IncludeBriefCommentsInCodeCompletion, bool AllowPCHWithCompilerErrors,
- SkipFunctionBodiesScope SkipFunctionBodies, bool SingleFileParse,
- bool UserFilesAreVolatile, bool ForSerialization,
+ bool StorePreamblesInMemory, StringRef PreambleStoragePath,
+ bool OnlyLocalDecls, CaptureDiagsKind CaptureDiagnostics,
+ ArrayRef<RemappedFile> RemappedFiles, bool RemappedFilesKeepOriginalName,
+ unsigned PrecompilePreambleAfterNParses, TranslationUnitKind TUKind,
+ bool CacheCodeCompletionResults, bool IncludeBriefCommentsInCodeCompletion,
+ bool AllowPCHWithCompilerErrors, SkipFunctionBodiesScope SkipFunctionBodies,
+ bool SingleFileParse, bool UserFilesAreVolatile, bool ForSerialization,
bool RetainExcludedConditionalBlocks, std::optional<StringRef> ModuleFormat,
std::unique_ptr<ASTUnit> *ErrAST,
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
VFS = llvm::vfs::getRealFileSystem();
VFS = createVFSFromCompilerInvocation(*CI, *Diags, VFS);
AST->FileMgr = new FileManager(AST->FileSystemOpts, VFS);
+ AST->StorePreamblesInMemory = StorePreamblesInMemory;
AST->PreambleStoragePath = PreambleStoragePath;
AST->ModuleCache = new InMemoryModuleCache;
AST->OnlyLocalDecls = OnlyLocalDecls;
options->ExcludeDeclarationsFromPCH, options->DisplayDiagnostics,
options->ThreadBackgroundPriorityForIndexing,
options->ThreadBackgroundPriorityForEditing);
+ CIdxr->setStorePreamblesInMemory(options->StorePreamblesInMemory);
CIdxr->setPreambleStoragePath(options->PreambleStoragePath);
CIdxr->setInvocationEmissionPath(options->InvocationEmissionPath);
return CIdxr;
std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine(
Args->data(), Args->data() + Args->size(),
CXXIdx->getPCHContainerOperations(), Diags,
- CXXIdx->getClangResourcesPath(), CXXIdx->getPreambleStoragePath(),
- CXXIdx->getOnlyLocalDecls(), CaptureDiagnostics, *RemappedFiles.get(),
+ CXXIdx->getClangResourcesPath(), CXXIdx->getStorePreamblesInMemory(),
+ CXXIdx->getPreambleStoragePath(), CXXIdx->getOnlyLocalDecls(),
+ CaptureDiagnostics, *RemappedFiles.get(),
/*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses,
TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion,
/*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies, SingleFileParse,
class CIndexer {
bool OnlyLocalDecls;
bool DisplayDiagnostics;
+ bool StorePreamblesInMemory = false;
unsigned Options; // CXGlobalOptFlags.
std::string ResourcesPath;
StringRef getClangToolchainPath();
+ void setStorePreamblesInMemory(bool StoreInMemory) {
+ StorePreamblesInMemory = StoreInMemory;
+ }
+ bool getStorePreamblesInMemory() const { return StorePreamblesInMemory; }
+
void setPreambleStoragePath(StringRef Str) {
PreambleStoragePath = Str.str();
}
std::unique_ptr<clang::ASTUnit> ErrUnit;
ASTUnit *AST = ASTUnit::LoadFromCommandLine(
- &Args[0], &Args[4], PCHContainerOps, Diags, "", "", false,
+ &Args[0], &Args[4], PCHContainerOps, Diags, "", false, "", false,
CaptureDiagsKind::All, std::nullopt, true, 0, TU_Complete, false, false,
false, SkipFunctionBodiesScope::None, false, true, false, false,
std::nullopt, &ErrUnit, nullptr);
};
class LibclangSetPreambleStoragePathTest : public LibclangPreambleStorageTest {
+ virtual bool StorePreamblesInMemory() { return false; }
virtual const char *PreambleStoragePath() = 0;
protected:
CXIndexOptions Opts{};
Opts.Size = sizeof(CXIndexOptions);
+ Opts.StorePreamblesInMemory = StorePreamblesInMemory();
Opts.PreambleStoragePath = PreambleStoragePath();
Index = clang_createIndexWithOptions(&Opts);
ASSERT_TRUE(Index);
const char *PreambleStoragePath() override { return PreambleDir.c_str(); }
};
+class LibclangStoreInMemoryNullPreambleStoragePathTest
+ : public LibclangNullPreambleStoragePathTest {
+ bool StorePreamblesInMemory() override { return true; }
+};
+class LibclangStoreInMemoryEmptyPreambleStoragePathTest
+ : public LibclangEmptyPreambleStoragePathTest {
+ bool StorePreamblesInMemory() override { return true; }
+};
+class LibclangStoreInMemoryPreambleDirPreambleStoragePathTest
+ : public LibclangPreambleDirPreambleStoragePathTest {
+ bool StorePreamblesInMemory() override { return true; }
+};
+
TEST_F(LibclangNotOverriddenPreambleStoragePathTest, CountPreambles) {
CountPreamblesInPreambleDir(0);
}
TEST_F(LibclangPreambleDirPreambleStoragePathTest, CountPreambles) {
CountPreamblesInPreambleDir(1);
}
+TEST_F(LibclangStoreInMemoryNullPreambleStoragePathTest, CountPreambles) {
+ CountPreamblesInPreambleDir(0);
+}
+TEST_F(LibclangStoreInMemoryEmptyPreambleStoragePathTest, CountPreambles) {
+ CountPreamblesInPreambleDir(0);
+}
+TEST_F(LibclangStoreInMemoryPreambleDirPreambleStoragePathTest,
+ CountPreambles) {
+ CountPreamblesInPreambleDir(0);
+}
TEST_F(LibclangParseTest, AllSkippedRanges) {
std::string Header = "header.h", Main = "main.cpp";