[Sema] Provide -fvisibility-global-new-delete-hidden option
authorPetr Hosek <phosek@chromium.org>
Tue, 4 Dec 2018 03:25:25 +0000 (03:25 +0000)
committerPetr Hosek <phosek@chromium.org>
Tue, 4 Dec 2018 03:25:25 +0000 (03:25 +0000)
commit821b38f52696e26350f61a66ee43ac60a9b00198
treed1c3600b018e4ff689fe09bcae2c535aac26dacb
parenta4ca4ca29374008401106ee714c7a72bff67555a
[Sema] Provide -fvisibility-global-new-delete-hidden option

When the global new and delete operators aren't declared, Clang
provides and implicit declaration, but this declaration currently
always uses the default visibility. This is a problem when the
C++ library itself is being built with non-default visibility because
the implicit declaration will force the new and delete operators to
have the default visibility unlike the rest of the library.

The existing workaround is to use assembly to enforce the visiblity:
https://fuchsia.googlesource.com/zircon/+/master/system/ulib/zxcpp/new.cpp#108
but that solution is not always available, e.g. in the case of of
libFuzzer which is using an internal version of libc++ that's also built
with -fvisibility=hidden where the existing behavior is causing issues.

This change introduces a new option -fvisibility-global-new-delete-hidden
which makes the implicit declaration of the global new and delete
operators hidden.

Differential Revision: https://reviews.llvm.org/D53787

llvm-svn: 348234
clang/include/clang/Basic/LangOptions.def
clang/include/clang/Driver/Options.td
clang/lib/Driver/ToolChains/Clang.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/lib/Sema/SemaExprCXX.cpp