From f0aa1a78fb209310e8baef53c02f365fca518d11 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Fri, 27 Feb 2015 10:05:22 +0100 Subject: For Clang -fsanitize=vptr use -fvisibility-ms-compat, not -fvisibility=hidden As discussed in b4f6b26b5a1a78fecfa95ec2eb7ac8b80495d8aa "SAL_DLLPUBLIC_RTTI for proper RTTI visibility for LLVM," RTTI-based -fsanitize= checks with Clang on Linux need special precautions to make RTTI symbols visible across DSOs. The approach taken there, as well as in 598d8194b0ea1a64e0ebba28a86c128bafa57c7c "Visible function type RTTI for Clang -fsanitize=function," was to add explicit SAL_DLLPUBLIC_RTTI annontations to relevant type definitions. However, for -fsanitize=vptr that would have required many more of those, so it appears easier to "misuse" -fsanitize-ms-compat in that case, which happens to give all RTTI symbols default visibility (while otherwise still honoring our SAL_DLLPUBLIC/PRIVATE annotations). The SAL_DLLPUBLIC_RTTI annotations from 598d8194b0ea1a64e0ebba28a86c128bafa57c7c "Visible function type RTTI for Clang -fsanitize=function" can likely be removed again. Change-Id: Ibeff7ab8c908111a7dc66ff0677204f112b24db8 --- solenv/gbuild/platform/com_GCC_defs.mk | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'solenv') diff --git a/solenv/gbuild/platform/com_GCC_defs.mk b/solenv/gbuild/platform/com_GCC_defs.mk index 7f8b617bfaba..319ea9fb0495 100644 --- a/solenv/gbuild/platform/com_GCC_defs.mk +++ b/solenv/gbuild/platform/com_GCC_defs.mk @@ -89,7 +89,13 @@ ifeq ($(HAVE_GCC_VISIBILITY_FEATURE),TRUE) gb_VISIBILITY_FLAGS := -DHAVE_GCC_VISIBILITY_FEATURE # If CC or CXX already include -fvisibility=hidden, don't duplicate it ifeq (,$(filter -fvisibility=hidden,$(CC))) -gb_VISIBILITY_FLAGS += -fvisibility=hidden +gb__visibility_hidden := -fvisibility=hidden +ifeq ($(COM_GCC_IS_CLANG),TRUE) +ifneq ($(filter -fsanitize=%,$(CC)),) +gb__visibility_hidden := -fvisibility-ms-compat +endif +endif +gb_VISIBILITY_FLAGS += $(gb__visibility_hidden) endif ifneq ($(HAVE_GCC_VISIBILITY_BROKEN),TRUE) gb_VISIBILITY_FLAGS_CXX := -fvisibility-inlines-hidden -- cgit