diff options
-rw-r--r-- | clang/lib/Headers/module.modulemap | 2 | ||||
-rw-r--r-- | clang/lib/Headers/xmmintrin.h | 2 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 14 | ||||
-rw-r--r-- | clang/test/Headers/Inputs/include/stdlib.h | 2 | ||||
-rw-r--r-- | clang/test/Headers/xmmintrin.c | 12 |
5 files changed, 25 insertions, 7 deletions
diff --git a/clang/lib/Headers/module.modulemap b/clang/lib/Headers/module.modulemap index bb2ca95212d..ac5876f8d72 100644 --- a/clang/lib/Headers/module.modulemap +++ b/clang/lib/Headers/module.modulemap @@ -49,7 +49,7 @@ module _Builtin_intrinsics [system] [extern_c] { 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" } diff --git a/clang/lib/Headers/xmmintrin.h b/clang/lib/Headers/xmmintrin.h index d1afe81601c..3a6b95e8bfe 100644 --- a/clang/lib/Headers/xmmintrin.h +++ b/clang/lib/Headers/xmmintrin.h @@ -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 diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 0e6e5588390..29a88a13d38 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -2496,8 +2496,7 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { 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 *WritingModule) { } 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 diff --git a/clang/test/Headers/Inputs/include/stdlib.h b/clang/test/Headers/Inputs/include/stdlib.h new file mode 100644 index 00000000000..296b6239f67 --- /dev/null +++ b/clang/test/Headers/Inputs/include/stdlib.h @@ -0,0 +1,2 @@ +#pragma once +typedef __SIZE_TYPE__ size_t; diff --git a/clang/test/Headers/xmmintrin.c b/clang/test/Headers/xmmintrin.c index c426f34d06e..76fff0db77f 100644 --- a/clang/test/Headers/xmmintrin.c +++ b/clang/test/Headers/xmmintrin.c @@ -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); +} + |