[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