summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBalazs Keri <1.int32@gmail.com>2019-02-27 16:31:48 +0000
committerBalazs Keri <1.int32@gmail.com>2019-02-27 16:31:48 +0000
commit9cf39dfb3857eab156ac4f99de909c90fc5f9d1d (patch)
tree7e01bb0cf7918bb71f6a8dbdf10f71ae110af4cb
parentb3a924afd6867da3677bf2c0cca8c1200b867eab (diff)
downloadbcm5719-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.cpp23
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;
}
OpenPOWER on IntegriCloud