forked from OSchip/llvm-project
<rdar://problem/13615607> Include SDK version information in the module hash.
This is a Darwin-SDK-specific hash criteria used to identify a particular SDK without having to hash the contents of all of its headers. If other platforms have such versioned files, we should add those checks here. llvm-svn: 179346
This commit is contained in:
parent
ecf1320579
commit
c9be4734d6
|
@ -29,6 +29,7 @@
|
|||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/Host.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/system_error.h"
|
||||
using namespace clang;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1696,5 +1697,21 @@ std::string CompilerInvocation::getModuleHash() const {
|
|||
hsOpts.UseStandardCXXIncludes,
|
||||
hsOpts.UseLibcxx);
|
||||
|
||||
// Darwin-specific hack: if we have a sysroot, use the contents of
|
||||
// $sysroot/System/Library/CoreServices/SystemVersion.plist
|
||||
// as part of the module hash.
|
||||
if (!hsOpts.Sysroot.empty()) {
|
||||
llvm::OwningPtr<llvm::MemoryBuffer> buffer;
|
||||
SmallString<128> systemVersionFile;
|
||||
systemVersionFile += hsOpts.Sysroot;
|
||||
llvm::sys::path::append(systemVersionFile, "System");
|
||||
llvm::sys::path::append(systemVersionFile, "Library");
|
||||
llvm::sys::path::append(systemVersionFile, "CoreServices");
|
||||
llvm::sys::path::append(systemVersionFile, "SystemVersion.plist");
|
||||
if (!llvm::MemoryBuffer::getFile(systemVersionFile, buffer)) {
|
||||
code = hash_combine(code, buffer.get()->getBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
return llvm::APInt(64, code).toString(36, /*Signed=*/false);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
// Test checking that we're hashing a system version file in the
|
||||
// module hash.
|
||||
// REQUIRES: shell
|
||||
|
||||
// First, build a system root.
|
||||
// RUN: rm -rf %t
|
||||
// RUN: mkdir -p %t/usr/include
|
||||
// RUN: cp %S/Inputs/Modified/A.h %t/usr/include
|
||||
// RUN: cp %S/Inputs/Modified/B.h %t/usr/include
|
||||
// RUN: cp %S/Inputs/Modified/module.map %t/usr/include
|
||||
|
||||
// Run once with no system version file. We should end up with one module.
|
||||
// RUN: %clang_cc1 -fmodules-cache-path=%t/cache -fmodules -isysroot %t %s -verify
|
||||
// RUN: ls -R %t | grep -c ModA.pcm| grep 1
|
||||
|
||||
// Add a system version file and run again. We should now have two
|
||||
// module variants.
|
||||
// RUN: mkdir -p %t/System/Library/CoreServices
|
||||
// RUN: echo "hello" > %t/System/Library/CoreServices/SystemVersion.plist
|
||||
// RUN: %clang_cc1 -fmodules-cache-path=%t/cache -fmodules -isysroot %t %s -verify
|
||||
// RUN: ls -R %t | grep -c ModA.pcm| grep 2
|
||||
|
||||
// Change the system version file and run again. We should now have three
|
||||
// module variants.
|
||||
// RUN: mkdir -p %t/System/Library/CoreServices
|
||||
// RUN: echo "modules" > %t/System/Library/CoreServices/SystemVersion.plist
|
||||
// RUN: %clang_cc1 -fmodules-cache-path=%t/cache -fmodules -isysroot %t %s -verify
|
||||
// RUN: ls -R %t | grep -c ModA.pcm| grep 3
|
||||
|
||||
// expected-no-diagnostics
|
||||
@import ModA;
|
||||
|
Loading…
Reference in New Issue