forked from OSchip/llvm-project
Make modules depend on the compiler's own module.map, as a proxy for the compiler itself.
The headers in the compiler's own resource include directory are system headers, which means we don't stat() them eagerly when loading a module. Use module.map as a proxy for these headers and the compiler itself. Fixes <rdar://problem/13856838>. llvm-svn: 186870
This commit is contained in:
parent
998bcf9534
commit
a3dd900c71
|
@ -424,7 +424,8 @@ private:
|
|||
StringRef isysroot, const std::string &OutputFile);
|
||||
void WriteInputFiles(SourceManager &SourceMgr,
|
||||
HeaderSearchOptions &HSOpts,
|
||||
StringRef isysroot);
|
||||
StringRef isysroot,
|
||||
bool Modules);
|
||||
void WriteSourceManagerBlock(SourceManager &SourceMgr,
|
||||
const Preprocessor &PP,
|
||||
StringRef isysroot);
|
||||
|
|
|
@ -1233,7 +1233,8 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context,
|
|||
|
||||
WriteInputFiles(Context.SourceMgr,
|
||||
PP.getHeaderSearchInfo().getHeaderSearchOpts(),
|
||||
isysroot);
|
||||
isysroot,
|
||||
PP.getLangOpts().Modules);
|
||||
Stream.ExitBlock();
|
||||
}
|
||||
|
||||
|
@ -1248,7 +1249,8 @@ namespace {
|
|||
|
||||
void ASTWriter::WriteInputFiles(SourceManager &SourceMgr,
|
||||
HeaderSearchOptions &HSOpts,
|
||||
StringRef isysroot) {
|
||||
StringRef isysroot,
|
||||
bool Modules) {
|
||||
using namespace llvm;
|
||||
Stream.EnterSubblock(INPUT_FILES_BLOCK_ID, 4);
|
||||
RecordData Record;
|
||||
|
@ -1302,6 +1304,19 @@ void ASTWriter::WriteInputFiles(SourceManager &SourceMgr,
|
|||
}
|
||||
}
|
||||
|
||||
// Add the compiler's own module.map in the set of (non-system) input files.
|
||||
// This is a simple heuristic for detecting whether the compiler's headers
|
||||
// have changed, because we don't want to stat() all of them.
|
||||
if (Modules && !Chain) {
|
||||
SmallString<128> P = StringRef(HSOpts.ResourceDir);
|
||||
llvm::sys::path::append(P, "include");
|
||||
llvm::sys::path::append(P, "module.map");
|
||||
if (const FileEntry *ModuleMapFile = FileMgr.getFile(P)) {
|
||||
InputFileEntry Entry = { ModuleMapFile, false, false };
|
||||
SortedFiles.push_front(Entry);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned UserFilesNum = 0;
|
||||
// Write out all of the input files.
|
||||
std::vector<uint32_t> InputFileOffsets;
|
||||
|
|
Loading…
Reference in New Issue