diff --git a/include/module.modulemap b/include/module.modulemap index bcf4632d8..ce126609d 100644 --- a/include/module.modulemap +++ b/include/module.modulemap @@ -45,7 +45,13 @@ module std [system] { // 's __need_* macros require textual inclusion. textual header "stddef.h" } - // FIXME: is missing. + module stdint_h { + header "stdint.h" + export * + // FIXME: This module only exists on OS X and for some reason the + // wildcard above doesn't export it. + export Darwin.C.stdint + } module stdio_h { // 's __need_* macros require textual inclusion. textual header "stdio.h" @@ -158,6 +164,7 @@ module std [system] { } module cstdint { header "cstdint" + export depr.stdint_h export * } module cstdio { diff --git a/test/libcxx/modules/cinttypes_exports.sh.cpp b/test/libcxx/modules/cinttypes_exports.sh.cpp new file mode 100644 index 000000000..99d20ec65 --- /dev/null +++ b/test/libcxx/modules/cinttypes_exports.sh.cpp @@ -0,0 +1,21 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// REQUIRES: modules-support + +// Test that re-exports + +// RUN: %build_module + +#include + +int main() { + int8_t x; ((void)x); + std::int8_t y; ((void)y); +} diff --git a/test/libcxx/modules/cstdint_exports.sh.cpp b/test/libcxx/modules/cstdint_exports.sh.cpp new file mode 100644 index 000000000..8ecc1da28 --- /dev/null +++ b/test/libcxx/modules/cstdint_exports.sh.cpp @@ -0,0 +1,21 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// REQUIRES: modules-support + +// Test that re-exports + +// RUN: %build_module + +#include + +int main() { + int8_t x; ((void)x); + std::int8_t y; ((void)y); +} diff --git a/test/libcxx/modules/inttypes_h_exports.sh.cpp b/test/libcxx/modules/inttypes_h_exports.sh.cpp new file mode 100644 index 000000000..d1598d7ea --- /dev/null +++ b/test/libcxx/modules/inttypes_h_exports.sh.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// REQUIRES: modules-support + +// Test that intypes.h re-exports stdint.h + +// RUN: %build_module + +#include + +int main() { + int8_t x; ((void)x); +} diff --git a/test/libcxx/modules/stdint_h_exports.sh.cpp b/test/libcxx/modules/stdint_h_exports.sh.cpp new file mode 100644 index 000000000..78e110138 --- /dev/null +++ b/test/libcxx/modules/stdint_h_exports.sh.cpp @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// REQUIRES: modules-support + +// Test that int8_t and the like are exported from stdint.h not inttypes.h + +// RUN: %build_module + +#include + +int main() { + int8_t x; ((void)x); +} diff --git a/test/libcxx/test/config.py b/test/libcxx/test/config.py index 7a509d37b..4734bf4b8 100644 --- a/test/libcxx/test/config.py +++ b/test/libcxx/test/config.py @@ -65,7 +65,8 @@ class Configuration(object): self.cxx_library_root = None self.cxx_runtime_root = None self.abi_library_root = None - self.module_cache_path = None + self.enable_modules = False + self.modules_flags = None self.env = {} self.use_target = False self.use_system_cxx_lib = False @@ -725,9 +726,12 @@ class Configuration(object): self.cxx.compile_flags += ['-O0'] def configure_modules(self): - supports_modules = self.cxx.hasCompileFlag('-fmodules') - enable_modules = self.get_lit_bool('enable_modules', False) - if enable_modules and not supports_modules: + modules_flags = ['-fmodules'] + if platform.system() != 'Darwin': + modules_flags += ['-Xclang', '-fmodules-local-submodule-visibility'] + supports_modules = self.cxx.hasCompileFlag(modules_flags) + self.enable_modules = self.get_lit_bool('enable_modules', False) + if self.enable_modules and not supports_modules: self.lit_config.fatal( '-fmodules is enabled but not supported by the compiler') if not supports_modules: @@ -739,11 +743,11 @@ class Configuration(object): if os.path.isdir(module_cache): shutil.rmtree(module_cache) os.makedirs(module_cache) - self.module_cache_path = module_cache - if enable_modules: + self.modules_flags = modules_flags + \ + ['-fmodules-cache-path=' + module_cache] + if self.enable_modules: self.config.available_features.add('-fmodules') - self.cxx.compile_flags += ['-fmodules', - '-fmodules-cache-path=' + module_cache] + self.cxx.compile_flags += self.modules_flags def configure_substitutions(self): sub = self.config.substitutions @@ -759,12 +763,6 @@ class Configuration(object): sub.append(('%link_flags', link_flags_str)) sub.append(('%all_flags', all_flags)) - module_flags = None - if not self.module_cache_path is None: - module_flags = '-fmodules -fmodules-cache-path=' \ - + self.module_cache_path + ' ' - - # Add compile and link shortcuts compile_str = (self.cxx.path + ' -o %t.o %s -c ' + flags_str + compile_flags_str) @@ -774,8 +772,11 @@ class Configuration(object): build_str = self.cxx.path + ' -o %t.exe %s ' + all_flags sub.append(('%compile', compile_str)) sub.append(('%link', link_str)) - if not module_flags is None: - sub.append(('%build_module', build_str + ' ' + module_flags)) + if self.enable_modules: + sub.append(('%build_module', build_str)) + elif self.modules_flags is not None: + modules_str = ' '.join(self.modules_flags) + ' ' + sub.append(('%build_module', build_str + ' ' + modules_str)) sub.append(('%build', build_str)) # Configure exec prefix substitutions. exec_env_str = 'env ' if len(self.env) != 0 else '' @@ -788,7 +789,7 @@ class Configuration(object): sub.append(('%exec', exec_str)) # Configure run shortcut sub.append(('%run', exec_str + ' %t.exe')) - # Configure not program substitions + # Configure not program substitutions not_py = os.path.join(self.libcxx_src_root, 'utils', 'not', 'not.py') not_str = '%s %s' % (sys.executable, not_py) sub.append(('not', not_str))