[libcxx] r289195 - Put C++ ABI headers in a special build directory instead of the top level.
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 9 01:31:02 PST 2016
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
+ }
+}
More information about the cfe-commits
mailing list