diff options
-rw-r--r-- | include/clang/Frontend/PreprocessorOptions.h | 1 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 17 | ||||
-rw-r--r-- | test/Modules/Inputs/CmdLine.framework/Headers/CmdLine.h | 6 | ||||
-rw-r--r-- | test/Modules/on-demand-build-warnings.m | 2 | ||||
-rw-r--r-- | test/Modules/on-demand-build.m | 8 | ||||
-rw-r--r-- | test/Modules/on-demand-macros.m | 13 |
6 files changed, 41 insertions, 6 deletions
diff --git a/include/clang/Frontend/PreprocessorOptions.h b/include/clang/Frontend/PreprocessorOptions.h index 30a34060b2..0ee8cb3874 100644 --- a/include/clang/Frontend/PreprocessorOptions.h +++ b/include/clang/Frontend/PreprocessorOptions.h @@ -206,7 +206,6 @@ public: /// \brief Reset any options that are not considered when building a /// module. void resetNonModularOptions() { - Macros.clear(); Includes.clear(); MacroIncludes.clear(); ChainedIncludes.clear(); diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 5358106144..1debf3b353 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2026,6 +2026,23 @@ std::string CompilerInvocation::getModuleHash() const { Signature.add(getPreprocessorOpts().UsePredefines, 1); Signature.add(getPreprocessorOpts().DetailedRecord, 1); + // Hash the preprocessor defines. + // FIXME: This is terrible. Use an MD5 sum of the preprocessor defines. + std::vector<StringRef> MacroDefs; + for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator + I = getPreprocessorOpts().Macros.begin(), + IEnd = getPreprocessorOpts().Macros.end(); + I != IEnd; ++I) { + if (!I->second) + MacroDefs.push_back(I->first); + } + llvm::array_pod_sort(MacroDefs.begin(), MacroDefs.end()); + + unsigned PPHashResult = 0; + for (unsigned I = 0, N = MacroDefs.size(); I != N; ++I) + PPHashResult = llvm::HashString(MacroDefs[I], PPHashResult); + Signature.add(PPHashResult, 32); + // We've generated the signature. Treat it as one large APInt that we'll // encode in base-36 and return. Signature.flush(); diff --git a/test/Modules/Inputs/CmdLine.framework/Headers/CmdLine.h b/test/Modules/Inputs/CmdLine.framework/Headers/CmdLine.h new file mode 100644 index 0000000000..46b8fc0425 --- /dev/null +++ b/test/Modules/Inputs/CmdLine.framework/Headers/CmdLine.h @@ -0,0 +1,6 @@ +#ifdef FOO_RETURNS_INT_PTR +int *foo(void); +#else +float *foo(void); +#endif + diff --git a/test/Modules/on-demand-build-warnings.m b/test/Modules/on-demand-build-warnings.m index ea531698cf..aa122dbd85 100644 --- a/test/Modules/on-demand-build-warnings.m +++ b/test/Modules/on-demand-build-warnings.m @@ -1,5 +1,5 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Wmodule-build -fmodule-cache-path %t -F %S/Inputs -DFOO -verify %s +// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Wmodule-build -fmodule-cache-path %t -F %S/Inputs -verify %s __import_module__ Module; // expected-warning{{building module 'Module' from source}} diff --git a/test/Modules/on-demand-build.m b/test/Modules/on-demand-build.m index 418e912f63..649caa8a7d 100644 --- a/test/Modules/on-demand-build.m +++ b/test/Modules/on-demand-build.m @@ -1,8 +1,8 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Werror -fmodule-cache-path %t -F %S/Inputs -DFOO -verify %s -// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Werror -x objective-c++ -fmodule-cache-path %t -F %S/Inputs -DFOO -verify %s -// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Werror -fmodule-cache-path %t -F %S/Inputs -DFOO -verify %s - +// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Werror -fmodule-cache-path %t -F %S/Inputs -verify %s +// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Werror -x objective-c++ -fmodule-cache-path %t -F %S/Inputs -verify %s +// RUN: %clang_cc1 -fno-objc-infer-related-result-type -Werror -fmodule-cache-path %t -F %S/Inputs -verify %s +#define FOO __import_module__ Module; @interface OtherClass @end diff --git a/test/Modules/on-demand-macros.m b/test/Modules/on-demand-macros.m new file mode 100644 index 0000000000..96abb2331f --- /dev/null +++ b/test/Modules/on-demand-macros.m @@ -0,0 +1,13 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodule-cache-path %t -F %S/Inputs -DFOO_RETURNS_INT_PTR -verify %s +// RUN: %clang_cc1 -fmodule-cache-path %t -F %S/Inputs -verify %s + +__import_module__ CmdLine; + +void test() { +#ifdef FOO_RETURNS_INT_PTR + int *ip = foo(); +#else + float *fp = foo(); +#endif +} |