Author: ericwf Date: Fri Nov 18 19:14:15 2016 New Revision: 287413 URL: http://llvm.org/viewvc/llvm-project?rev=287413&view=rev Log: [libcxx] Implement locale.h to fix modules build
Summary: Because `locale.h` isn't part of the libc++ modules the class definitions it provides are exported as part of `__locale` (since it happens to be build first). This breaks `<clocale>` which exports `std::lconv` without including `<__locale>`. This patch implements `locale.h` to fix this issue, it also adds support for testing libc++ with modules. Reviewers: mclow.lists, rsmith, EricWF Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D26826 Added: libcxx/trunk/include/locale.h libcxx/trunk/test/libcxx/depr/depr.c.headers/locale_h.pass.cpp libcxx/trunk/test/libcxx/modules/ libcxx/trunk/test/libcxx/modules/clocale_exports.sh.cpp Modified: libcxx/trunk/include/module.modulemap libcxx/trunk/test/libcxx/test/config.py Added: libcxx/trunk/include/locale.h URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/locale.h?rev=287413&view=auto ============================================================================== --- libcxx/trunk/include/locale.h (added) +++ libcxx/trunk/include/locale.h Fri Nov 18 19:14:15 2016 @@ -0,0 +1,45 @@ +// -*- C++ -*- +//===---------------------------- locale.h --------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_LOCALE_H +#define _LIBCPP_LOCALE_H + +/* + locale.h synopsis + +Macros: + + LC_ALL + LC_COLLATE + LC_CTYPE + LC_MONETARY + LC_NUMERIC + LC_TIME + +Types: + + lconv + +Functions: + + setlocale + localeconv + +*/ + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#include_next <locale.h> + +#endif // _LIBCPP_LOCALE_H Modified: libcxx/trunk/include/module.modulemap URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/module.modulemap?rev=287413&r1=287412&r2=287413&view=diff ============================================================================== --- libcxx/trunk/include/module.modulemap (original) +++ libcxx/trunk/include/module.modulemap Fri Nov 18 19:14:15 2016 @@ -40,7 +40,13 @@ module std [system] { } // <iso646.h> provided by compiler. // <limits.h> provided by compiler or C library. - // <locale.h> provided by C library. + module locale_h { + header "locale.h" +/* + export_macros LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME +*/ + export * + } module math_h { header "math.h" /* Added: libcxx/trunk/test/libcxx/depr/depr.c.headers/locale_h.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/depr/depr.c.headers/locale_h.pass.cpp?rev=287413&view=auto ============================================================================== --- libcxx/trunk/test/libcxx/depr/depr.c.headers/locale_h.pass.cpp (added) +++ libcxx/trunk/test/libcxx/depr/depr.c.headers/locale_h.pass.cpp Fri Nov 18 19:14:15 2016 @@ -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. +// +//===----------------------------------------------------------------------===// + +// <locale.h> + +#include <locale.h> + +#ifndef _LIBCPP_VERSION +#error _LIBCPP_VERSION not defined +#endif + +int main() +{ +} Added: libcxx/trunk/test/libcxx/modules/clocale_exports.sh.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/modules/clocale_exports.sh.cpp?rev=287413&view=auto ============================================================================== --- libcxx/trunk/test/libcxx/modules/clocale_exports.sh.cpp (added) +++ libcxx/trunk/test/libcxx/modules/clocale_exports.sh.cpp Fri Nov 18 19:14:15 2016 @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// RUN: %build_module + +#include <clocale> + +#define TEST(...) do { using T = decltype( __VA_ARGS__ ); } while(false) + +int main() { + std::lconv l; ((void)l); + + TEST(std::setlocale(0, "")); + TEST(std::localeconv()); +} Modified: libcxx/trunk/test/libcxx/test/config.py URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/test/config.py?rev=287413&r1=287412&r2=287413&view=diff ============================================================================== --- libcxx/trunk/test/libcxx/test/config.py (original) +++ libcxx/trunk/test/libcxx/test/config.py Fri Nov 18 19:14:15 2016 @@ -13,6 +13,7 @@ import platform import pkgutil import re import shlex +import shutil import sys import lit.Test # pylint: disable=import-error,no-name-in-module @@ -64,6 +65,7 @@ class Configuration(object): self.cxx_library_root = None self.cxx_runtime_root = None self.abi_library_root = None + self.module_cache_path = None self.env = {} self.use_target = False self.use_system_cxx_lib = False @@ -117,6 +119,7 @@ class Configuration(object): self.configure_warnings() self.configure_sanitizer() self.configure_coverage() + self.configure_modules() self.configure_substitutions() self.configure_features() @@ -721,6 +724,27 @@ class Configuration(object): self.cxx.flags += ['-g', '--coverage'] 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: + self.lit_config.fatal( + '-fmodules is enabled but not supported by the compiler') + if not supports_modules: + return + self.config.available_features.add('modules-support') + module_cache = os.path.join(self.config.test_exec_root, + 'modules.cache') + module_cache = os.path.realpath(module_cache) + if os.path.isdir(module_cache): + shutil.rmtree(module_cache) + os.makedirs(module_cache) + self.module_cache_path = module_cache + if enable_modules: + self.config.available_features.add('-fmodules') + self.cxx.compile_flags += ['-fmodules', + '-fmodules-cache-path=' + module_cache] + def configure_substitutions(self): sub = self.config.substitutions # Configure compiler substitutions @@ -734,6 +758,13 @@ class Configuration(object): sub.append(('%compile_flags', compile_flags_str)) 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) @@ -743,6 +774,8 @@ 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)) sub.append(('%build', build_str)) # Configure exec prefix substitutions. exec_env_str = 'env ' if len(self.env) != 0 else '' _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits