diff options
author | Balazs Keri <1.int32@gmail.com> | 2019-02-27 16:31:48 +0000 |
---|---|---|
committer | Balazs Keri <1.int32@gmail.com> | 2019-02-27 16:31:48 +0000 |
commit | 9cf39dfb3857eab156ac4f99de909c90fc5f9d1d (patch) | |
tree | 7e01bb0cf7918bb71f6a8dbdf10f71ae110af4cb | |
parent | b3a924afd6867da3677bf2c0cca8c1200b867eab (diff) | |
download | bcm5719-llvm-9cf39dfb3857eab156ac4f99de909c90fc5f9d1d.tar.gz bcm5719-llvm-9cf39dfb3857eab156ac4f99de909c90fc5f9d1d.zip |
[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
-rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 27a39f3a78b..5ab57ecd315 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -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; } |