From 1a2046c33317c56514f734e2ccfc0f0032eb6c24 Mon Sep 17 00:00:00 2001 From: Zach Anderson Date: Tue, 15 May 2018 21:07:57 +0000 Subject: [PATCH] [vm] Roll tcmalloc forward It hasn't been updated in nearly 2 years. This update adds support for more modern C++'s. Change-Id: Ie3cbf95db6073d838a3a4cdbb72c3f50e0777c01 Reviewed-on: https://dart-review.googlesource.com/55265 Reviewed-by: Ryan Macnak Commit-Queue: Zach Anderson --- DEPS | 2 +- third_party/tcmalloc/BUILD.gn | 2 + third_party/tcmalloc/include/config.h | 19 ++-- .../tcmalloc/include/gperftools/tcmalloc.h | 102 ++++++++++-------- 4 files changed, 73 insertions(+), 52 deletions(-) diff --git a/DEPS b/DEPS index 6e0ad8179b4..e301c12b6d7 100644 --- a/DEPS +++ b/DEPS @@ -47,7 +47,7 @@ vars = { # Scripts that make 'git cl format' work. "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda", - "gperftools_revision": "02eeed29df112728564a5dde6417fa4622b57a06", + "gperftools_revision": "9608fa3bcf8020d35f59fbf70cd3cbe4b015b972", # Revisions of /third_party/* dependencies. "args_tag": "1.4.1", diff --git a/third_party/tcmalloc/BUILD.gn b/third_party/tcmalloc/BUILD.gn index bea04279e76..9ab294df428 100644 --- a/third_party/tcmalloc/BUILD.gn +++ b/third_party/tcmalloc/BUILD.gn @@ -31,6 +31,8 @@ config("internal_config") { "-fno-builtin-posix_memalign", "-fno-builtin-valloc", "-fno-builtin-pvalloc", + "-fsized-deallocation", + "-faligned-new", ] if (is_clang) { cflags += [ "-Wno-unused-const-variable" ] diff --git a/third_party/tcmalloc/include/config.h b/third_party/tcmalloc/include/config.h index 2cd633ac2f3..16b2d7df4ef 100644 --- a/third_party/tcmalloc/include/config.h +++ b/third_party/tcmalloc/include/config.h @@ -6,6 +6,9 @@ #define GPERFTOOLS_CONFIG_H_ +/* Build new/delete operators for overaligned types */ +/* #undef ENABLE_ALIGNED_NEW_DELETE */ + /* Build runtime detection for sized delete */ /* #undef ENABLE_DYNAMIC_SIZED_DELETE */ @@ -206,6 +209,9 @@ /* define if your compiler has __attribute__ */ #define HAVE___ATTRIBUTE__ 1 +/* define if your compiler supports alignment of functions */ +#define HAVE___ATTRIBUTE__ALIGNED_FN 1 + /* Define to 1 if compiler supports __environ */ #if !defined(__ANDROID__) #define HAVE___ENVIRON 1 @@ -220,13 +226,9 @@ /* Define to 1 if int32_t is equivalent to intptr_t */ /* #undef INT32_EQUALS_INTPTR */ -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ +/* Define to the sub-directory where libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" -/* Define to 'volatile' if __malloc_hook is declared volatile */ -#define MALLOC_HOOK_MAYBE_VOLATILE volatile - /* Name of package */ #define PACKAGE "gperftools" @@ -237,7 +239,7 @@ #define PACKAGE_NAME "gperftools" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "gperftools 2.5" +#define PACKAGE_STRING "gperftools 2.7" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gperftools" @@ -246,7 +248,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "2.5" +#define PACKAGE_VERSION "2.7" /* How to access the PC from a struct ucontext */ /* #undef PC_FROM_UCONTEXT */ @@ -293,7 +295,7 @@ /* #undef TCMALLOC_ALIGN_8BYTES */ /* Version number of package */ -#define VERSION "2.5" +#define VERSION "2.7" /* C99 says: define this to get the PRI... macros from stdint.h */ #ifndef __STDC_FORMAT_MACROS @@ -312,3 +314,4 @@ #endif #endif /* #ifndef GPERFTOOLS_CONFIG_H_ */ + diff --git a/third_party/tcmalloc/include/gperftools/tcmalloc.h b/third_party/tcmalloc/include/gperftools/tcmalloc.h index 138d1f97c6c..79350817b31 100644 --- a/third_party/tcmalloc/include/gperftools/tcmalloc.h +++ b/third_party/tcmalloc/include/gperftools/tcmalloc.h @@ -37,30 +37,38 @@ #define TCMALLOC_TCMALLOC_H_ #include /* for size_t */ +#ifdef __cplusplus +#include /* for std::nothrow_t, std::align_val_t */ +#endif /* Define the version number so folks can check against it */ #define TC_VERSION_MAJOR 2 -#define TC_VERSION_MINOR 5 +#define TC_VERSION_MINOR 7 #define TC_VERSION_PATCH "" -#define TC_VERSION_STRING "gperftools 2.5" +#define TC_VERSION_STRING "gperftools 2.7" /* For struct mallinfo, if it's defined. */ #if 1 # include #endif -#ifdef __cplusplus -#define PERFTOOLS_THROW throw() +#ifndef PERFTOOLS_NOTHROW + +#if __cplusplus >= 201103L +#define PERFTOOLS_NOTHROW noexcept +#elif defined(__cplusplus) +#define PERFTOOLS_NOTHROW throw() #else # ifdef __GNUC__ -# define PERFTOOLS_THROW __attribute__((__nothrow__)) +# define PERFTOOLS_NOTHROW __attribute__((__nothrow__)) # else -# define PERFTOOLS_THROW +# define PERFTOOLS_NOTHROW # endif #endif +#endif + #ifndef PERFTOOLS_DLL_DECL -#define PERFTOOLS_DLL_DECL_DEFINED # ifdef _WIN32 # define PERFTOOLS_DLL_DECL __declspec(dllimport) # else @@ -69,10 +77,6 @@ #endif #ifdef __cplusplus -namespace std { -struct nothrow_t; -} - extern "C" { #endif /* @@ -81,27 +85,27 @@ extern "C" { * minor version, and patch-code (a string, usually ""). */ PERFTOOLS_DLL_DECL const char* tc_version(int* major, int* minor, - const char** patch) PERFTOOLS_THROW; + const char** patch) PERFTOOLS_NOTHROW; - PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void tc_free(void* ptr) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void tc_free_sized(void *ptr, size_t size) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void* tc_calloc(size_t nmemb, size_t size) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void tc_cfree(void* ptr) PERFTOOLS_THROW; + PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_free(void* ptr) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_free_sized(void *ptr, size_t size) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void* tc_calloc(size_t nmemb, size_t size) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_cfree(void* ptr) PERFTOOLS_NOTHROW; PERFTOOLS_DLL_DECL void* tc_memalign(size_t __alignment, - size_t __size) PERFTOOLS_THROW; + size_t __size) PERFTOOLS_NOTHROW; PERFTOOLS_DLL_DECL int tc_posix_memalign(void** ptr, - size_t align, size_t size) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void* tc_valloc(size_t __size) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void* tc_pvalloc(size_t __size) PERFTOOLS_THROW; + size_t align, size_t size) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void* tc_valloc(size_t __size) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void* tc_pvalloc(size_t __size) PERFTOOLS_NOTHROW; - PERFTOOLS_DLL_DECL void tc_malloc_stats(void) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL int tc_mallopt(int cmd, int value) PERFTOOLS_THROW; + PERFTOOLS_DLL_DECL void tc_malloc_stats(void) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL int tc_mallopt(int cmd, int value) PERFTOOLS_NOTHROW; #if 1 - PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) PERFTOOLS_THROW; + PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) PERFTOOLS_NOTHROW; #endif /* @@ -111,36 +115,48 @@ extern "C" { * glibc: malloc_usable_size() * Windows: _msize() */ - PERFTOOLS_DLL_DECL size_t tc_malloc_size(void* ptr) PERFTOOLS_THROW; + PERFTOOLS_DLL_DECL size_t tc_malloc_size(void* ptr) PERFTOOLS_NOTHROW; #ifdef __cplusplus - PERFTOOLS_DLL_DECL int tc_set_new_mode(int flag) PERFTOOLS_THROW; + PERFTOOLS_DLL_DECL int tc_set_new_mode(int flag) PERFTOOLS_NOTHROW; PERFTOOLS_DLL_DECL void* tc_new(size_t size); PERFTOOLS_DLL_DECL void* tc_new_nothrow(size_t size, - const std::nothrow_t&) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void tc_delete(void* p) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void tc_delete_sized(void* p, size_t size) throw(); + const std::nothrow_t&) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_delete(void* p) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_delete_sized(void* p, size_t size) PERFTOOLS_NOTHROW; PERFTOOLS_DLL_DECL void tc_delete_nothrow(void* p, - const std::nothrow_t&) PERFTOOLS_THROW; + const std::nothrow_t&) PERFTOOLS_NOTHROW; PERFTOOLS_DLL_DECL void* tc_newarray(size_t size); PERFTOOLS_DLL_DECL void* tc_newarray_nothrow(size_t size, - const std::nothrow_t&) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void tc_deletearray(void* p) PERFTOOLS_THROW; - PERFTOOLS_DLL_DECL void tc_deletearray_sized(void* p, size_t size) throw(); + const std::nothrow_t&) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_deletearray(void* p) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_deletearray_sized(void* p, size_t size) PERFTOOLS_NOTHROW; PERFTOOLS_DLL_DECL void tc_deletearray_nothrow(void* p, - const std::nothrow_t&) PERFTOOLS_THROW; + const std::nothrow_t&) PERFTOOLS_NOTHROW; + +#if 1 && __cplusplus >= 201703L + PERFTOOLS_DLL_DECL void* tc_new_aligned(size_t size, std::align_val_t al); + PERFTOOLS_DLL_DECL void* tc_new_aligned_nothrow(size_t size, std::align_val_t al, + const std::nothrow_t&) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_delete_aligned(void* p, std::align_val_t al) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_delete_sized_aligned(void* p, size_t size, std::align_val_t al) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_delete_aligned_nothrow(void* p, std::align_val_t al, + const std::nothrow_t&) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void* tc_newarray_aligned(size_t size, std::align_val_t al); + PERFTOOLS_DLL_DECL void* tc_newarray_aligned_nothrow(size_t size, std::align_val_t al, + const std::nothrow_t&) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_deletearray_aligned(void* p, std::align_val_t al) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_deletearray_sized_aligned(void* p, size_t size, std::align_val_t al) PERFTOOLS_NOTHROW; + PERFTOOLS_DLL_DECL void tc_deletearray_aligned_nothrow(void* p, std::align_val_t al, + const std::nothrow_t&) PERFTOOLS_NOTHROW; +#endif } #endif -/* We're only un-defining those for public */ +/* We're only un-defining for public */ #if !defined(GPERFTOOLS_CONFIG_H_) -#undef PERFTOOLS_THROW - -#ifdef PERFTOOLS_DLL_DECL_DEFINED -#undef PERFTOOLS_DLL_DECL -#undef PERFTOOLS_DLL_DECL_DEFINED -#endif +#undef PERFTOOLS_NOTHROW #endif /* GPERFTOOLS_CONFIG_H_ */