Construct SourceManager with UserFilesAreVolatile

Prettify pipeline
This commit is contained in:
Fangrui Song 2018-09-28 13:41:50 -07:00
parent 7eacd2664f
commit 153e5c0dcc
2 changed files with 15 additions and 7 deletions

View File

@ -190,6 +190,12 @@ std::unique_ptr<CompilerInstance> BuildCompilerInstance(
Clang->getDiagnostics(), Clang->getInvocation().TargetOpts)); Clang->getDiagnostics(), Clang->getInvocation().TargetOpts));
if (!Clang->hasTarget()) if (!Clang->hasTarget())
return nullptr; return nullptr;
// Construct SourceManager with UserFilesAreVolatile: true because otherwise
// RequiresNullTerminator: true may cause out-of-bounds read when a file is
// mmap'ed but is saved concurrently.
Clang->createFileManager();
Clang->setSourceManager(new SourceManager(Clang->getDiagnostics(),
Clang->getFileManager(), true));
return Clang; return Clang;
} }

View File

@ -150,10 +150,14 @@ std::unique_ptr<IndexFile> RawCacheLoad(const std::string &path) {
IndexFile::kMajorVersion); IndexFile::kMajorVersion);
} }
bool Indexer_Parse(CompletionManager *completion, WorkingFiles *wfiles, std::mutex &GetFileMutex(const std::string &path) {
Project *project, VFS *vfs, const GroupMatch &matcher) {
const int N_MUTEXES = 256; const int N_MUTEXES = 256;
static std::mutex mutexes[N_MUTEXES]; static std::mutex mutexes[N_MUTEXES];
return mutexes[std::hash<std::string>()(path) % N_MUTEXES];
}
bool Indexer_Parse(CompletionManager *completion, WorkingFiles *wfiles,
Project *project, VFS *vfs, const GroupMatch &matcher) {
std::optional<Index_Request> opt_request = index_request->TryPopFront(); std::optional<Index_Request> opt_request = index_request->TryPopFront();
if (!opt_request) if (!opt_request)
return false; return false;
@ -204,8 +208,7 @@ bool Indexer_Parse(CompletionManager *completion, WorkingFiles *wfiles,
if (reparse < 2) if (reparse < 2)
do { do {
std::unique_lock lock( std::unique_lock lock(GetFileMutex(path_to_index));
mutexes[std::hash<std::string>()(path_to_index) % N_MUTEXES]);
prev = RawCacheLoad(path_to_index); prev = RawCacheLoad(path_to_index);
if (!prev || CacheInvalid(vfs, prev.get(), path_to_index, entry.args, if (!prev || CacheInvalid(vfs, prev.get(), path_to_index, entry.args,
std::nullopt)) std::nullopt))
@ -244,8 +247,7 @@ bool Indexer_Parse(CompletionManager *completion, WorkingFiles *wfiles,
std::string path = dep.first.val().str(); std::string path = dep.first.val().str();
if (!vfs->Stamp(path, dep.second, 1)) if (!vfs->Stamp(path, dep.second, 1))
continue; continue;
std::lock_guard lock1( std::lock_guard lock1(GetFileMutex(path));
mutexes[std::hash<std::string>()(path) % N_MUTEXES]);
prev = RawCacheLoad(path); prev = RawCacheLoad(path);
if (!prev) if (!prev)
continue; continue;
@ -301,7 +303,7 @@ bool Indexer_Parse(CompletionManager *completion, WorkingFiles *wfiles,
LOG_IF_S(INFO, loud) << "store index for " << path << " (delta: " << !!prev LOG_IF_S(INFO, loud) << "store index for " << path << " (delta: " << !!prev
<< ")"; << ")";
{ {
std::lock_guard lock(mutexes[std::hash<std::string>()(path) % N_MUTEXES]); std::lock_guard lock(GetFileMutex(path));
if (vfs->Loaded(path)) if (vfs->Loaded(path))
prev = RawCacheLoad(path); prev = RawCacheLoad(path);
else else