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