Переглянути джерело

When building a module, use the macro definitions on the command line
as part of the hash rather than ignoring them. This means we'll end up
building more module variants (overall), but it allows configuration
macros such as NDEBUG to work so long as they're specified via command
line. More to come in this space.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142187 91177308-0d34-0410-b5e6-96231b3b80d8

Douglas Gregor 14 роки тому
батько
коміт
05edf668f0

+ 0 - 1
include/clang/Frontend/PreprocessorOptions.h

@@ -206,7 +206,6 @@ public:
   /// \brief Reset any options that are not considered when building a
   /// \brief Reset any options that are not considered when building a
   /// module.
   /// module.
   void resetNonModularOptions() {
   void resetNonModularOptions() {
-    Macros.clear();
     Includes.clear();
     Includes.clear();
     MacroIncludes.clear();
     MacroIncludes.clear();
     ChainedIncludes.clear();
     ChainedIncludes.clear();

+ 17 - 0
lib/Frontend/CompilerInvocation.cpp

@@ -2026,6 +2026,23 @@ std::string CompilerInvocation::getModuleHash() const {
   Signature.add(getPreprocessorOpts().UsePredefines, 1);
   Signature.add(getPreprocessorOpts().UsePredefines, 1);
   Signature.add(getPreprocessorOpts().DetailedRecord, 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
   // We've generated the signature. Treat it as one large APInt that we'll
   // encode in base-36 and return.
   // encode in base-36 and return.
   Signature.flush();
   Signature.flush();

+ 6 - 0
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
+

+ 1 - 1
test/Modules/on-demand-build-warnings.m

@@ -1,5 +1,5 @@
 // RUN: rm -rf %t
 // 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}}
 __import_module__ Module; // expected-warning{{building module 'Module' from source}}
 
 

+ 4 - 4
test/Modules/on-demand-build.m

@@ -1,8 +1,8 @@
 // RUN: rm -rf %t
 // 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;
 __import_module__ Module;
 @interface OtherClass
 @interface OtherClass
 @end
 @end

+ 13 - 0
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
+}