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:
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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
49
test/support/demangle.h
Normal 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
|
||||
37
test/support/test.support/test_demangle.pass.cpp
Normal file
37
test/support/test.support/test_demangle.pass.cpp
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user