forked from OSchip/llvm-project
In openFileForRead don't cache erroneous entries if the error relates to them being directories. Add tests.
Summary: It seems that when the CachingFileSystem is first given a file to open that is actually a directory, it incorrectly caches that path to be errenous and throws an error when subsequently a directory open call is made for the same path. This change makes it so that we do NOT cache a path if it turns out we asked for a file when its a directory. Reviewers: arphaman Subscribers: dexonsmith, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D68193 llvm-svn: 374366
This commit is contained in:
parent
cbe55c7caf
commit
4abac53302
clang
include/clang/Tooling/DependencyScanning
lib/Tooling/DependencyScanning
test/ClangScanDeps
|
@ -168,6 +168,9 @@ private:
|
||||||
return It == Cache.end() ? nullptr : It->getValue();
|
return It == Cache.end() ? nullptr : It->getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llvm::ErrorOr<const CachedFileSystemEntry *>
|
||||||
|
getOrCreateFileSystemEntry(const StringRef Filename);
|
||||||
|
|
||||||
DependencyScanningFilesystemSharedCache &SharedCache;
|
DependencyScanningFilesystemSharedCache &SharedCache;
|
||||||
/// The local cache is used by the worker thread to cache file system queries
|
/// The local cache is used by the worker thread to cache file system queries
|
||||||
/// locally instead of querying the global cache every time.
|
/// locally instead of querying the global cache every time.
|
||||||
|
|
|
@ -122,14 +122,11 @@ DependencyScanningFilesystemSharedCache::get(StringRef Key) {
|
||||||
return It.first->getValue();
|
return It.first->getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::ErrorOr<llvm::vfs::Status>
|
llvm::ErrorOr<const CachedFileSystemEntry *>
|
||||||
DependencyScanningWorkerFilesystem::status(const Twine &Path) {
|
DependencyScanningWorkerFilesystem::getOrCreateFileSystemEntry(const StringRef Filename) {
|
||||||
SmallString<256> OwnedFilename;
|
if (const CachedFileSystemEntry* Entry = getCachedEntry(Filename)) {
|
||||||
StringRef Filename = Path.toStringRef(OwnedFilename);
|
return Entry;
|
||||||
|
}
|
||||||
// Check the local cache first.
|
|
||||||
if (const CachedFileSystemEntry *Entry = getCachedEntry(Filename))
|
|
||||||
return Entry->getStatus();
|
|
||||||
|
|
||||||
// FIXME: Handle PCM/PCH files.
|
// FIXME: Handle PCM/PCH files.
|
||||||
// FIXME: Handle module map files.
|
// FIXME: Handle module map files.
|
||||||
|
@ -160,7 +157,17 @@ DependencyScanningWorkerFilesystem::status(const Twine &Path) {
|
||||||
|
|
||||||
// Store the result in the local cache.
|
// Store the result in the local cache.
|
||||||
setCachedEntry(Filename, Result);
|
setCachedEntry(Filename, Result);
|
||||||
return Result->getStatus();
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
llvm::ErrorOr<llvm::vfs::Status>
|
||||||
|
DependencyScanningWorkerFilesystem::status(const Twine &Path) {
|
||||||
|
SmallString<256> OwnedFilename;
|
||||||
|
StringRef Filename = Path.toStringRef(OwnedFilename);
|
||||||
|
const llvm::ErrorOr<const CachedFileSystemEntry *> Result = getOrCreateFileSystemEntry(Filename);
|
||||||
|
if (!Result)
|
||||||
|
return Result.getError();
|
||||||
|
return (*Result)->getStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -217,30 +224,8 @@ DependencyScanningWorkerFilesystem::openFileForRead(const Twine &Path) {
|
||||||
SmallString<256> OwnedFilename;
|
SmallString<256> OwnedFilename;
|
||||||
StringRef Filename = Path.toStringRef(OwnedFilename);
|
StringRef Filename = Path.toStringRef(OwnedFilename);
|
||||||
|
|
||||||
// Check the local cache first.
|
const llvm::ErrorOr<const CachedFileSystemEntry *> Result = getOrCreateFileSystemEntry(Filename);
|
||||||
if (const CachedFileSystemEntry *Entry = getCachedEntry(Filename))
|
if (!Result)
|
||||||
return createFile(Entry, PPSkipMappings);
|
return Result.getError();
|
||||||
|
return createFile(Result.get(), PPSkipMappings);
|
||||||
// FIXME: Handle PCM/PCH files.
|
|
||||||
// FIXME: Handle module map files.
|
|
||||||
|
|
||||||
bool KeepOriginalSource = IgnoredFiles.count(Filename);
|
|
||||||
DependencyScanningFilesystemSharedCache::SharedFileSystemEntry
|
|
||||||
&SharedCacheEntry = SharedCache.get(Filename);
|
|
||||||
const CachedFileSystemEntry *Result;
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> LockGuard(SharedCacheEntry.ValueLock);
|
|
||||||
CachedFileSystemEntry &CacheEntry = SharedCacheEntry.Value;
|
|
||||||
|
|
||||||
if (!CacheEntry.isValid()) {
|
|
||||||
CacheEntry = CachedFileSystemEntry::createFileEntry(
|
|
||||||
Filename, getUnderlyingFS(), !KeepOriginalSource);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result = &CacheEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store the result in the local cache.
|
|
||||||
setCachedEntry(Filename, Result);
|
|
||||||
return createFile(Result, PPSkipMappings);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"directory": "DIR",
|
||||||
|
"command": "clang -c -IDIR -IInputs DIR/headerwithdirname_input.cpp",
|
||||||
|
"file": "DIR/headerwithdirname_input.cpp"
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,21 @@
|
||||||
|
// RUN: rm -rf %t.dir
|
||||||
|
// RUN: rm -rf %t.dir/foodir
|
||||||
|
// RUN: rm -rf %t.cdb
|
||||||
|
|
||||||
|
// RUN: mkdir -p %t.dir
|
||||||
|
// RUN: mkdir -p %t.dir/foodir
|
||||||
|
|
||||||
|
// RUN: cp %S/Inputs/header.h %t.dir/foodir/foodirheader.h
|
||||||
|
// RUN: cp %s %t.dir/headerwithdirname_input.cpp
|
||||||
|
// RUN: mkdir %t.dir/Inputs
|
||||||
|
// RUN: cp %S/Inputs/foodir %t.dir/Inputs/foodir
|
||||||
|
// RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/headerwithdirnamefollowedbyinclude.json > %t.cdb
|
||||||
|
//
|
||||||
|
// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 | FileCheck %s
|
||||||
|
|
||||||
|
#include <foodir>
|
||||||
|
#include "foodir/foodirheader.h"
|
||||||
|
|
||||||
|
// CHECK: headerwithdirname_input.o
|
||||||
|
// CHECK-NEXT: headerwithdirname_input.cpp
|
||||||
|
// CHECK-NEXT: Inputs{{/|\\}}foodir
|
Loading…
Reference in New Issue