From: Ben Langmuir Date: Sat, 8 Nov 2014 00:34:30 +0000 (+0000) Subject: Check module signature when the module has already been loaded X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=15e9ab9303981c49c238da1aaec6ba273ea3c893;p=clang Check module signature when the module has already been loaded We may need to verify the signature on subsequent imports as well, just like we verify the size/modtime: @import A; @import B; // imports A @import C; // imports A git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221569 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ModuleManager.cpp b/lib/Serialization/ModuleManager.cpp index 3baaa0a4b2..b5ee414502 100644 --- a/lib/Serialization/ModuleManager.cpp +++ b/lib/Serialization/ModuleManager.cpp @@ -132,21 +132,27 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type, // Initialize the stream New->StreamFile.init((const unsigned char *)New->Buffer->getBufferStart(), (const unsigned char *)New->Buffer->getBufferEnd()); + } + + if (ExpectedSignature) { + if (NewModule) + ModuleEntry->Signature = ReadSignature(ModuleEntry->StreamFile); + else + assert(ModuleEntry->Signature == ReadSignature(ModuleEntry->StreamFile)); - if (ExpectedSignature) { - New->Signature = ReadSignature(New->StreamFile); - if (New->Signature != ExpectedSignature) { - ErrorStr = New->Signature ? "signature mismatch" - : "could not read module signature"; + if (ModuleEntry->Signature != ExpectedSignature) { + ErrorStr = ModuleEntry->Signature ? "signature mismatch" + : "could not read module signature"; + if (NewModule) { // Remove the module file immediately, since removeModules might try to // invalidate the file cache for Entry, and that is not safe if this // module is *itself* up to date, but has an out-of-date importer. Modules.erase(Entry); Chain.pop_back(); - delete New; - return OutOfDate; + delete ModuleEntry; } + return OutOfDate; } } diff --git a/test/Modules/rebuild.m b/test/Modules/rebuild.m index 53a1fff90b..4d4d05529e 100644 --- a/test/Modules/rebuild.m +++ b/test/Modules/rebuild.m @@ -25,4 +25,21 @@ // RUN: diff %t/Module.pcm %t/Module.pcm.saved.2 // RUN: not diff %t/DependsOnModule.pcm %t/DependsOnModule.pcm.saved +// Rebuild Module, reset its timestamp, and verify its size hasn't changed +// RUN: rm %t/Module.pcm +// RUN: echo '@import Module;' | %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash -fsyntax-only -F %S/Inputs -x objective-c - +// RUN: touch -m -a -t 201101010000 %t/Module.pcm +// RUN: wc -c %t/Module.pcm > %t/Module.size +// RUN: diff %t/Module.size %t/Module.size.saved +// RUN: cp %t/Module.pcm %t/Module.pcm.saved.2 + +// Verify again with Module pre-imported. +// NOTE: if we change how the signature is created, this test may need updating. +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash -fsyntax-only -F %S/Inputs %s +// RUN: diff %t/Module.pcm %t/Module.pcm.saved.2 +// RUN: not diff %t/DependsOnModule.pcm %t/DependsOnModule.pcm.saved + +#ifdef PREIMPORT +@import Module; +#endif @import DependsOnModule;