Author: ericwf Date: Fri Dec 9 03:31:01 2016 New Revision: 289195 URL: http://llvm.org/viewvc/llvm-project?rev=289195&view=rev Log: Put C++ ABI headers in a special build directory instead of the top level.
This patch changes where the C++ ABI headers are put during the build. Previously they were put in the top level include directory (not the libc++ header directory). However that just polutes the top level directory. Instead this patch creates a special directory to put them in. The reason they can't be put under c++/v1 until after the build is because libc++ uses the in-source headers, so we can't add the include path of the libc++ headers in the object dir. Additionally this patch teaches the test suite how to find the ABI headers, and adds a demangling utility to help debug tests with. Added: libcxx/trunk/test/support/demangle.h libcxx/trunk/test/support/test.support/test_demangle.pass.cpp Modified: libcxx/trunk/cmake/Modules/HandleLibCXXABI.cmake libcxx/trunk/test/libcxx/test/config.py Modified: libcxx/trunk/cmake/Modules/HandleLibCXXABI.cmake URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/cmake/Modules/HandleLibCXXABI.cmake?rev=289195&r1=289194&r2=289195&view=diff ============================================================================== --- libcxx/trunk/cmake/Modules/HandleLibCXXABI.cmake (original) +++ libcxx/trunk/cmake/Modules/HandleLibCXXABI.cmake Fri Dec 9 03:31:01 2016 @@ -28,9 +28,11 @@ macro(setup_abi_lib abidefines abilib ab set(LIBCXX_CXX_ABI_LIBRARY ${abilib}) set(LIBCXX_ABILIB_FILES ${abifiles}) - file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include") + # The place in the build tree where we store out-of-source headers. + set(LIBCXX_BUILD_HEADERS_ROOT "${CMAKE_BINARY_DIR}/include/c++-build") + file(MAKE_DIRECTORY "${LIBCXX_BUILD_HEADERS_ROOT}") foreach(_d ${abidirs}) - file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/${_d}") + file(MAKE_DIRECTORY "${LIBCXX_BUILD_HEADERS_ROOT}/${_d}") endforeach() foreach(fpath ${LIBCXX_ABILIB_FILES}) @@ -41,16 +43,16 @@ macro(setup_abi_lib abidefines abilib ab get_filename_component(dstdir ${fpath} PATH) get_filename_component(ifile ${fpath} NAME) file(COPY "${incpath}/${fpath}" - DESTINATION "${CMAKE_BINARY_DIR}/include/${dstdir}" + DESTINATION "${LIBCXX_BUILD_HEADERS_ROOT}/${dstdir}" ) if (LIBCXX_INSTALL_HEADERS) - install(FILES "${CMAKE_BINARY_DIR}/include/${fpath}" + install(FILES "${LIBCXX_BUILD_HEADERS_ROOT}/${fpath}" DESTINATION include/c++/v1/${dstdir} COMPONENT libcxx PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) endif() - list(APPEND abilib_headers "${CMAKE_BINARY_DIR}/include/${fpath}") + list(APPEND abilib_headers "${LIBCXX_BUILD_HEADERS_ROOT}/${fpath}") endif() endforeach() if (NOT found) @@ -58,7 +60,7 @@ macro(setup_abi_lib abidefines abilib ab endif() endforeach() - include_directories("${CMAKE_BINARY_DIR}/include") + include_directories("${LIBCXX_BUILD_HEADERS_ROOT}") endmacro() Modified: libcxx/trunk/test/libcxx/test/config.py URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/test/config.py?rev=289195&r1=289194&r2=289195&view=diff ============================================================================== --- libcxx/trunk/test/libcxx/test/config.py (original) +++ libcxx/trunk/test/libcxx/test/config.py Fri Dec 9 03:31:01 2016 @@ -409,6 +409,9 @@ class Configuration(object): self.lit_config.fatal("cxx_headers='%s' is not a directory." % cxx_headers) self.cxx.compile_flags += ['-I' + cxx_headers] + cxxabi_headers = os.path.join(self.libcxx_obj_root, 'include', 'c++-build') + if os.path.isdir(cxxabi_headers): + self.cxx.compile_flags += ['-I' + cxxabi_headers] def configure_config_site_header(self): # Check for a possible __config_site in the build directory. We Added: libcxx/trunk/test/support/demangle.h URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/demangle.h?rev=289195&view=auto ============================================================================== --- libcxx/trunk/test/support/demangle.h (added) +++ libcxx/trunk/test/support/demangle.h Fri Dec 9 03:31:01 2016 @@ -0,0 +1,49 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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 SUPPORT_DEMANGLE_H +#define SUPPORT_DEMANGLE_H + +#include "test_macros.h" +#include <string> +#include <cstdlib> + +#if !defined(TEST_HAS_NO_DEMANGLE) +# if defined(__GNUC__) || defined(__clang__) +# if __has_include("cxxabi.h") +# include "cxxabi.h" +# else +# define TEST_HAS_NO_DEMANGLE +# endif +# else +# define TEST_HAS_NO_DEMANGLE +# endif +#endif + +#if defined(TEST_HAS_NO_DEMANGLE) +inline std::string demangle(const char* mangled_name) { + return mangled_name; +} +#else +template <size_t N> struct Printer; +inline std::string demangle(const char* mangled_name) { + int status = 0; + std::string input(mangled_name); + input.insert(0, "_Z"); + char* out = __cxxabiv1::__cxa_demangle(input.c_str(), nullptr, nullptr, &status); + if (out != nullptr) { + std::string res(out); + std::free(out); + return res; + } + return mangled_name; +} +#endif + +#endif // SUPPORT_DEMANGLE_H Added: libcxx/trunk/test/support/test.support/test_demangle.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/test.support/test_demangle.pass.cpp?rev=289195&view=auto ============================================================================== --- libcxx/trunk/test/support/test.support/test_demangle.pass.cpp (added) +++ libcxx/trunk/test/support/test.support/test_demangle.pass.cpp Fri Dec 9 03:31:01 2016 @@ -0,0 +1,37 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// +#include "demangle.h" +#include <typeinfo> +#include <cassert> + +struct MyType {}; + +template <class T, class U> struct ArgumentListID {}; + +int main() { + struct { + const char* raw; + const char* expect; + } TestCases[] = { + {typeid(int).name(), "i"}, // FIXME + {typeid(MyType).name(), "MyType"}, + {typeid(ArgumentListID<int, MyType>).name(), "ArgumentListID<int, MyType>"} + }; + const size_t size = sizeof(TestCases) / sizeof(TestCases[0]); + for (size_t i=0; i < size; ++i) { + const char* raw = TestCases[i].raw; + const char* expect = TestCases[i].expect; +#ifdef TEST_HAS_NO_DEMANGLE + assert(demangle(raw) == raw); +#else + assert(demangle(raw) == expect); +#endif + } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits