From 4adb5ff74d35900dd8d0ed07959eef68f85c8886 Mon Sep 17 00:00:00 2001 From: Isaac Hier Date: Thu, 2 Nov 2017 20:07:29 -0400 Subject: [PATCH] Add architecture checks --- CMakeLists.txt | 84 +++++++++++++++++++++++---------- cmake/DefineArchVariables.cmake | 10 ++++ src/tcmalloc.h | 2 +- 3 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 cmake/DefineArchVariables.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b8cc34..c287b49 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,22 +14,27 @@ set(default_build_minimal OFF) set(default_tcmalloc_alignment 16) set(need_nanosleep ON) -set(host "${CMAKE_HOST_SYSTEM_NAME}") -if(host MATCHES ".*-mingw.*") +set(host string(TOLOWER "${CMAKE_SYSTEM_NAME}")) +if(host MATCHES "freebsd") + set(FREEBSD ON) +elseif(CMAKE_VERSION VERSION_LESS "3.2" AND host MATCHES "mingw") + set(MINGW ON) +endif() + +if(MINGW) set(default_build_minimal ON) set(default_build_debugalloc OFF) set(need_nanosleep OFF) -elseif(host MATCHES ".*-cygwin.*") +elseif(CYGWIN) set(default_build_heap_checker OFF) set(default_build_cpu_profiler OFF) -elseif(host MATCHES ".*-freebsd.*") +elseif(host MATCHES "freebsd") set(default_build_heap_checker OFF) -elseif(host MATCHES ".*-darwin.*") +elseif(APPLE) set(default_build_heap_checker OFF) endif() include(CMakeDependentOption) -include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) include(CheckCXXSourceCompiles) include(CheckCXXSymbolExists) @@ -40,9 +45,11 @@ include(CheckTypeSize) include(CheckVariableExists) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) +include(DefineArchVariables) include(PCFromUContext) -check_cxx_source_compiles("int main() { return __s390__; }" s390) +define_arch_variables() + if(s390) set(default_enable_libunwind OFF) set(default_enable_backtrace ON) @@ -51,7 +58,6 @@ else() set(default_enable_backtrace OFF) endif() -check_cxx_source_compiles("int main() { return __PPC64__; }" PPC64) if(PPC64) set(default_enable_libunwind OFF) set(default_tcmalloc_pagesize 64) @@ -110,6 +116,20 @@ endif() # TODO: `target_add_definitions` for above (i.e. `TCMALLOC_32K_PAGES`, # `TCMALLOC_ALIGN_8BYTES`) +check_cxx_source_compiles("#include + static void foo(void) __attribute__ ((unused)); + void foo(void) { exit(1); }" + HAVE___ATTRIBUTE__) + +foreach(candidate IN "inline" "__inline" "__inline__" "") + check_cxx_source_compiles( + "static ${candidate} void foo() {}" candidate_compiled) + if(candidate_compiled) + set(inline "${candidate}") + break() + endif() +endforeach() + # TODO: Find `objcopy` with `--weaken` support check_type_size("__int64" __INT64 LANGUAGE CXX) @@ -143,13 +163,13 @@ check_include_file_cxx("sys/cdefs.h" HAVE_SYS_CDEFS_H) check_include_file_cxx("features.h" HAVE_FEATURES_H) set(CMAKE_REQUIRED_DEFINITIONS -D_XOPEN_SOURCE=600) -check_cxx_symbol_exists("cfree" "stdlib.h;malloc.h" HAVE_CFREE) +check_cxx_symbol_exists("cfree" "stdlib.h;malloc.h" HAVE_DECL_CFREE) set(CMAKE_REQUIRED_DEFINITIONS) -check_symbol_exists("posix_memalign" "stdlib.h;malloc.h" HAVE_POSIX_MEMALIGN) -check_symbol_exists("memalign" "stdlib.h;malloc.h" HAVE_MEMALIGN) -check_symbol_exists("valloc" "stdlib.h;malloc.h" HAVE_VALLOC) -check_symbol_exists("pvalloc" "stdlib.h;malloc.h" HAVE_PVALLOC) -check_symbol_exists("mmap" "stdlib.h;unistd.h;sys/mman.h;sys/param.h" HAVE_MMAP) +check_cxx_symbol_exists("posix_memalign" "stdlib.h;malloc.h" HAVE_DECL_POSIX_MEMALIGN) +check_cxx_symbol_exists("memalign" "stdlib.h;malloc.h" HAVE_DECL_MEMALIGN) +check_cxx_symbol_exists("valloc" "stdlib.h;malloc.h" HAVE_DECL_VALLOC) +check_cxx_symbol_exists("pvalloc" "stdlib.h;malloc.h" HAVE_DECL_PVALLOC) +check_cxx_symbol_exists("mmap" "stdlib.h;unistd.h;sys/mman.h;sys/param.h" HAVE_DECL_MMAP) check_cxx_source_compiles( "#include \nint main() { int32_t v1 = 0; intptr_t v2 = 0; return (&v1 - &v2); }" @@ -174,7 +194,7 @@ cmake_dependent_option( gperftools_enable_frame_pointers "On x86_64 systems, compile with -fno-omit-frame-pointer (see INSTALL)" OFF - "CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64" + "x86_64" OFF) check_cxx_compiler_flag("-Wno-unused-result" HAVE_W_NO_UNUSED_RESULT) @@ -202,7 +222,7 @@ else() set(default_emergency_malloc OFF) endif() -if(will_use_libunwind AND CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm") +if(will_use_libunwind AND arm) set(default_emergency_malloc ON) endif() @@ -227,13 +247,10 @@ if(CMAKE_CXX_COMPILER STREQUAL "GNU" AND elseif(APPLE) message(WARNING "OSX __thread support is known to call malloc which makes " "it unsafe to use from malloc replacement") +elseif(MINGW) + message(WARNING "mingw doesn't really support tls") else() - check_cxx_symbol_exists("__MINGW32__" "" mingw32) - if(mingw32) - message(WARNING "mingw doesn't really support tls") - else() - check_cxx_source_compiles("static __thread int p = 0;" HAVE_TLS) - endif() + check_cxx_source_compiles("static __thread int p = 0;" HAVE_TLS) endif() if(need_nanosleep) @@ -261,8 +278,27 @@ if(EXISTS /usr/sfw/lib/libstdc++.la) endif() endif() -check_variable_exists("program_invocation_name" HAVE_PROGRAM_INVOCATION_NAME) - check_cxx_source_compiles( "#include \n#include \nint main() { pthread_t th; pthread_join(th, 0); return 0; }" HAVE_PTHREAD_DESPITE_ASKING_FOR) + +check_cxx_source_compiles( + "#include \nint main() { vector t; return 0; }" + STL_NAMESPACE_NONE) +if(STL_NAMESPACE_NONE) + set(STL_NAMESPACE "") +else() + check_cxx_source_compiles( + "#include \nint main() { std::vector t; return 0; }" + STL_NAMESPACE_STD) + if (STL_NAMESPACE_STD) + set(STL_NAMESPACE "std") + endif() +endif() + +check_variable_exists("program_invocation_name" HAVE_PROGRAM_INVOCATION_NAME) + +if(MINGW) + check_cxx_symbol_exists("sleep" "unistd.h" HAVE_DECL_SLEEP) + check_cxx_symbol_exists("nanosleep" "time.h" HAVE_DECL_NANOSLEEP) +endif() diff --git a/cmake/DefineArchVariables.cmake b/cmake/DefineArchVariables.cmake new file mode 100644 index 0000000..74e2b05 --- /dev/null +++ b/cmake/DefineArchVariables.cmake @@ -0,0 +1,10 @@ +if(NOT COMMAND check_cxx_source_compiles) + include(CheckCXXSourceCompiles) +endif() + +macro(define_arch_variables) + check_cxx_source_compiles("int main() { return __s390__; }" s390) + check_cxx_source_compiles("int main() { return __PPC64__; }" PPC64) + check_cxx_source_compiles("int main() { return __x86_64__; }" x86_64) + check_cxx_source_compiles("int main() { return __arm__; }" arm) +endmacro() diff --git a/src/tcmalloc.h b/src/tcmalloc.h index 25cf982..016c805 100644 --- a/src/tcmalloc.h +++ b/src/tcmalloc.h @@ -53,7 +53,7 @@ # define __THROW // __THROW is just an optimization, so ok to make it "" #endif -#if !HAVE_CFREE_SYMBOL +#if !HAVE_DECL_CFREE extern "C" void cfree(void* ptr) __THROW; #endif #if !HAVE_DECL_POSIX_MEMALIGN