r237321 - [modules] Fix a #include cycle when building a module for our builtin headers.

Richard Smith richard-llvm at metafoo.co.uk
Wed May 13 17:45:20 PDT 2015


Author: rsmith
Date: Wed May 13 19:45:20 2015
New Revision: 237321

URL: http://llvm.org/viewvc/llvm-project?rev=237321&view=rev
Log:
[modules] Fix a #include cycle when building a module for our builtin headers.

xmmintrin.h includes emmintrin.h and vice versa if SSE2 is enabled. We break
this cycle for a modules build, and instead make the xmmintrin.h module
re-export the immintrin.h module. Also included is a fix for an assert in the
serialization code if a module exports another module that was declared later
in the same module map.

Added:
    cfe/trunk/test/Headers/Inputs/include/stdlib.h
Modified:
    cfe/trunk/lib/Headers/module.modulemap
    cfe/trunk/lib/Headers/xmmintrin.h
    cfe/trunk/lib/Serialization/ASTWriter.cpp
    cfe/trunk/test/Headers/xmmintrin.c

Modified: cfe/trunk/lib/Headers/module.modulemap
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/module.modulemap?rev=237321&r1=237320&r2=237321&view=diff
==============================================================================
--- cfe/trunk/lib/Headers/module.modulemap (original)
+++ cfe/trunk/lib/Headers/module.modulemap Wed May 13 19:45:20 2015
@@ -49,7 +49,7 @@ module _Builtin_intrinsics [system] [ext
     explicit module sse {
       requires sse
       export mmx
-      export * // note: for hackish <emmintrin.h> dependency
+      export sse2 // note: for hackish <emmintrin.h> dependency
       header "xmmintrin.h"
     }
 

Modified: cfe/trunk/lib/Headers/xmmintrin.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/xmmintrin.h?rev=237321&r1=237320&r2=237321&view=diff
==============================================================================
--- cfe/trunk/lib/Headers/xmmintrin.h (original)
+++ cfe/trunk/lib/Headers/xmmintrin.h Wed May 13 19:45:20 2015
@@ -994,7 +994,7 @@ do { \
 #define _m_ _mm_
 
 /* Ugly hack for backwards-compatibility (compatible with gcc) */
-#ifdef __SSE2__
+#if defined(__SSE2__) && !__has_feature(modules)
 #include <emmintrin.h>
 #endif
 

Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=237321&r1=237320&r2=237321&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed May 13 19:45:20 2015
@@ -2496,8 +2496,7 @@ void ASTWriter::WriteSubmodules(Module *
       Record.clear();
       for (unsigned I = 0, N = Mod->Exports.size(); I != N; ++I) {
         if (Module *Exported = Mod->Exports[I].getPointer()) {
-          unsigned ExportedID = SubmoduleIDs[Exported];
-          assert(ExportedID > 0 && "Unknown submodule ID?");
+          unsigned ExportedID = getSubmoduleID(Exported);
           Record.push_back(ExportedID);
         } else {
           Record.push_back(0);
@@ -2548,9 +2547,14 @@ void ASTWriter::WriteSubmodules(Module *
   }
   
   Stream.ExitBlock();
-  
-  assert((NextSubmoduleID - FirstSubmoduleID
-            == getNumberOfModules(WritingModule)) && "Wrong # of submodules");
+
+  // FIXME: This can easily happen, if we have a reference to a submodule that
+  // did not result in us loading a module file for that submodule. For
+  // instance, a cross-top-level-module 'conflict' declaration will hit this.
+  assert((NextSubmoduleID - FirstSubmoduleID ==
+          getNumberOfModules(WritingModule)) &&
+         "Wrong # of submodules; found a reference to a non-local, "
+         "non-imported submodule?");
 }
 
 serialization::SubmoduleID 

Added: cfe/trunk/test/Headers/Inputs/include/stdlib.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/Inputs/include/stdlib.h?rev=237321&view=auto
==============================================================================
--- cfe/trunk/test/Headers/Inputs/include/stdlib.h (added)
+++ cfe/trunk/test/Headers/Inputs/include/stdlib.h Wed May 13 19:45:20 2015
@@ -0,0 +1,2 @@
+#pragma once
+typedef __SIZE_TYPE__ size_t;

Modified: cfe/trunk/test/Headers/xmmintrin.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/xmmintrin.c?rev=237321&r1=237320&r2=237321&view=diff
==============================================================================
--- cfe/trunk/test/Headers/xmmintrin.c (original)
+++ cfe/trunk/test/Headers/xmmintrin.c Wed May 13 19:45:20 2015
@@ -1,4 +1,9 @@
 // RUN: %clang_cc1 %s -ffreestanding -triple x86_64-apple-macosx10.9.0 -emit-llvm -o - | FileCheck %s
+//
+// RUN: rm -rf %t
+// RUN: %clang_cc1 %s -ffreestanding -triple x86_64-apple-macosx10.9.0 -emit-llvm -o - \
+// RUN:     -fmodules -fmodules-cache-path=%t -isystem %S/Inputs/include \
+// RUN:     | FileCheck %s
 
 #include <xmmintrin.h>
 
@@ -11,3 +16,10 @@
 __m64 test_mm_cvtps_pi16(__m128 a) {
   return _mm_cvtps_pi16(a);
 }
+
+// Make sure that including <xmmintrin.h> also makes <emmintrin.h>'s content available.
+// This is an ugly hack for GCC compatibility.
+__m128 test_xmmintrin_provides_emmintrin(__m128d __a, __m128d __b) {
+  return _mm_add_sd(__a, __b);
+}
+





More information about the cfe-commits mailing list