[ASTImporter] Improve import of FileID.

Summary:
Even if the content cache has a directory and filename, it may be a virtual file.
The old code returned with error in this case, but it is worth to try to handle
the file as it were a memory buffer.

Reviewers: a.sidorin, shafik, martong, a_sidorin

Reviewed By: shafik

Subscribers: efriedma, rnkovacs, cfe-commits, dkrupp, martong, Szelethus, gamesh411

Tags: #clang

Differential Revision: https://reviews.llvm.org/D57590

llvm-svn: 355000
This commit is contained in:
Balazs Keri 2019-02-27 16:31:48 +00:00
parent b3a924afd6
commit 9cf39dfb38
1 changed files with 16 additions and 7 deletions

View File

@ -8289,14 +8289,21 @@ FileID ASTImporter::Import(FileID FromID) {
// than mmap the files several times.
const FileEntry *Entry =
ToFileManager.getFile(Cache->OrigEntry->getName());
if (!Entry)
return {};
ToID = ToSM.createFileID(Entry, ToIncludeLoc,
FromSLoc.getFile().getFileCharacteristic());
} else {
// FIXME: The filename may be a virtual name that does probably not
// point to a valid file and we get no Entry here. In this case try with
// the memory buffer below.
if (Entry)
ToID = ToSM.createFileID(Entry, ToIncludeLoc,
FromSLoc.getFile().getFileCharacteristic());
}
if (ToID.isInvalid()) {
// FIXME: We want to re-use the existing MemoryBuffer!
const llvm::MemoryBuffer *FromBuf =
Cache->getBuffer(FromContext.getDiagnostics(), FromSM);
bool Invalid = true;
const llvm::MemoryBuffer *FromBuf = Cache->getBuffer(
FromContext.getDiagnostics(), FromSM, SourceLocation{}, &Invalid);
if (!FromBuf || Invalid)
return {};
std::unique_ptr<llvm::MemoryBuffer> ToBuf =
llvm::MemoryBuffer::getMemBufferCopy(FromBuf->getBuffer(),
FromBuf->getBufferIdentifier());
@ -8305,6 +8312,8 @@ FileID ASTImporter::Import(FileID FromID) {
}
}
assert(ToID.isValid() && "Unexpected invalid fileID was created.");
ImportedFileIDs[FromID] = ToID;
return ToID;
}