aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/CompilerInstance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Frontend/CompilerInstance.cpp')
-rw-r--r--lib/Frontend/CompilerInstance.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp
index ece9cd8406..720f7bb582 100644
--- a/lib/Frontend/CompilerInstance.cpp
+++ b/lib/Frontend/CompilerInstance.cpp
@@ -221,6 +221,15 @@ void CompilerInstance::createPreprocessor() {
InitializePreprocessor(*PP, PPOpts, getHeaderSearchOpts(), getFrontendOpts());
+ // Set up the module path, including the hash for the
+ // module-creation options.
+ llvm::SmallString<256> SpecificModuleCache(
+ getHeaderSearchOpts().ModuleCachePath);
+ if (!getHeaderSearchOpts().DisableModuleHash)
+ llvm::sys::path::append(SpecificModuleCache,
+ getInvocation().getModuleHash());
+ PP->getHeaderSearchInfo().setModuleCachePath(SpecificModuleCache);
+
// Handle generating dependencies, if requested.
const DependencyOutputOptions &DepOpts = getDependencyOutputOpts();
if (!DepOpts.OutputFile.empty())
@@ -644,13 +653,8 @@ static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) {
/// instance.
static void compileModule(CompilerInstance &ImportingInstance,
StringRef ModuleName,
+ StringRef ModuleFileName,
StringRef UmbrellaHeader) {
- // Determine the file that we'll be writing to.
- llvm::SmallString<128> ModuleFile;
- ModuleFile +=
- ImportingInstance.getInvocation().getHeaderSearchOpts().ModuleCachePath;
- llvm::sys::path::append(ModuleFile, ModuleName + ".pcm");
-
// Construct a compiler invocation for creating this module.
llvm::IntrusiveRefCntPtr<CompilerInvocation> Invocation
(new CompilerInvocation(ImportingInstance.getInvocation()));
@@ -658,7 +662,7 @@ static void compileModule(CompilerInstance &ImportingInstance,
Invocation->getPreprocessorOpts().resetNonModularOptions();
FrontendOptions &FrontendOpts = Invocation->getFrontendOpts();
- FrontendOpts.OutputFile = ModuleFile.str();
+ FrontendOpts.OutputFile = ModuleFileName.str();
FrontendOpts.DisableFree = false;
FrontendOpts.Inputs.clear();
FrontendOpts.Inputs.push_back(
@@ -686,10 +690,6 @@ static void compileModule(CompilerInstance &ImportingInstance,
// FIXME: Need to synchronize when multiple processes do this.
Instance.ExecuteAction(CreateModuleAction);
- // Tell the importing instance's file manager to forget about the module
- // file, since we've just created it.
- ImportingInstance.getFileManager().forgetFile(ModuleFile);
-
// Tell the diagnostic client that it's (re-)starting to process a source
// file.
ImportingInstance.getDiagnosticClient()
@@ -710,8 +710,10 @@ ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc,
// Search for a module with the given name.
std::string UmbrellaHeader;
+ std::string ModuleFileName;
const FileEntry *ModuleFile
= PP->getHeaderSearchInfo().lookupModule(ModuleName.getName(),
+ &ModuleFileName,
&UmbrellaHeader);
bool BuildingModule = false;
@@ -720,7 +722,7 @@ ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc,
// can be used to create the module file. Create a separate compilation
// module to do so.
BuildingModule = true;
- compileModule(*this, ModuleName.getName(), UmbrellaHeader);
+ compileModule(*this, ModuleName.getName(), ModuleFileName, UmbrellaHeader);
ModuleFile = PP->getHeaderSearchInfo().lookupModule(ModuleName.getName());
}