From 3888eb66b004c0d4701330c8097566a734c4aec1 Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Wed, 28 Sep 2016 22:28:51 +0000 Subject: [PATCH] [libc++] Clarify _LIBCPP_NEW_DELETE_VIS for Windows Replace a stale reference to cxx_EXPORTS with _LIBCPP_BUILDING_LIBRARY, and clarify why the operator new and delete family of functions are marked dllexport when building but *not* dllimport when including the header externally. The new code is identical to the intent of the old code (and would be functionally equivalent were cxx_EXPORTS still defined when building libc++). The overall behavior is not ideal, since Microsoft's operator new and delete functions will get called instead of libc++'s, but I think consistently calling msvcrt's functions is better than either calling msvcrt's or libc++'s functions depending on header inclusion. Differential Revision: https://reviews.llvm.org/D25042 llvm-svn: 282644 --- libcxx/docs/DesignDocs/VisibilityMacros.rst | 13 +++++++++++++ libcxx/include/new | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/libcxx/docs/DesignDocs/VisibilityMacros.rst b/libcxx/docs/DesignDocs/VisibilityMacros.rst index f7d1400341f8..f45d67b17ea2 100644 --- a/libcxx/docs/DesignDocs/VisibilityMacros.rst +++ b/libcxx/docs/DesignDocs/VisibilityMacros.rst @@ -108,6 +108,19 @@ Visibility Macros versioning namespace. This allows throwing and catching some exception types between libc++ and libstdc++. +**_LIBCPP_NEW_DELETE_VIS** + Mark a symbol as being exported by the libc++ library. This macro must be + applied to all `operator new` and `operator delete` overloads. + + **Windows Behavior**: When using the Microsoft CRT, all the `operator new` and + `operator delete` overloads are defined statically in `msvcrt.lib`. Marking + them as `dllimport` in the libc++ `` header is therefore undesirable: if + we were to mark them as `dllimport` and then link against libc++, source files + which included `` would end up linking against libc++'s `operator new` + and `operator delete`, while source files which did not include `` would + end up linking against msvcrt's `operator new` and `operator delete`, which + would be a confusing and potentially error-prone inconsistency. + Links ===== diff --git a/libcxx/include/new b/libcxx/include/new index 936f9ee0b401..16b3011efb26 100644 --- a/libcxx/include/new +++ b/libcxx/include/new @@ -125,8 +125,8 @@ _LIBCPP_FUNC_VIS new_handler get_new_handler() _NOEXCEPT; } // std -#if defined(_WIN32) && !defined(cxx_EXPORTS) -# define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS_ONLY +#if defined(_LIBCPP_MSVCRT) && !defined(_LIBCPP_BUILDING_LIBRARY) +# define _LIBCPP_NEW_DELETE_VIS #else # define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS #endif