Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions clang/lib/Serialization/ModuleManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,12 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type,
// Look for the file entry. This only fails if the expected size or
// modification time differ.
OptionalFileEntryRef Entry;
const bool IgnoreModTime =
(Type == MK_ExplicitModule || Type == MK_PrebuiltModule);
bool IgnoreModTime = Type == MK_ExplicitModule || Type == MK_PrebuiltModule;
if (ImportedBy)
IgnoreModTime &= ImportedBy->Kind == MK_ExplicitModule ||
ImportedBy->Kind == MK_PrebuiltModule;
if (IgnoreModTime) {
// If we're not expecting to pull this file out of the module cache, it
// If neither this file nor the importer are in the module cache, this file
// might have a different mtime due to being moved across filesystems in
// a distributed build. The size must still match, though. (As must the
// contents, but we can't check that.)
Expand Down
77 changes: 77 additions & 0 deletions clang/test/ClangScanDeps/modules-pch-common-stale.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Test that modifications to a common header (imported from both a PCH and a TU)
// cause rebuilds of dependent modules imported from the TU on incremental build.

// RUN: rm -rf %t
// RUN: split-file %s %t

//--- module.modulemap
module mod_common { header "mod_common.h" }
module mod_tu { header "mod_tu.h" }
module mod_tu_extra { header "mod_tu_extra.h" }

//--- mod_common.h
#define MOD_COMMON_MACRO 0

//--- mod_tu.h
#include "mod_common.h"
#if MOD_COMMON_MACRO
#include "mod_tu_extra.h"
#endif

//--- mod_tu_extra.h

//--- prefix.h
#include "mod_common.h"

//--- tu.c
#include "mod_tu.h"

// Clean: scan the PCH.
// RUN: clang-scan-deps -format experimental-full -o %t/deps_pch.json -- \
// RUN: %clang -x c-header %t/prefix.h -o %t/prefix.h.pch -F %t \
// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache

// Clean: build the PCH.
// RUN: %deps-to-rsp %t/deps_pch.json --module-name mod_common > %t/mod_common.rsp
// RUN: %deps-to-rsp %t/deps_pch.json --tu-index 0 > %t/pch.rsp
// RUN: %clang @%t/mod_common.rsp
// RUN: %clang @%t/pch.rsp

// Clean: scan the TU.
// RUN: clang-scan-deps -format experimental-full -o %t/deps_tu.json -- \
// RUN: %clang -c %t/tu.c -o %t/tu.o -include %t/prefix.h -F %t \
// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache

// Clean: build the TU.
// RUN: %deps-to-rsp %t/deps_tu.json --module-name mod_tu > %t/mod_tu.rsp
// RUN: %deps-to-rsp %t/deps_tu.json --tu-index 0 > %t/tu.rsp
// RUN: %clang @%t/mod_tu.rsp
// RUN: %clang @%t/tu.rsp

// Incremental: modify the common module.
// RUN: echo "#define MOD_COMMON_MACRO 1" > %t/mod_common.h

// Incremental: scan the PCH.
// RUN: clang-scan-deps -format experimental-full -o %t/deps_pch.json -- \
// RUN: %clang -x c-header %t/prefix.h -o %t/prefix.h.pch -F %t \
// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache

// Incremental: build the PCH.
// RUN: %deps-to-rsp %t/deps_pch.json --module-name mod_common > %t/mod_common.rsp
// RUN: %deps-to-rsp %t/deps_pch.json --tu-index 0 > %t/pch.rsp
// RUN: %clang @%t/mod_common.rsp
// RUN: %clang @%t/pch.rsp

// Incremental: scan the TU. This needs to invalidate modules imported from the
// TU that depend on modules imported from the PCH.
// RUN: clang-scan-deps -format experimental-full -o %t/deps_tu.json -- \
// RUN: %clang -c %t/tu.c -o %t/tu.o -include %t/prefix.h -F %t \
// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache

// Incremental: build the TU.
// RUN: %deps-to-rsp %t/deps_tu.json --module-name mod_tu_extra > %t/mod_tu_extra.rsp
// RUN: %deps-to-rsp %t/deps_tu.json --module-name mod_tu > %t/mod_tu.rsp
// RUN: %deps-to-rsp %t/deps_tu.json --tu-index 0 > %t/tu.rsp
// RUN: %clang @%t/mod_tu_extra.rsp
// RUN: %clang @%t/mod_tu.rsp
// RUN: %clang @%t/tu.rsp
Loading