shafik created this revision.
shafik added reviewers: martong, a.sidorin, teemperor, aaron.ballman.
Herald added subscribers: jdoerfert, rnkovacs.

Currently when we see a built-in we try and import the include location. 
Instead what we do now is find the buffer like we do for the invalid case and 
copy that over to the to context.


https://reviews.llvm.org/D58743

Files:
  include/clang/AST/ASTImporter.h
  lib/AST/ASTImporter.cpp


Index: lib/AST/ASTImporter.cpp
===================================================================
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8229,9 +8229,10 @@
     return {};
 
   SourceManager &FromSM = FromContext.getSourceManager();
+  bool IsBuiltin =  FromSM.isWrittenInBuiltinFile(FromLoc);
 
   std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
-  FileID ToFileID = Import(Decomposed.first);
+  FileID ToFileID = Import(Decomposed.first, IsBuiltin);
   if (ToFileID.isInvalid())
     return {};
   SourceManager &ToSM = ToContext.getSourceManager();
@@ -8252,7 +8253,7 @@
     return llvm::make_error<ImportError>();
   return ToID;
 }
-FileID ASTImporter::Import(FileID FromID) {
+FileID ASTImporter::Import(FileID FromID, bool isBuiltin) {
   llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
     return Pos->second;
@@ -8278,25 +8279,30 @@
     }
     ToID = ToSM.getFileID(MLoc);
   } else {
-    // Include location of this file.
-    SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
-
     const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
-    if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
-      // FIXME: We probably want to use getVirtualFile(), so we don't hit the
-      // disk again
-      // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
-      // than mmap the files several times.
-      const FileEntry *Entry =
-          ToFileManager.getFile(Cache->OrigEntry->getName());
-      // 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 (!isBuiltin) {
+       // Include location of this file.
+       SourceLocation ToIncludeLoc = 
Import(FromSLoc.getFile().getIncludeLoc());
+
+
+        if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
+          // FIXME: We probably want to use getVirtualFile(), so we don't hit 
the
+          // disk again
+          // FIXME: We definitely want to re-use the existing MemoryBuffer, 
rather
+          // than mmap the files several times.
+          const FileEntry *Entry =
+              ToFileManager.getFile(Cache->OrigEntry->getName());
+          // 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()) {
+
+    if (ToID.isInvalid() || isBuiltin) {
       // FIXME: We want to re-use the existing MemoryBuffer!
       bool Invalid = true;
       const llvm::MemoryBuffer *FromBuf = Cache->getBuffer(
Index: include/clang/AST/ASTImporter.h
===================================================================
--- include/clang/AST/ASTImporter.h
+++ include/clang/AST/ASTImporter.h
@@ -339,7 +339,7 @@
     /// context, or the import error.
     llvm::Expected<FileID> Import_New(FileID);
     // FIXME: Remove this version.
-    FileID Import(FileID);
+    FileID Import(FileID, bool isBuiltin=false);
 
     /// Import the given C++ constructor initializer from the "from"
     /// context into the "to" context.


Index: lib/AST/ASTImporter.cpp
===================================================================
--- lib/AST/ASTImporter.cpp
+++ lib/AST/ASTImporter.cpp
@@ -8229,9 +8229,10 @@
     return {};
 
   SourceManager &FromSM = FromContext.getSourceManager();
+  bool IsBuiltin =  FromSM.isWrittenInBuiltinFile(FromLoc);
 
   std::pair<FileID, unsigned> Decomposed = FromSM.getDecomposedLoc(FromLoc);
-  FileID ToFileID = Import(Decomposed.first);
+  FileID ToFileID = Import(Decomposed.first, IsBuiltin);
   if (ToFileID.isInvalid())
     return {};
   SourceManager &ToSM = ToContext.getSourceManager();
@@ -8252,7 +8253,7 @@
     return llvm::make_error<ImportError>();
   return ToID;
 }
-FileID ASTImporter::Import(FileID FromID) {
+FileID ASTImporter::Import(FileID FromID, bool isBuiltin) {
   llvm::DenseMap<FileID, FileID>::iterator Pos = ImportedFileIDs.find(FromID);
   if (Pos != ImportedFileIDs.end())
     return Pos->second;
@@ -8278,25 +8279,30 @@
     }
     ToID = ToSM.getFileID(MLoc);
   } else {
-    // Include location of this file.
-    SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
-
     const SrcMgr::ContentCache *Cache = FromSLoc.getFile().getContentCache();
-    if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
-      // FIXME: We probably want to use getVirtualFile(), so we don't hit the
-      // disk again
-      // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
-      // than mmap the files several times.
-      const FileEntry *Entry =
-          ToFileManager.getFile(Cache->OrigEntry->getName());
-      // 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 (!isBuiltin) {
+       // Include location of this file.
+       SourceLocation ToIncludeLoc = Import(FromSLoc.getFile().getIncludeLoc());
+
+
+        if (Cache->OrigEntry && Cache->OrigEntry->getDir()) {
+          // FIXME: We probably want to use getVirtualFile(), so we don't hit the
+          // disk again
+          // FIXME: We definitely want to re-use the existing MemoryBuffer, rather
+          // than mmap the files several times.
+          const FileEntry *Entry =
+              ToFileManager.getFile(Cache->OrigEntry->getName());
+          // 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()) {
+
+    if (ToID.isInvalid() || isBuiltin) {
       // FIXME: We want to re-use the existing MemoryBuffer!
       bool Invalid = true;
       const llvm::MemoryBuffer *FromBuf = Cache->getBuffer(
Index: include/clang/AST/ASTImporter.h
===================================================================
--- include/clang/AST/ASTImporter.h
+++ include/clang/AST/ASTImporter.h
@@ -339,7 +339,7 @@
     /// context, or the import error.
     llvm::Expected<FileID> Import_New(FileID);
     // FIXME: Remove this version.
-    FileID Import(FileID);
+    FileID Import(FileID, bool isBuiltin=false);
 
     /// Import the given C++ constructor initializer from the "from"
     /// context into the "to" context.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to