Merge remote-tracking branch 'origin/swift-4.1-branch' into stable
diff --git a/include/clang/APINotes/APINotesManager.h b/include/clang/APINotes/APINotesManager.h
index 2adc29c..6eb0534 100644
--- a/include/clang/APINotes/APINotesManager.h
+++ b/include/clang/APINotes/APINotesManager.h
@@ -65,9 +65,6 @@
/// for private headers.
APINotesReader *CurrentModuleReaders[2] = { nullptr, nullptr };
- /// Whether we have already pruned the API notes cache.
- bool PrunedCache;
-
/// A mapping from header file directories to the API notes reader for
/// that directory, or a redirection to another directory entry that may
/// have more information, or NULL to indicate that there is no API notes
diff --git a/include/clang/Basic/DiagnosticFrontendKinds.td b/include/clang/Basic/DiagnosticFrontendKinds.td
index 446eb41..38bc726 100644
--- a/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -229,10 +229,6 @@
def err_invalid_vfs_overlay : Error<
"invalid virtual filesystem overlay file '%0'">, DefaultFatal;
-def err_no_apinotes_cache_path : Error<
- "-fapinotes was provided without -fapinotes-cache-path=<directory>">,
- DefaultFatal;
-
def warn_option_invalid_ocl_version : Warning<
"OpenCL version %0 does not support the option '%1'">, InGroup<Deprecated>;
}
diff --git a/include/clang/Basic/FileSystemOptions.h b/include/clang/Basic/FileSystemOptions.h
index 1beb2e2..38f1346 100644
--- a/include/clang/Basic/FileSystemOptions.h
+++ b/include/clang/Basic/FileSystemOptions.h
@@ -25,9 +25,6 @@
/// \brief If set, paths are resolved as if the working directory was
/// set to the value of WorkingDir.
std::string WorkingDir;
-
- /// The path to the API notes cache.
- std::string APINotesCachePath;
};
} // end namespace clang
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index fcc247c..9f8d189 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -701,8 +701,8 @@
def fno_apinotes_modules : Flag<["-"], "fno-apinotes-modules">, Group<f_clang_Group>,
Flags<[CC1Option]>, HelpText<"Disable module-based external API notes support">;
def fapinotes_cache_path : Joined<["-"], "fapinotes-cache-path=">,
- Group<i_Group>, Flags<[DriverOption, CC1Option]>, MetaVarName<"<directory>">,
- HelpText<"Specify the API notes cache path">;
+ Group<i_Group>, Flags<[DriverOption]>, MetaVarName<"<directory>">,
+ HelpText<"Does nothing; API notes are no longer cached separately from modules">;
def fapinotes_swift_version : Joined<["-"], "fapinotes-swift-version=">,
Group<f_clang_Group>, Flags<[CC1Option]>, MetaVarName<"<version>">,
HelpText<"Specify the Swift version to use when filtering API notes">;
diff --git a/lib/APINotes/APINotesManager.cpp b/lib/APINotes/APINotesManager.cpp
index 832f454..6fc0fda 100644
--- a/lib/APINotes/APINotesManager.cpp
+++ b/lib/APINotes/APINotesManager.cpp
@@ -46,12 +46,6 @@
"header directories searched");
STATISTIC(NumDirectoryCacheHits,
"directory cache hits");
-STATISTIC(NumBinaryCacheHits,
- "binary form cache hits");
-STATISTIC(NumBinaryCacheMisses,
- "binary form cache misses");
-STATISTIC(NumBinaryCacheRebuilds,
- "binary form cache rebuilds");
namespace {
/// Prints two successive strings, which much be kept alive as long as the
@@ -69,8 +63,7 @@
APINotesManager::APINotesManager(SourceManager &sourceMgr,
const LangOptions &langOpts)
- : SourceMgr(sourceMgr), ImplicitAPINotes(langOpts.APINotes),
- PrunedCache(false) { }
+ : SourceMgr(sourceMgr), ImplicitAPINotes(langOpts.APINotes) { }
APINotesManager::~APINotesManager() {
// Free the API notes readers.
@@ -84,78 +77,8 @@
delete CurrentModuleReaders[1];
}
-/// \brief Write a new timestamp file with the given path.
-static void writeTimestampFile(StringRef TimestampFile) {
- std::error_code EC;
- llvm::raw_fd_ostream Out(TimestampFile.str(), EC, llvm::sys::fs::F_None);
-}
-
-/// \brief Prune the API notes cache of API notes that haven't been accessed in
-/// a long time.
-static void pruneAPINotesCache(StringRef APINotesCachePath) {
- struct stat StatBuf;
- llvm::SmallString<128> TimestampFile;
- TimestampFile = APINotesCachePath;
- llvm::sys::path::append(TimestampFile, "APINotes.timestamp");
-
- // Try to stat() the timestamp file.
- if (::stat(TimestampFile.c_str(), &StatBuf)) {
- // If the timestamp file wasn't there, create one now.
- if (errno == ENOENT) {
- llvm::sys::fs::create_directories(APINotesCachePath);
- writeTimestampFile(TimestampFile);
- }
- return;
- }
-
- const unsigned APINotesCachePruneInterval = 7 * 24 * 60 * 60;
- const unsigned APINotesCachePruneAfter = 31 * 24 * 60 * 60;
-
- // Check whether the time stamp is older than our pruning interval.
- // If not, do nothing.
- time_t TimeStampModTime = StatBuf.st_mtime;
- time_t CurrentTime = time(nullptr);
- if (CurrentTime - TimeStampModTime <= time_t(APINotesCachePruneInterval))
- return;
-
- // Write a new timestamp file so that nobody else attempts to prune.
- // There is a benign race condition here, if two Clang instances happen to
- // notice at the same time that the timestamp is out-of-date.
- writeTimestampFile(TimestampFile);
-
- // Walk the entire API notes cache, looking for unused compiled API notes.
- std::error_code EC;
- SmallString<128> APINotesCachePathNative;
- llvm::sys::path::native(APINotesCachePath, APINotesCachePathNative);
- for (llvm::sys::fs::directory_iterator
- File(APINotesCachePathNative.str(), EC), DirEnd;
- File != DirEnd && !EC; File.increment(EC)) {
- StringRef Extension = llvm::sys::path::extension(File->path());
- if (Extension.empty())
- continue;
-
- if (Extension.substr(1) != BINARY_APINOTES_EXTENSION)
- continue;
-
- // Look at this file. If we can't stat it, there's nothing interesting
- // there.
- if (::stat(File->path().c_str(), &StatBuf))
- continue;
-
- // If the file has been used recently enough, leave it there.
- time_t FileAccessTime = StatBuf.st_atime;
- if (CurrentTime - FileAccessTime <= time_t(APINotesCachePruneAfter)) {
- continue;
- }
-
- // Remove the file.
- llvm::sys::fs::remove(File->path());
- }
-}
-
std::unique_ptr<APINotesReader>
APINotesManager::loadAPINotes(const FileEntry *apiNotesFile) {
- FileManager &fileMgr = SourceMgr.getFileManager();
PrettyStackTraceDoubleString trace("Loading API notes from ",
apiNotesFile->getName());
@@ -174,59 +97,6 @@
return APINotesReader::getUnmanaged(buffer, SwiftVersion);
}
- // If we haven't pruned the API notes cache yet during this execution, do
- // so now.
- if (!PrunedCache) {
- pruneAPINotesCache(fileMgr.getFileSystemOpts().APINotesCachePath);
- PrunedCache = true;
- }
-
- // Compute a hash of the API notes file's directory and the Clang version,
- // to be used as part of the filename for the cached binary copy.
- auto code = llvm::hash_value(StringRef(apiNotesFile->getDir()->getName()));
- code = hash_combine(code, getClangFullRepositoryVersion());
-
- // Determine the file name for the cached binary form.
- SmallString<128> compiledFileName;
- compiledFileName += fileMgr.getFileSystemOpts().APINotesCachePath;
- assert(!compiledFileName.empty() && "No API notes cache path provided?");
- llvm::sys::path::append(compiledFileName,
- (llvm::Twine(llvm::sys::path::stem(apiNotesFileName)) + "-"
- + llvm::APInt(64, code).toString(36, /*Signed=*/false) + "."
- + BINARY_APINOTES_EXTENSION));
-
- // Try to open the cached binary form.
- if (const FileEntry *compiledFile = fileMgr.getFile(compiledFileName,
- /*openFile=*/true,
- /*cacheFailure=*/false)) {
- // Load the file contents.
- if (auto buffer = fileMgr.getBufferForFile(compiledFile)) {
- // Load the file.
- if (auto reader = APINotesReader::get(std::move(buffer.get()),
- SwiftVersion)) {
- bool outOfDate = false;
- if (auto sizeAndModTime = reader->getSourceFileSizeAndModTime()) {
- if (sizeAndModTime->first != apiNotesFile->getSize() ||
- sizeAndModTime->second != apiNotesFile->getModificationTime())
- outOfDate = true;
- }
-
- if (!outOfDate) {
- // Success.
- ++NumBinaryCacheHits;
- return reader;
- }
- }
- }
-
- // The cache entry was somehow broken; delete this one so we can build a
- // new one below.
- llvm::sys::fs::remove(compiledFileName.str());
- ++NumBinaryCacheRebuilds;
- } else {
- ++NumBinaryCacheMisses;
- }
-
// Open the source file.
auto sourceFileID = SourceMgr.createFileID(apiNotesFile, SourceLocation(), SrcMgr::C_User);
auto sourceBuffer = SourceMgr.getBuffer(sourceFileID, SourceLocation());
@@ -235,6 +105,8 @@
// Compile the API notes source into a buffer.
// FIXME: Either propagate OSType through or, better yet, improve the binary
// APINotes format to maintain complete availability information.
+ // FIXME: We don't even really need to go through the binary format at all;
+ // we're just going to immediately deserialize it again.
llvm::SmallVector<char, 1024> apiNotesBuffer;
std::unique_ptr<llvm::MemoryBuffer> compiledBuffer;
{
@@ -257,39 +129,6 @@
StringRef(apiNotesBuffer.data(), apiNotesBuffer.size()));
}
- // Save the binary form into the cache. Perform this operation
- // atomically.
- SmallString<64> temporaryBinaryFileName = compiledFileName.str();
- temporaryBinaryFileName.erase(
- temporaryBinaryFileName.end()
- - llvm::sys::path::extension(temporaryBinaryFileName).size(),
- temporaryBinaryFileName.end());
- temporaryBinaryFileName += "-%%%%%%.";
- temporaryBinaryFileName += BINARY_APINOTES_EXTENSION;
-
- int temporaryFD;
- llvm::sys::fs::create_directories(
- fileMgr.getFileSystemOpts().APINotesCachePath);
- if (!llvm::sys::fs::createUniqueFile(temporaryBinaryFileName.str(),
- temporaryFD, temporaryBinaryFileName)) {
- // Write the contents of the buffer.
- bool hadError;
- {
- llvm::raw_fd_ostream out(temporaryFD, /*shouldClose=*/true);
- out.write(compiledBuffer.get()->getBufferStart(),
- compiledBuffer.get()->getBufferSize());
- out.flush();
-
- hadError = out.has_error();
- }
-
- if (!hadError) {
- // Rename the temporary file to the actual compiled file.
- llvm::sys::fs::rename(temporaryBinaryFileName.str(),
- compiledFileName.str());
- }
- }
-
// Load the binary form we just compiled.
auto reader = APINotesReader::get(std::move(compiledBuffer), SwiftVersion);
assert(reader && "Could not load the API notes we just generated?");
diff --git a/lib/Driver/ToolChains/Clang.cpp b/lib/Driver/ToolChains/Clang.cpp
index 56af4e3..d5df32a 100644
--- a/lib/Driver/ToolChains/Clang.cpp
+++ b/lib/Driver/ToolChains/Clang.cpp
@@ -3507,28 +3507,6 @@
options::OPT_fno_apinotes_modules, false))
CmdArgs.push_back("-fapinotes-modules");
- SmallString<128> APINotesCachePath;
- if (Arg *A = Args.getLastArg(options::OPT_fapinotes_cache_path)) {
- APINotesCachePath = A->getValue();
- }
-
- if (C.isForDiagnostics()) {
- // When generating crash reports, we want to emit the API notes along with
- // the reproduction sources, so we ignore any provided API notes path.
- APINotesCachePath = Output.getFilename();
- llvm::sys::path::replace_extension(APINotesCachePath, ".cache");
- llvm::sys::path::append(APINotesCachePath, "apinotes");
- } else if (APINotesCachePath.empty()) {
- // No API notes path was provided: use the default.
- llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
- APINotesCachePath);
- llvm::sys::path::append(APINotesCachePath, "org.llvm.clang");
- llvm::sys::path::append(APINotesCachePath, "APINotesCache");
- }
- const char Arg[] = "-fapinotes-cache-path=";
- APINotesCachePath.insert(APINotesCachePath.begin(), Arg, Arg + strlen(Arg));
- CmdArgs.push_back(Args.MakeArgString(APINotesCachePath));
-
Args.AddLastArg(CmdArgs, options::OPT_fapinotes_swift_version);
}
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index acb5d88..0a983c1 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -1171,7 +1171,6 @@
static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args) {
Opts.WorkingDir = Args.getLastArgValue(OPT_working_directory);
- Opts.APINotesCachePath = Args.getLastArgValue(OPT_fapinotes_cache_path);
}
/// Parse the argument to the -ftest-module-file-extension
@@ -2696,13 +2695,6 @@
Res.getPreprocessorOpts(), Diags);
if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
LangOpts.ObjCExceptions = 1;
-
- // -fapinotes and -fapinotes-modules requires -fapinotes-cache-path=<directory>.
- if ((LangOpts.APINotes || LangOpts.APINotesModules) &&
- Res.getFileSystemOpts().APINotesCachePath.empty()) {
- Diags.Report(diag::err_no_apinotes_cache_path);
- Success = false;
- }
}
if (LangOpts.CUDA) {
diff --git a/test/APINotes/availability.m b/test/APINotes/availability.m
index f9bee1a..7231eb4 100644
--- a/test/APINotes/availability.m
+++ b/test/APINotes/availability.m
@@ -1,5 +1,5 @@
// RUN: rm -rf %t
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
#include "HeaderLib.h"
#import <SomeKit/SomeKit.h>
diff --git a/test/APINotes/broken_types.m b/test/APINotes/broken_types.m
index 164ae79..ee33ff7 100644
--- a/test/APINotes/broken_types.m
+++ b/test/APINotes/broken_types.m
@@ -1,5 +1,5 @@
// RUN: rm -rf %t && mkdir -p %t
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s 2> %t.err
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s 2> %t.err
// RUN: FileCheck %s < %t.err
#include "BrokenTypes.h"
diff --git a/test/APINotes/cache.m b/test/APINotes/cache.m
deleted file mode 100644
index b87bdf1..0000000
--- a/test/APINotes/cache.m
+++ /dev/null
@@ -1,32 +0,0 @@
-// RUN: rm -rf %t/APINotesCache
-// RUN: %clang_cc1 -fapinotes -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
-
-// Check for the presence of the cached compiled form.
-// RUN: ls %t/APINotesCache | grep "APINotes-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "SomeKit-.*.apinotesc"
-
-// Run test again to ensure that caching doesn't cause problems.
-// RUN: %clang_cc1 -fapinotes -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
-
-// Check that the driver provides a default -fapinotes-cache-path=
-// RUN: %clang -fsyntax-only -fapinotes -fapinotes-modules -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -### 2>&1 | FileCheck --check-prefix=CHECK-DEFAULT-PATH %s
-// CHECK-DEFAULT-PATH: -fapinotes-cache-path={{.*}}org.llvm.clang/APINotesCache
-
-// Check that the driver passes through a provided -fapinotes-cache-path=
-// RUN: %clang -fsyntax-only -fapinotes -fapinotes-modules -fapinotes-cache-path=/wobble -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -### 2>&1 | FileCheck --check-prefix=CHECK-PATH %s
-// CHECK-PATH: -fapinotes-cache-path=/wobble
-
-#include "HeaderLib.h"
-#import <SomeKit/SomeKit.h>
-
-int main() {
- int i;
- i = unavailable_function(); // expected-error{{'unavailable_function' is unavailable: I beg you not to use this}}
- // expected-note@HeaderLib.h:8{{'unavailable_function' has been explicitly marked unavailable here}}
-
- A *a = 0;
- [a transform:a]; // expected-error{{'transform:' is unavailable: anything but this}}
- // expected-note@SomeKit/SomeKit.h:6{{'transform:' has been explicitly marked unavailable here}}
-
- return 0;
-}
diff --git a/test/APINotes/cache_pruning.m b/test/APINotes/cache_pruning.m
deleted file mode 100644
index 1a36570..0000000
--- a/test/APINotes/cache_pruning.m
+++ /dev/null
@@ -1,49 +0,0 @@
-// We need 'touch' and 'find' for this test to work.
-// REQUIRES: shell
-
-// RUN: rm -rf %t/APINotesCache
-
-// Run Clang. This should generated the cached versions of both and a timestamp.
-// RUN: %clang_cc1 -fapinotes -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DINCLUDE_HEADERLIB
-// RUN: ls %t/APINotesCache | grep "APINotes-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "SomeKit-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "APINotes.timestamp"
-
-// Set the timestamp back a very long time. We should try to prune,
-// but nothing gets pruned because the API Notes files are new enough.
-// RUN: touch -m -a -t 201101010000 %t/APINotes.timestamp
-// RUN: %clang_cc1 -fapinotes -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
-// RUN: ls %t/APINotesCache | grep "APINotes-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "SomeKit-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "APINotes.timestamp"
-
-// Set the HeaderLib access time back a very long time.
-// This shouldn't prune anything, because the timestamp has been updated, so
-// the pruning mechanism won't fire.
-// RUN: find %t/APINotesCache -name APINotes-*.apinotesc | xargs touch -a -t 201101010000
-// RUN: %clang_cc1 -fapinotes -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
-// RUN: ls %t/APINotesCache | grep "APINotes-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "SomeKit-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "APINotes.timestamp"
-
-// Set the timestack back a very long time. This should prune the
-// HeaderLib file, because the pruning mechanism should fire and
-// HeaderLib is both old and not used.
-// RUN: touch -m -a -t 201101010000 %t/APINotesCache/APINotes.timestamp
-// RUN: %clang_cc1 -fapinotes -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
-// RUN: ls %t/APINotesCache | not grep "APINotes-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "SomeKit-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "APINotes.timestamp"
-
-// Run Clang. This should generated the cached versions of both and a timestamp.
-// RUN: %clang_cc1 -fapinotes -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DINCLUDE_HEADERLIB
-// RUN: ls %t/APINotesCache | grep "APINotes-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "SomeKit-.*.apinotesc"
-// RUN: ls %t/APINotesCache | grep "APINotes.timestamp"
-
-#ifdef INCLUDE_HEADERLIB
-#include "HeaderLib.h"
-#endif
-#include <SomeKit/SomeKit.h>
-
-int main() { return 0; }
diff --git a/test/APINotes/module-cache.m b/test/APINotes/module-cache.m
index 2324697..19d6a27 100644
--- a/test/APINotes/module-cache.m
+++ b/test/APINotes/module-cache.m
@@ -1,36 +1,46 @@
// RUN: rm -rf %t
-// Set up a directory with API notes
+// Set up directories
// RUN: mkdir -p %t/APINotes
// RUN: cp %S/Inputs/APINotes/SomeOtherKit.apinotes %t/APINotes/SomeOtherKit.apinotes
+// RUN: mkdir -p %t/Frameworks
+// RUN: cp -r %S/Inputs/Frameworks/SomeOtherKit.framework %t/Frameworks
// First build: check that 'methodB' is unavailable but 'methodA' is available.
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/before.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -F %t/Frameworks %s > %t/before.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/before.log
// RUN: FileCheck -check-prefix=CHECK-REBUILD %s < %t/before.log
// RUN: FileCheck -check-prefix=CHECK-ONE-ERROR %s < %t/before.log
// Do it again; now we're using caches.
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/before.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -F %t/Frameworks %s > %t/before.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/before.log
// RUN: FileCheck -check-prefix=CHECK-WITHOUT-REBUILD %s < %t/before.log
// RUN: FileCheck -check-prefix=CHECK-ONE-ERROR %s < %t/before.log
-// Change the API notes file.
+// Add a blank line to the header to force the module to rebuild, without
+// (yet) changing API notes.
+// RUN: echo >> %t/Frameworks/SomeOtherKit.framework/Headers/SomeOtherKit.h
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -F %t/Frameworks %s > %t/before.log 2>&1
+// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/before.log
+// RUN: FileCheck -check-prefix=CHECK-REBUILD %s < %t/before.log
+// RUN: FileCheck -check-prefix=CHECK-ONE-ERROR %s < %t/before.log
+
+// Change the API notes file, after the module has rebuilt once.
// RUN: echo ' - Selector: "methodA"' >> %t/APINotes/SomeOtherKit.apinotes
// RUN: echo ' MethodKind: Instance' >> %t/APINotes/SomeOtherKit.apinotes
// RUN: echo ' Availability: none' >> %t/APINotes/SomeOtherKit.apinotes
// RUN: echo ' AvailabilityMsg: "not here either"' >> %t/APINotes/SomeOtherKit.apinotes
// Build again: check that both methods are now unavailable and that the module rebuilt.
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/after.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -F %t/Frameworks %s > %t/after.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODA %s < %t/after.log
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/after.log
// RUN: FileCheck -check-prefix=CHECK-REBUILD %s < %t/after.log
// RUN: FileCheck -check-prefix=CHECK-TWO-ERRORS %s < %t/after.log
// Run the build again: check that both methods are now unavailable
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/after.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/APINotes -F %t/Frameworks %s > %t/after.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODA %s < %t/after.log
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/after.log
// RUN: FileCheck -check-prefix=CHECK-WITHOUT-REBUILD %s < %t/after.log
@@ -43,13 +53,13 @@
// RUN: %clang -cc1apinotes -yaml-to-binary -o %t/CompiledAPINotes/SomeOtherKit.apinotesc %S/Inputs/APINotes/SomeOtherKit.apinotes
// First build: check that 'methodB' is unavailable but 'methodA' is available.
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/compiled-before.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -F %t/Frameworks %s > %t/compiled-before.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/compiled-before.log
// RUN: FileCheck -check-prefix=CHECK-REBUILD %s < %t/compiled-before.log
// RUN: FileCheck -check-prefix=CHECK-ONE-ERROR %s < %t/compiled-before.log
// Do it again; now we're using caches.
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/compiled-before.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -F %t/Frameworks %s > %t/compiled-before.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/compiled-before.log
// RUN: FileCheck -check-prefix=CHECK-WITHOUT-REBUILD %s < %t/compiled-before.log
// RUN: FileCheck -check-prefix=CHECK-ONE-ERROR %s < %t/compiled-before.log
@@ -58,14 +68,14 @@
// RUN: %clang -cc1apinotes -yaml-to-binary -o %t/CompiledAPINotes/SomeOtherKit.apinotesc %t/APINotes/SomeOtherKit.apinotes
// Build again: check that both methods are now unavailable and that the module rebuilt.
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/compiled-after.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -F %t/Frameworks %s > %t/compiled-after.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODA %s < %t/compiled-after.log
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/compiled-after.log
// RUN: FileCheck -check-prefix=CHECK-REBUILD %s < %t/compiled-after.log
// RUN: FileCheck -check-prefix=CHECK-TWO-ERRORS %s < %t/compiled-after.log
// Run the build again: check that both methods are now unavailable
-// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -fapinotes-cache-path=%t/APINotesCache -F %S/Inputs/Frameworks %s > %t/compiled-after.log 2>&1
+// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -Rmodule-build -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %t/CompiledAPINotes -F %t/Frameworks %s > %t/compiled-after.log 2>&1
// RUN: FileCheck -check-prefix=CHECK-METHODA %s < %t/compiled-after.log
// RUN: FileCheck -check-prefix=CHECK-METHODB %s < %t/compiled-after.log
// RUN: FileCheck -check-prefix=CHECK-WITHOUT-REBUILD %s < %t/compiled-after.log
diff --git a/test/APINotes/nullability.c b/test/APINotes/nullability.c
index 1fcd0ee..e07fc2e 100644
--- a/test/APINotes/nullability.c
+++ b/test/APINotes/nullability.c
@@ -1,5 +1,5 @@
// RUN: rm -rf %t && mkdir -p %t
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
#include "HeaderLib.h"
diff --git a/test/APINotes/nullability.m b/test/APINotes/nullability.m
index f70c363..65c9c2c 100644
--- a/test/APINotes/nullability.m
+++ b/test/APINotes/nullability.m
@@ -1,9 +1,9 @@
// RUN: rm -rf %t && mkdir -p %t
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
// Test with Swift version 3.0. This should only affect the few APIs that have an entry in the 3.0 tables.
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fapinotes-swift-version=3.0 -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify -DSWIFT_VERSION_3_0 -fmodules-ignore-macro=SWIFT_VERSION_3_0
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-swift-version=3.0 -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify -DSWIFT_VERSION_3_0 -fmodules-ignore-macro=SWIFT_VERSION_3_0
#import <SomeKit/SomeKit.h>
diff --git a/test/APINotes/objc_designated_inits.m b/test/APINotes/objc_designated_inits.m
index 1df8cf8..24b317c 100644
--- a/test/APINotes/objc_designated_inits.m
+++ b/test/APINotes/objc_designated_inits.m
@@ -1,5 +1,5 @@
// RUN: rm -rf %t && mkdir -p %t
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
#include "HeaderLib.h"
#import <SomeKit/SomeKit.h>
diff --git a/test/APINotes/properties.m b/test/APINotes/properties.m
index b1559b9..fe3c738 100644
--- a/test/APINotes/properties.m
+++ b/test/APINotes/properties.m
@@ -1,7 +1,7 @@
// RUN: rm -rf %t && mkdir -p %t
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fblocks -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'TestProperties::' | FileCheck -check-prefix=CHECK -check-prefix=CHECK-4 %s
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fblocks -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'TestProperties::' -fapinotes-swift-version=3 | FileCheck -check-prefix=CHECK -check-prefix=CHECK-3 %s
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fblocks -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'TestProperties::' | FileCheck -check-prefix=CHECK -check-prefix=CHECK-4 %s
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fblocks -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'TestProperties::' -fapinotes-swift-version=3 | FileCheck -check-prefix=CHECK -check-prefix=CHECK-3 %s
// I know, FileChecking an AST dump is brittle. However, the attributes being
// tested aren't used for anything by Clang, and don't even have a spelling.
diff --git a/test/APINotes/search-order.m b/test/APINotes/search-order.m
index 2c667be..aa2f21a 100644
--- a/test/APINotes/search-order.m
+++ b/test/APINotes/search-order.m
@@ -1,10 +1,10 @@
// RUN: rm -rf %t && mkdir -p %t
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DFROM_FRAMEWORK=1 -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DFROM_FRAMEWORK=1 -verify
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %S/Inputs/APINotes -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DFROM_SEARCH_PATH=1 -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -iapinotes-modules %S/Inputs/APINotes -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DFROM_SEARCH_PATH=1 -verify
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -iapinotes-modules %S/Inputs/APINotes -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DFROM_FRAMEWORK=1 -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -iapinotes-modules %S/Inputs/APINotes -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -DFROM_FRAMEWORK=1 -verify
@import SomeOtherKit;
diff --git a/test/APINotes/types.m b/test/APINotes/types.m
index 9f8b970..a0f728b 100644
--- a/test/APINotes/types.m
+++ b/test/APINotes/types.m
@@ -1,5 +1,5 @@
// RUN: rm -rf %t && mkdir -p %t
-// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fdisable-module-hash -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
+// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache -fapinotes-modules -fdisable-module-hash -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -verify
// RUN: %clang_cc1 -ast-print %t/ModulesCache/SimpleKit.pcm | FileCheck %s
#import <SomeKit/SomeKit.h>
diff --git a/test/APINotes/versioned.m b/test/APINotes/versioned.m
index 5657ae1..2f85735 100644
--- a/test/APINotes/versioned.m
+++ b/test/APINotes/versioned.m
@@ -1,14 +1,14 @@
// RUN: rm -rf %t && mkdir -p %t
// Build and check the unversioned module file.
-// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Unversioned -fdisable-module-hash -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
+// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Unversioned -fdisable-module-hash -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
// RUN: %clang_cc1 -ast-print %t/ModulesCache/Unversioned/VersionedKit.pcm | FileCheck -check-prefix=CHECK-UNVERSIONED %s
-// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Unversioned -fdisable-module-hash -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'DUMP' | FileCheck -check-prefix=CHECK-DUMP -check-prefix=CHECK-UNVERSIONED-DUMP %s
+// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Unversioned -fdisable-module-hash -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'DUMP' | FileCheck -check-prefix=CHECK-DUMP -check-prefix=CHECK-UNVERSIONED-DUMP %s
// Build and check the versioned module file.
-// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Versioned -fdisable-module-hash -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fapinotes-swift-version=3 -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
+// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Versioned -fdisable-module-hash -fapinotes-modules -fapinotes-swift-version=3 -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
// RUN: %clang_cc1 -ast-print %t/ModulesCache/Versioned/VersionedKit.pcm | FileCheck -check-prefix=CHECK-VERSIONED %s
-// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Versioned -fdisable-module-hash -fapinotes-modules -fapinotes-cache-path=%t/APINotesCache -fapinotes-swift-version=3 -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'DUMP' | FileCheck -check-prefix=CHECK-DUMP -check-prefix=CHECK-VERSIONED-DUMP %s
+// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Versioned -fdisable-module-hash -fapinotes-modules -fapinotes-swift-version=3 -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'DUMP' | FileCheck -check-prefix=CHECK-DUMP -check-prefix=CHECK-VERSIONED-DUMP %s
#import <VersionedKit/VersionedKit.h>
diff --git a/test/APINotes/yaml-convert-diags.c b/test/APINotes/yaml-convert-diags.c
index e8767f2..8d5c0fb 100644
--- a/test/APINotes/yaml-convert-diags.c
+++ b/test/APINotes/yaml-convert-diags.c
@@ -1,5 +1,5 @@
// RUN: rm -rf %t
-// RUN: not %clang_cc1 -fsyntax-only -fapinotes -fapinotes-cache-path=%t %s -I %S/Inputs/BrokenHeaders2 2>&1 | FileCheck %s
+// RUN: not %clang_cc1 -fsyntax-only -fapinotes %s -I %S/Inputs/BrokenHeaders2 2>&1 | FileCheck %s
#include "SomeBrokenLib.h"
diff --git a/test/APINotes/yaml-parse-diags.c b/test/APINotes/yaml-parse-diags.c
index 4505e29..a7b370a 100644
--- a/test/APINotes/yaml-parse-diags.c
+++ b/test/APINotes/yaml-parse-diags.c
@@ -1,5 +1,5 @@
// RUN: rm -rf %t
-// RUN: %clang_cc1 -fsyntax-only -fapinotes -fapinotes-cache-path=%t %s -I %S/Inputs/BrokenHeaders -verify
+// RUN: %clang_cc1 -fsyntax-only -fapinotes %s -I %S/Inputs/BrokenHeaders -verify
#include "SomeBrokenLib.h"