From: Douglas Gregor Date: Tue, 13 Sep 2011 23:15:45 +0000 (+0000) Subject: For modules, use a hash of the compiler version, language options, and X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e975c4517958bcc11c834336d340797356058db;p=clang For modules, use a hash of the compiler version, language options, and target triple to separate modules built under different conditions. The hash is used to create a subdirectory in the module cache path where other invocations of the compiler (with the same version, language options, etc.) can find the precompiled modules. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139662 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/FileManager.h b/include/clang/Basic/FileManager.h index 826859fb50..ea8ed9f02f 100644 --- a/include/clang/Basic/FileManager.h +++ b/include/clang/Basic/FileManager.h @@ -179,18 +179,21 @@ public: /// getDirectory - Lookup, cache, and verify the specified directory /// (real or virtual). This returns NULL if the directory doesn't exist. /// - const DirectoryEntry *getDirectory(StringRef DirName); + /// \param CacheFailure If true and the file does not exist, we'll cache + /// the failure to find this file. + const DirectoryEntry *getDirectory(StringRef DirName, + bool CacheFailure = true); /// \brief Lookup, cache, and verify the specified file (real or /// virtual). This returns NULL if the file doesn't exist. /// - /// \param openFile if true and the file exists, it will be opened. - const FileEntry *getFile(StringRef Filename, bool openFile = false); + /// \param OpenFile if true and the file exists, it will be opened. + /// + /// \param CacheFailure If true and the file does not exist, we'll cache + /// the failure to find this file. + const FileEntry *getFile(StringRef Filename, bool OpenFile = false, + bool CacheFailure = true); - /// \brief Forget any information about the given file name, because (for - /// example) something within this process has changed the file in some way. - void forgetFile(StringRef Filename); - /// \brief Returns the current file system options const FileSystemOptions &getFileSystemOptions() { return FileSystemOpts; } diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index e3d79ac385..9969abb600 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -608,7 +608,9 @@ def nobuiltininc : Flag<"-nobuiltininc">, def fmodule_cache_path : JoinedOrSeparate<"-fmodule-cache-path">, MetaVarName<"">, HelpText<"Specify the module cache path">; - +def fdisable_module_hash : Flag<"-fdisable-module-hash">, + HelpText<"Disable the module hash">; + def F : JoinedOrSeparate<"-F">, MetaVarName<"">, HelpText<"Add directory to framework include search path">; def I : JoinedOrSeparate<"-I">, MetaVarName<"">, diff --git a/include/clang/Frontend/CompilerInvocation.h b/include/clang/Frontend/CompilerInvocation.h index 23ddc84304..f09c97ec3f 100644 --- a/include/clang/Frontend/CompilerInvocation.h +++ b/include/clang/Frontend/CompilerInvocation.h @@ -123,6 +123,10 @@ public: static void setLangDefaults(LangOptions &Opts, InputKind IK, LangStandard::Kind LangStd = LangStandard::lang_unspecified); + /// \brief Retrieve a module hash string that is suitable for uniquely + /// identifying the conditions under which the module was built. + std::string getModuleHash() const; + /// @} /// @name Option Subgroups /// @{ diff --git a/include/clang/Frontend/HeaderSearchOptions.h b/include/clang/Frontend/HeaderSearchOptions.h index a81a0cb992..e0f80e3bdf 100644 --- a/include/clang/Frontend/HeaderSearchOptions.h +++ b/include/clang/Frontend/HeaderSearchOptions.h @@ -78,6 +78,12 @@ public: /// \brief The directory used for the module cache. std::string ModuleCachePath; + /// \brief Whether we should disable the use of the hash string within the + /// module cache. + /// + /// Note: Only used for testing! + unsigned DisableModuleHash : 1; + /// Include the compiler builtin includes. unsigned UseBuiltinIncludes : 1; @@ -95,7 +101,7 @@ public: public: HeaderSearchOptions(StringRef _Sysroot = "/") - : Sysroot(_Sysroot), UseBuiltinIncludes(true), + : Sysroot(_Sysroot), DisableModuleHash(0), UseBuiltinIncludes(true), UseStandardIncludes(true), UseStandardCXXIncludes(true), UseLibcxx(false), Verbose(false) {} diff --git a/include/clang/Frontend/PreprocessorOptions.h b/include/clang/Frontend/PreprocessorOptions.h index 3df6512600..4065ae6ff6 100644 --- a/include/clang/Frontend/PreprocessorOptions.h +++ b/include/clang/Frontend/PreprocessorOptions.h @@ -195,10 +195,17 @@ public: /// module. void resetNonModularOptions() { Macros.clear(); + Includes.clear(); + Modules.clear(); MacroIncludes.clear(); + ChainedIncludes.clear(); DumpDeserializedPCHDecls = false; + ImplicitPCHInclude.clear(); + ImplicitPTHInclude.clear(); TokenCache.clear(); RetainRemappedFileBuffers = true; + PrecompiledPreambleBytes.first = 0; + PrecompiledPreambleBytes.second = 0; } }; diff --git a/include/clang/Lex/HeaderSearch.h b/include/clang/Lex/HeaderSearch.h index 74c1080df8..86aa7c974a 100644 --- a/include/clang/Lex/HeaderSearch.h +++ b/include/clang/Lex/HeaderSearch.h @@ -319,6 +319,9 @@ public: /// \brief Search in the module cache path for a module with the given /// name. /// + /// \param If non-NULL, will be set to the module file name we expected to + /// find (regardless of whether it was actually found or not). + /// /// \param UmbrellaHeader If non-NULL, and no module was found in the module /// cache, this routine will search in the framework paths to determine /// whether a module can be built from an umbrella header. If so, the pointee @@ -327,6 +330,7 @@ public: /// \returns A file describing the named module, if available, or NULL to /// indicate that the module could not be found. const FileEntry *lookupModule(StringRef ModuleName, + std::string *ModuleFileName = 0, std::string *UmbrellaHeader = 0); void IncrementFrameworkLookupCount() { ++NumFrameworkLookups; } diff --git a/lib/Basic/FileManager.cpp b/lib/Basic/FileManager.cpp index adc9705405..c1f715ed05 100644 --- a/lib/Basic/FileManager.cpp +++ b/lib/Basic/FileManager.cpp @@ -217,7 +217,8 @@ void FileManager::removeStatCache(FileSystemStatCache *statCache) { /// \brief Retrieve the directory that the given file name resides in. /// Filename can point to either a real file or a virtual file. static const DirectoryEntry *getDirectoryFromFile(FileManager &FileMgr, - StringRef Filename) { + StringRef Filename, + bool CacheFailure) { if (Filename.empty()) return NULL; @@ -229,7 +230,7 @@ static const DirectoryEntry *getDirectoryFromFile(FileManager &FileMgr, if (DirName.empty()) DirName = "."; - return FileMgr.getDirectory(DirName); + return FileMgr.getDirectory(DirName, CacheFailure); } /// Add all ancestors of the given path (pointing to either a file or @@ -263,7 +264,8 @@ void FileManager::addAncestorsAsVirtualDirs(StringRef Path) { /// (real or virtual). This returns NULL if the directory doesn't /// exist. /// -const DirectoryEntry *FileManager::getDirectory(StringRef DirName) { +const DirectoryEntry *FileManager::getDirectory(StringRef DirName, + bool CacheFailure) { ++NumDirLookups; llvm::StringMapEntry &NamedDirEnt = SeenDirEntries.GetOrCreateValue(DirName); @@ -287,6 +289,8 @@ const DirectoryEntry *FileManager::getDirectory(StringRef DirName) { struct stat StatBuf; if (getStatValue(InterndDirName, StatBuf, 0/*directory lookup*/)) { // There's no real directory at the given path. + if (!CacheFailure) + SeenDirEntries.erase(DirName); return 0; } @@ -309,7 +313,8 @@ const DirectoryEntry *FileManager::getDirectory(StringRef DirName) { /// getFile - Lookup, cache, and verify the specified file (real or /// virtual). This returns NULL if the file doesn't exist. /// -const FileEntry *FileManager::getFile(StringRef Filename, bool openFile) { +const FileEntry *FileManager::getFile(StringRef Filename, bool openFile, + bool CacheFailure) { ++NumFileLookups; // See if there is already an entry in the map. @@ -335,10 +340,15 @@ const FileEntry *FileManager::getFile(StringRef Filename, bool openFile) { // subdirectory. This will let us avoid having to waste time on known-to-fail // searches when we go to find sys/bar.h, because all the search directories // without a 'sys' subdir will get a cached failure result. - const DirectoryEntry *DirInfo = getDirectoryFromFile(*this, Filename); - if (DirInfo == 0) // Directory doesn't exist, file can't exist. + const DirectoryEntry *DirInfo = getDirectoryFromFile(*this, Filename, + CacheFailure); + if (DirInfo == 0) { // Directory doesn't exist, file can't exist. + if (!CacheFailure) + SeenFileEntries.erase(Filename); + return 0; - + } + // FIXME: Use the directory info to prune this, before doing the stat syscall. // FIXME: This will reduce the # syscalls. @@ -347,6 +357,9 @@ const FileEntry *FileManager::getFile(StringRef Filename, bool openFile) { struct stat StatBuf; if (getStatValue(InterndFileName, StatBuf, &FileDescriptor)) { // There's no real file at the given path. + if (!CacheFailure) + SeenFileEntries.erase(Filename); + return 0; } @@ -380,10 +393,6 @@ const FileEntry *FileManager::getFile(StringRef Filename, bool openFile) { return &UFE; } -void FileManager::forgetFile(StringRef Filename) { - SeenFileEntries.erase(Filename); -} - const FileEntry * FileManager::getVirtualFile(StringRef Filename, off_t Size, time_t ModificationTime) { @@ -408,7 +417,8 @@ FileManager::getVirtualFile(StringRef Filename, off_t Size, // Now that all ancestors of Filename are in the cache, the // following call is guaranteed to find the DirectoryEntry from the // cache. - const DirectoryEntry *DirInfo = getDirectoryFromFile(*this, Filename); + const DirectoryEntry *DirInfo = getDirectoryFromFile(*this, Filename, + /*CacheFailure=*/true); assert(DirInfo && "The directory of a virtual file should already be in the cache."); 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 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()); } diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 6c999caf24..6c47d7b114 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1383,6 +1383,7 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { Opts.UseLibcxx = (strcmp(A->getValue(Args), "libc++") == 0); Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir); Opts.ModuleCachePath = Args.getLastArgValue(OPT_fmodule_cache_path); + Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash); // Add -I..., -F..., and -index-header-map options in order. bool IsIndexHeaderMap = false; @@ -1914,3 +1915,84 @@ void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args); ParseTargetArgs(Res.getTargetOpts(), *Args); } + +namespace { + + class ModuleSignature { + llvm::SmallVector Data; + unsigned CurBit; + uint64_t CurValue; + + public: + ModuleSignature() : CurBit(0), CurValue(0) { } + + void add(uint64_t Value, unsigned Bits); + void add(StringRef Value); + void flush(); + + llvm::APInt getAsInteger() const; + }; +} + +void ModuleSignature::add(uint64_t Value, unsigned int NumBits) { + CurValue |= Value << CurBit; + if (CurBit + NumBits < 64) { + CurBit += NumBits; + return; + } + + // Add the current word. + Data.push_back(CurValue); + + if (CurBit) + CurValue = Value >> (64-CurBit); + else + CurValue = 0; + CurBit = (CurBit+NumBits) & 63; +} + +void ModuleSignature::flush() { + if (CurBit == 0) + return; + + Data.push_back(CurValue); + CurBit = 0; + CurValue = 0; +} + +void ModuleSignature::add(StringRef Value) { + for (StringRef::iterator I = Value.begin(), IEnd = Value.end(); I != IEnd;++I) + add(*I, 8); +} + +llvm::APInt ModuleSignature::getAsInteger() const { + return llvm::APInt(Data.size() * 64, Data); +} + +std::string CompilerInvocation::getModuleHash() const { + ModuleSignature Signature; + + // Start the signature with the compiler version. + Signature.add(getClangFullRepositoryVersion()); + + // Extend the signature with the language options +#define LANGOPT(Name, Bits, Default, Description) \ + Signature.add(LangOpts.Name, Bits); +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + Signature.add(static_cast(LangOpts.get##Name()), Bits); +#define BENIGN_LANGOPT(Name, Bits, Default, Description) +#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) +#include "clang/Basic/LangOptions.def" + + // Extend the signature with the target triple + llvm::Triple T(TargetOpts.Triple); + Signature.add((unsigned)T.getArch(), 5); + Signature.add((unsigned)T.getVendor(), 4); + Signature.add((unsigned)T.getOS(), 5); + Signature.add((unsigned)T.getEnvironment(), 4); + + // We've generated the signature. Treat it as one large APInt that we'll + // encode as hex and return. + Signature.flush(); + return Signature.getAsInteger().toString(16, /*Signed=*/false); +} diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp index 05152a77b2..08af532267 100644 --- a/lib/Frontend/InitHeaderSearch.cpp +++ b/lib/Frontend/InitHeaderSearch.cpp @@ -1161,7 +1161,5 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS, if (HSOpts.UseStandardIncludes) Init.AddDefaultSystemIncludePaths(Lang, Triple, HSOpts); - HS.setModuleCachePath(HSOpts.ModuleCachePath); - Init.Realize(Lang); } diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp index 5cf65cbb0d..bc18d0dba7 100644 --- a/lib/Lex/HeaderSearch.cpp +++ b/lib/Lex/HeaderSearch.cpp @@ -99,15 +99,24 @@ const HeaderMap *HeaderSearch::CreateHeaderMap(const FileEntry *FE) { } const FileEntry *HeaderSearch::lookupModule(StringRef ModuleName, + std::string *ModuleFileName, std::string *UmbrellaHeader) { // If we don't have a module cache path, we can't do anything. - if (ModuleCachePath.empty()) + if (ModuleCachePath.empty()) { + if (ModuleFileName) + ModuleFileName->clear(); return 0; - + } + // Try to find the module path. llvm::SmallString<256> FileName(ModuleCachePath); llvm::sys::path::append(FileName, ModuleName + ".pcm"); - if (const FileEntry *ModuleFile = getFileMgr().getFile(FileName)) + if (ModuleFileName) + *ModuleFileName = FileName.str(); + + if (const FileEntry *ModuleFile + = getFileMgr().getFile(FileName, /*OpenFile=*/false, + /*CacheFailure=*/false)) return ModuleFile; // We didn't find the module. If we're not supposed to look for an diff --git a/test/Modules/diamond.c b/test/Modules/diamond.c index 13389e2b6a..482836c449 100644 --- a/test/Modules/diamond.c +++ b/test/Modules/diamond.c @@ -21,7 +21,7 @@ void test_diamond(int i, float f, double d, char c) { } // RUN: %clang_cc1 -emit-module -o %T/diamond_top.pcm %S/Inputs/diamond_top.h -// RUN: %clang_cc1 -fmodule-cache-path %T -emit-module -o %T/diamond_left.pcm %S/Inputs/diamond_left.h -// RUN: %clang_cc1 -fmodule-cache-path %T -emit-module -o %T/diamond_right.pcm %S/Inputs/diamond_right.h -// RUN: %clang_cc1 -fmodule-cache-path %T -emit-module -o %T/diamond_bottom.pcm %S/Inputs/diamond_bottom.h -// RUN: %clang_cc1 -fmodule-cache-path %T %s -verify +// RUN: %clang_cc1 -fmodule-cache-path %T -fdisable-module-hash -emit-module -o %T/diamond_left.pcm %S/Inputs/diamond_left.h +// RUN: %clang_cc1 -fmodule-cache-path %T -fdisable-module-hash -emit-module -o %T/diamond_right.pcm %S/Inputs/diamond_right.h +// RUN: %clang_cc1 -fmodule-cache-path %T -fdisable-module-hash -emit-module -o %T/diamond_bottom.pcm %S/Inputs/diamond_bottom.h +// RUN: %clang_cc1 -fmodule-cache-path %T -fdisable-module-hash %s -verify diff --git a/test/Modules/load_failure.c b/test/Modules/load_failure.c index 55e3d40a3f..d16bba7628 100644 --- a/test/Modules/load_failure.c +++ b/test/Modules/load_failure.c @@ -7,10 +7,10 @@ __import_module__ load_failure; #endif // RUN: %clang_cc1 -x c++ -emit-module -o %T/load_failure.pcm %S/Inputs/load_failure.h -// RUN: %clang_cc1 -fmodule-cache-path %T %s -DNONEXISTENT 2>&1 | FileCheck -check-prefix=CHECK-NONEXISTENT %s +// RUN: %clang_cc1 -fmodule-cache-path %T -fdisable-module-hash %s -DNONEXISTENT 2>&1 | FileCheck -check-prefix=CHECK-NONEXISTENT %s // CHECK-NONEXISTENT: load_failure.c:2:19: fatal error: module 'load_nonexistent' not found -// RUN: not %clang_cc1 -fmodule-cache-path %T %s -DFAILURE 2> %t +// RUN: not %clang_cc1 -fmodule-cache-path %T -fdisable-module-hash %s -DFAILURE 2> %t // RUN: FileCheck -check-prefix=CHECK-FAILURE %s < %t // FIXME: Clean up diagnostic text below and give it a location diff --git a/test/Modules/lookup.cpp b/test/Modules/lookup.cpp index c8f7993540..d3245f2935 100644 --- a/test/Modules/lookup.cpp +++ b/test/Modules/lookup.cpp @@ -16,8 +16,8 @@ void test(int i, float f) { // RUN: %clang_cc1 -emit-module -x c++ -verify -o %T/lookup_left_cxx.pcm %S/Inputs/lookup_left.hpp // RUN: %clang_cc1 -emit-module -x c++ -o %T/lookup_right_cxx.pcm %S/Inputs/lookup_right.hpp -// RUN: %clang_cc1 -x c++ -fmodule-cache-path %T %s -verify -// RUN: %clang_cc1 -ast-print -x c++ -fmodule-cache-path %T %s | FileCheck -check-prefix=CHECK-PRINT %s +// RUN: %clang_cc1 -x c++ -fmodule-cache-path %T -fdisable-module-hash %s -verify +// RUN: %clang_cc1 -ast-print -x c++ -fmodule-cache-path %T -fdisable-module-hash %s | FileCheck -check-prefix=CHECK-PRINT %s // CHECK-PRINT: int *f0(int *); // CHECK-PRINT: float *f0(float *); diff --git a/test/Modules/lookup.m b/test/Modules/lookup.m index ca68e89e0e..d45f93661b 100644 --- a/test/Modules/lookup.m +++ b/test/Modules/lookup.m @@ -10,8 +10,8 @@ void test(id x) { // RUN: %clang_cc1 -emit-module -x objective-c -o %T/lookup_left_objc.pcm %S/Inputs/lookup_left.h // RUN: %clang_cc1 -emit-module -x objective-c -o %T/lookup_right_objc.pcm %S/Inputs/lookup_right.h -// RUN: %clang_cc1 -x objective-c -fmodule-cache-path %T -verify %s -// RUN: %clang_cc1 -ast-print -x objective-c -fmodule-cache-path %T %s | FileCheck -check-prefix=CHECK-PRINT %s +// RUN: %clang_cc1 -x objective-c -fmodule-cache-path %T -fdisable-module-hash -verify %s +// RUN: %clang_cc1 -ast-print -x objective-c -fmodule-cache-path %T -fdisable-module-hash %s | FileCheck -check-prefix=CHECK-PRINT %s // CHECK-PRINT: - (int) method; // CHECK-PRINT: - (double) method diff --git a/test/Modules/macros.c b/test/Modules/macros.c index 346f91f221..578e09fbda 100644 --- a/test/Modules/macros.c +++ b/test/Modules/macros.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -emit-module -o %t/macros.pcm -DMODULE %s -// RUN: %clang_cc1 -verify -fmodule-cache-path %t %s +// RUN: %clang_cc1 -verify -fmodule-cache-path %t -fdisable-module-hash %s #if defined(MODULE) #define INTEGER(X) int diff --git a/test/Modules/module-private.cpp b/test/Modules/module-private.cpp index 81b2aca3fb..7bd2a205c0 100644 --- a/test/Modules/module-private.cpp +++ b/test/Modules/module-private.cpp @@ -1,7 +1,7 @@ // RUN: mkdir -p %t // RUN: %clang_cc1 -x c++ -emit-module -o %t/left.pcm %s -D MODULE_LEFT // RUN: %clang_cc1 -x c++ -emit-module -o %t/right.pcm %s -D MODULE_RIGHT -// RUN: %clang_cc1 -fmodule-cache-path %t %s -verify +// RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash %s -verify #if defined(MODULE_LEFT) diff --git a/test/Modules/objc-categories.m b/test/Modules/objc-categories.m index 5797858870..6022187f6a 100644 --- a/test/Modules/objc-categories.m +++ b/test/Modules/objc-categories.m @@ -1,9 +1,9 @@ // RUN: mkdir -p %t // RUN: %clang_cc1 -emit-module -o %t/diamond_top.pcm %s -D MODULE_TOP -// RUN: %clang_cc1 -fmodule-cache-path %t -emit-module -o %t/diamond_left.pcm %s -D MODULE_LEFT -// RUN: %clang_cc1 -fmodule-cache-path %t -emit-module -o %t/diamond_right.pcm %s -D MODULE_RIGHT -// RUN: %clang_cc1 -fmodule-cache-path %t -emit-module -o %t/diamond_bottom.pcm %s -D MODULE_BOTTOM -// RUN: %clang_cc1 -fmodule-cache-path %t %s -verify +// RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_left.pcm %s -D MODULE_LEFT +// RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_right.pcm %s -D MODULE_RIGHT +// RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_bottom.pcm %s -D MODULE_BOTTOM +// RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash %s -verify /*============================================================================*/ #ifdef MODULE_TOP diff --git a/test/Modules/on-demand-build.m b/test/Modules/on-demand-build.m index 42b8533a9a..d0557ebbee 100644 --- a/test/Modules/on-demand-build.m +++ b/test/Modules/on-demand-build.m @@ -1,11 +1,12 @@ -// RUN: mkdir -p %t -// RUN: rm -f %t/Module.pcm +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodule-cache-path %t -F %S/Inputs -DFOO -verify %s +// RUN: %clang_cc1 -x objective-c++ -fmodule-cache-path %t -F %S/Inputs -DFOO -verify %s // RUN: %clang_cc1 -fmodule-cache-path %t -F %S/Inputs -DFOO -verify %s __import_module__ Module; void test_getModuleVersion() { - int version = getModuleVersion(); // expected-warning{{incompatible pointer to integer conversion initializing 'int' with an expression of type 'const char *'}} - int version2 = [Module version]; // expected-warning{{incompatible pointer to integer conversion initializing 'int' with an expression of type 'const char *'}} + const char *version = getModuleVersion(); + const char *version2 = [Module version]; }