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_CXX_ABI_LIBRARY ${abilib})
|
||||||
set(LIBCXX_ABILIB_FILES ${abifiles})
|
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})
|
foreach(_d ${abidirs})
|
||||||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/${_d}")
|
file(MAKE_DIRECTORY "${LIBCXX_BUILD_HEADERS_ROOT}/${_d}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
foreach(fpath ${LIBCXX_ABILIB_FILES})
|
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(dstdir ${fpath} PATH)
|
||||||
get_filename_component(ifile ${fpath} NAME)
|
get_filename_component(ifile ${fpath} NAME)
|
||||||
file(COPY "${incpath}/${fpath}"
|
file(COPY "${incpath}/${fpath}"
|
||||||
DESTINATION "${CMAKE_BINARY_DIR}/include/${dstdir}"
|
DESTINATION "${LIBCXX_BUILD_HEADERS_ROOT}/${dstdir}"
|
||||||
)
|
)
|
||||||
if (LIBCXX_INSTALL_HEADERS)
|
if (LIBCXX_INSTALL_HEADERS)
|
||||||
install(FILES "${CMAKE_BINARY_DIR}/include/${fpath}"
|
install(FILES "${LIBCXX_BUILD_HEADERS_ROOT}/${fpath}"
|
||||||
DESTINATION include/c++/v1/${dstdir}
|
DESTINATION include/c++/v1/${dstdir}
|
||||||
COMPONENT libcxx
|
COMPONENT libcxx
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
list(APPEND abilib_headers "${CMAKE_BINARY_DIR}/include/${fpath}")
|
list(APPEND abilib_headers "${LIBCXX_BUILD_HEADERS_ROOT}/${fpath}")
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
if (NOT found)
|
if (NOT found)
|
||||||
@@ -58,7 +60,7 @@ macro(setup_abi_lib abidefines abilib abifiles abidirs)
|
|||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
include_directories("${CMAKE_BINARY_DIR}/include")
|
include_directories("${LIBCXX_BUILD_HEADERS_ROOT}")
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -409,6 +409,9 @@ class Configuration(object):
|
|||||||
self.lit_config.fatal("cxx_headers='%s' is not a directory."
|
self.lit_config.fatal("cxx_headers='%s' is not a directory."
|
||||||
% cxx_headers)
|
% cxx_headers)
|
||||||
self.cxx.compile_flags += ['-I' + 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):
|
def configure_config_site_header(self):
|
||||||
# Check for a possible __config_site in the build directory. We
|
# 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