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.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@289195 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2016-12-09 09:31:01 +00:00
parent 5a6eaee517
commit 11715ba8e2
4 changed files with 97 additions and 6 deletions

View File

@@ -28,9 +28,11 @@ macro(setup_abi_lib abidefines abilib abifiles abidirs)
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 abifiles abidirs)
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 abifiles abidirs)
endif()
endforeach()
include_directories("${CMAKE_BINARY_DIR}/include")
include_directories("${LIBCXX_BUILD_HEADERS_ROOT}")
endmacro()

View File

@@ -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

49
test/support/demangle.h Normal file
View File

@@ -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

View File

@@ -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
}
}