From 9a47ba11a7702f5924b9de0865adae8c09ce188c Mon Sep 17 00:00:00 2001 From: Christopher Dykes Date: Wed, 4 May 2016 10:29:15 -0700 Subject: [PATCH] Fix the weak references to JEMalloc under MSVC Summary: While the previous version did compile, it would generate warnings about symbols being defined in multiple places. Reviewed By: yfeldblum Differential Revision: D3255815 fb-gh-sync-id: 72f5079a3973a04bdc0b469b97ba46181e40353b fbshipit-source-id: 72f5079a3973a04bdc0b469b97ba46181e40353b --- folly/detail/Malloc.h | 33 --------------------------------- folly/detail/MallocImpl.cpp | 25 ++++++++++++++++++++++++- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/folly/detail/Malloc.h b/folly/detail/Malloc.h index 4a7fa73b..2b658f2a 100644 --- a/folly/detail/Malloc.h +++ b/folly/detail/Malloc.h @@ -35,39 +35,6 @@ int mallctl(const char*, void*, size_t*, void*, size_t) int mallctlnametomib(const char*, size_t*, size_t*) __attribute__((__weak__)); int mallctlbymib(const size_t*, size_t, void*, size_t*, void*, size_t) __attribute__((__weak__)); -#elif defined(_MSC_VER) -// MSVC doesn't have weak symbols, so do some linker magic -// to emulate them. -extern void* (*mallocx)(size_t, int); -extern const char* mallocxWeak = nullptr; -#pragma comment(linker, "/alternatename:_mallocx=_mallocxWeak") -extern void* (*rallocx)(void*, size_t, int); -extern const char* rallocxWeak = nullptr; -#pragma comment(linker, "/alternatename:_rallocx=_rallocxWeak") -extern size_t(*xallocx)(void*, size_t, size_t, int); -extern const char* xallocxWeak = nullptr; -#pragma comment(linker, "/alternatename:_xallocx=_xallocxWeak") -extern size_t(*sallocx)(const void*, int); -extern const char* sallocxWeak = nullptr; -#pragma comment(linker, "/alternatename:_sallocx=_sallocxWeak") -extern void(*dallocx)(void*, int); -extern const char* dallocxWeak = nullptr; -#pragma comment(linker, "/alternatename:_dallocx=_dallocxWeak") -extern void(*sdallocx)(void*, size_t, int); -extern const char* sdallocxWeak = nullptr; -#pragma comment(linker, "/alternatename:_sdallocx=_sdallocxWeak") -extern size_t(*nallocx)(size_t, int); -extern const char* nallocxWeak = nullptr; -#pragma comment(linker, "/alternatename:_nallocx=_nallocxWeak") -extern int(*mallctl)(const char*, void*, size_t*, void*, size_t); -extern const char* mallctlWeak = nullptr; -#pragma comment(linker, "/alternatename:_mallctl=_mallctlWeak") -extern int(*mallctlnametomib)(const char*, size_t*, size_t*); -extern const char* mallctlnametomibWeak = nullptr; -#pragma comment(linker, "/alternatename:_mallctlnametomib=_mallctlnametomibWeak") -extern int(*mallctlbymib)(const size_t*, size_t, void*, size_t*, void*, size_t); -extern const char* mallctlbymibWeak = nullptr; -#pragma comment(linker, "/alternatename:_mallctlbymib=_mallctlbymibWeak") #else extern void* (*mallocx)(size_t, int); extern void* (*rallocx)(void*, size_t, int); diff --git a/folly/detail/MallocImpl.cpp b/folly/detail/MallocImpl.cpp index 22d95855..36d70e97 100644 --- a/folly/detail/MallocImpl.cpp +++ b/folly/detail/MallocImpl.cpp @@ -18,7 +18,30 @@ extern "C" { -#if !FOLLY_HAVE_WEAK_SYMBOLS +#ifdef _MSC_VER +// MSVC doesn't have weak symbols, so do some linker magic +// to emulate them. +const char* mallocxWeak = nullptr; +#pragma comment(linker, "/alternatename:_mallocx=_mallocxWeak") +const char* rallocxWeak = nullptr; +#pragma comment(linker, "/alternatename:_rallocx=_rallocxWeak") +const char* xallocxWeak = nullptr; +#pragma comment(linker, "/alternatename:_xallocx=_xallocxWeak") +const char* sallocxWeak = nullptr; +#pragma comment(linker, "/alternatename:_sallocx=_sallocxWeak") +const char* dallocxWeak = nullptr; +#pragma comment(linker, "/alternatename:_dallocx=_dallocxWeak") +const char* sdallocxWeak = nullptr; +#pragma comment(linker, "/alternatename:_sdallocx=_sdallocxWeak") +const char* nallocxWeak = nullptr; +#pragma comment(linker, "/alternatename:_nallocx=_nallocxWeak") +const char* mallctlWeak = nullptr; +#pragma comment(linker, "/alternatename:_mallctl=_mallctlWeak") +const char* mallctlnametomibWeak = nullptr; +#pragma comment(linker, "/alternatename:_mallctlnametomib=_mallctlnametomibWeak") +const char* mallctlbymibWeak = nullptr; +#pragma comment(linker, "/alternatename:_mallctlbymib=_mallctlbymibWeak") +#elif !FOLLY_HAVE_WEAK_SYMBOLS void* (*mallocx)(size_t, int) = nullptr; void* (*rallocx)(void*, size_t, int) = nullptr; size_t (*xallocx)(void*, size_t, size_t, int) = nullptr; -- 2.34.1