From f3d0806ca54305aadc63a3adcea171f5ec19d813 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Mon, 6 May 2019 01:22:28 +0000 Subject: [PATCH] [libcxx] Don't use -fvisibility-global-new-delete-hidden when not defining them When builing the hermetic static library, the compiler switch -fvisibility-global-new-delete-hidden is necessary to get the new and delete operator definitions made correctly. However, when those definitions are not included in the library, then this switch does harm. With lld (though not all linkers) setting STV_HIDDEN on SHN_UNDEF symbols makes it an error to leave them undefined or defined via dynamic linking that should generate PLTs for -shared linking (lld makes this a hard error even without -z defs). Though leaving the symbols undefined would usually work in practice if the linker were to allow it (and the user didn't pass -z defs), this actually indicates a real problem that could bite some target configurations more subtly at runtime. For example, x86-32 ELF -fpic code generation uses hidden visibility on declarations in the caller's scope as a signal that the call will never be resolved to a PLT entry and so doesn't have to meet the special ABI requirements for PLT calls (setting %ebx). Since these functions might actually be resolved to PLT entries at link time (we don't know what the user is linking in when the hermetic library doesn't provide all the symbols itself), it's not safe for the compiler to treat their declarations at call sites as having hidden visibility. Differential Revision: https://reviews.llvm.org/D61571 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360003 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/gn/secondary/libcxx/src/BUILD.gn | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/utils/gn/secondary/libcxx/src/BUILD.gn b/utils/gn/secondary/libcxx/src/BUILD.gn index 4b819ffe4c0..9909bb1e373 100644 --- a/utils/gn/secondary/libcxx/src/BUILD.gn +++ b/utils/gn/secondary/libcxx/src/BUILD.gn @@ -84,6 +84,9 @@ config("cxx_config") { "_CRT_STDIO_ISO_WIDE_SPECIFIERS", ] } + if (!libcxx_enable_new_delete_definitions) { + defines += [ "_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS" ] + } if (libcxx_enable_exceptions) { if (current_os == "win") { cflags_cc += [ "/EHsc" ] @@ -97,7 +100,7 @@ config("cxx_config") { } else { cflags_cc += [ "-fno-exceptions" ] } - defines += [ "-D_LIBCPP_NO_EXCEPTIONS" ] + defines += [ "_LIBCPP_NO_EXCEPTIONS" ] } if (!libcxx_enable_rtti) { if (current_os == "win") { @@ -105,7 +108,7 @@ config("cxx_config") { } else { cflags_cc += [ "-fno-rtti" ] } - defines += [ "-D_LIBCPP_NO_RTTI" ] + defines += [ "_LIBCPP_NO_RTTI" ] } } @@ -251,7 +254,9 @@ if (libcxx_enable_static) { sources = cxx_sources if (libcxx_hermetic_static_library) { cflags = [ "-fvisibility=hidden" ] - cflags_cc = [ "-fvisibility-global-new-delete-hidden" ] + if (libcxx_enable_new_delete_definitions) { + cflags_cc = [ "-fvisibility-global-new-delete-hidden" ] + } defines = [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ] } deps = [ -- 2.11.0