Merge pull request #355 from apple/tensorflow-merge

Tensorflow merge
diff --git a/lib/Serialization/ModuleManager.cpp b/lib/Serialization/ModuleManager.cpp
index 0c0627e..78182fb 100644
--- a/lib/Serialization/ModuleManager.cpp
+++ b/lib/Serialization/ModuleManager.cpp
@@ -207,13 +207,8 @@
   // Read the signature eagerly now so that we can check it.  Avoid calling
   // ReadSignature unless there's something to check though.
   if (ExpectedSignature && checkSignature(ReadSignature(NewModule->Data),
-                                          ExpectedSignature, ErrorStr)) {
-    // Try to remove the buffer.  If it can't be removed, then it was already
-    // validated by this process.
-    if (!getModuleCache().tryToDropPCM(NewModule->FileName))
-      FileMgr.invalidateCache(NewModule->File);
+                                          ExpectedSignature, ErrorStr))
     return OutOfDate;
-  }
 
   // We're keeping this module.  Store it everywhere.
   Module = Modules[Entry] = NewModule.get();
diff --git a/test/Modules/Inputs/implicit-invalidate-common/A.h b/test/Modules/Inputs/implicit-invalidate-common/A.h
new file mode 100644
index 0000000..7ad7e6b
--- /dev/null
+++ b/test/Modules/Inputs/implicit-invalidate-common/A.h
@@ -0,0 +1,2 @@
+// A
+#include "Common.h"
diff --git a/test/Modules/Inputs/implicit-invalidate-common/B.h b/test/Modules/Inputs/implicit-invalidate-common/B.h
new file mode 100644
index 0000000..2952dcb
--- /dev/null
+++ b/test/Modules/Inputs/implicit-invalidate-common/B.h
@@ -0,0 +1,2 @@
+// B
+#include "Common.h"
diff --git a/test/Modules/Inputs/implicit-invalidate-common/Common.h b/test/Modules/Inputs/implicit-invalidate-common/Common.h
new file mode 100644
index 0000000..01419c7
--- /dev/null
+++ b/test/Modules/Inputs/implicit-invalidate-common/Common.h
@@ -0,0 +1 @@
+// Common
diff --git a/test/Modules/Inputs/implicit-invalidate-common/module.modulemap b/test/Modules/Inputs/implicit-invalidate-common/module.modulemap
new file mode 100644
index 0000000..97c674a
--- /dev/null
+++ b/test/Modules/Inputs/implicit-invalidate-common/module.modulemap
@@ -0,0 +1,3 @@
+module A { header "A.h" }
+module B { header "B.h" }
+module Common { header "Common.h" }
diff --git a/test/Modules/implicit-invalidate-common.c b/test/Modules/implicit-invalidate-common.c
new file mode 100644
index 0000000..d6cf90e
--- /dev/null
+++ b/test/Modules/implicit-invalidate-common.c
@@ -0,0 +1,36 @@
+// REQUIRES: shell
+// RUN: rm -rf %t
+// RUN: mkdir -p %t/implicit-invalidate-common
+// RUN: cp -r %S/Inputs/implicit-invalidate-common %t/
+// RUN: echo '#include "A.h"' > %t/A.c
+// RUN: echo '#include "B.h"' > %t/B.c
+
+// Build with an empty module cache. Module 'Common' should be built only once.
+//
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/Cache \
+// RUN:     -fsyntax-only -I %t/implicit-invalidate-common -Rmodule-build \
+// RUN:     %t/A.c 2> %t/initial_build.txt
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/Cache \
+// RUN:     -fsyntax-only -I %t/implicit-invalidate-common -Rmodule-build \
+// RUN:     %t/B.c 2>> %t/initial_build.txt
+// RUN: FileCheck %s --implicit-check-not "remark:" --input-file %t/initial_build.txt
+
+// Update module 'Common' and build with the populated module cache. Module
+// 'Common' still should be built only once. Note that we are using the same
+// flags for A.c and B.c to avoid building Common.pcm at different paths.
+//
+// RUN: echo ' // ' >> %t/implicit-invalidate-common/Common.h
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/Cache \
+// RUN:     -fsyntax-only -I %t/implicit-invalidate-common -Rmodule-build \
+// RUN:     %t/A.c 2> %t/incremental_build.txt
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/Cache \
+// RUN:     -fsyntax-only -I %t/implicit-invalidate-common -Rmodule-build \
+// RUN:     %t/B.c 2>> %t/incremental_build.txt
+// RUN: FileCheck %s --implicit-check-not "remark:" --input-file %t/incremental_build.txt
+
+// CHECK: remark: building module 'A'
+// CHECK: remark: building module 'Common'
+// CHECK: remark: finished building module 'Common'
+// CHECK: remark: finished building module 'A'
+// CHECK: remark: building module 'B'
+// CHECK: remark: finished building module 'B'