Eric Fiselier 0ef3b1b10a 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.

llvm-svn: 289195
2016-12-09 09:31:01 +00:00

50 lines
1.2 KiB
C++

// -*- 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