Disabling Runtime Type Information
By default, LLVM compiles with the -fno-rtti option, which disables runtime type information.
According to the LLVM coding standard, the compiler disables the information to reduce code and executable size.
Yet, sometimes, a type must be associated with a unique identifier.
One example involves llvm::Any, the LLVM version of std::any.
A typical imp.
Fine-Grained Control Over Symbol Visibility
A straightforward fix for the incompatibility we've uncovered is to explicitly state that TypeId::Idmust always have the default visibility.
We can make this change as follows: Let's check that the fix works: The Vfor a weak symbol has returned, but that's not the end of the story.
Instead of parameterizing TypeId by int, let's parameterize it by a.
Hidden Visibility
Parts of LLVM are compiled with -fvisibility=hidden.
This option forces the default visibility of all symbols to be hidden, which prevents them from being visible across library boundaries.
Hiding symbols offers better control over exported symbols in a shared library.
What happens when the TypeIdconstruct from the previous section is combined with.
How do I hide a GCC exception?
In your build system (Makefile etc), you will probably wish to add the -fvisibility=hidden and -fvisibility-inlines-hidden options to the command line arguments of every GCC invocation.
Remember to test your library thoroughly afterwards, including:
that all exceptions correctly traverse shared object boundaries. The LLVM Package Build
The build on the Fedora Rawhide versionshould be an easy task at the packaging level: Now, let's introduce the characters in the mystery to follow.
What does -fvisibility=hidden mean in LLVM?
template struct TypeId { static const char Id; }; Parts of LLVM are compiled with -fvisibility=hidden.
This option forces the default visibility of all symbols to be hidden, which prevents them from being visible across library boundaries.
Hiding symbols offers better control over exported symbols in a shared library.
What is default visibility for a type thrown across a shared object?
Just like functions and variables, types that are thrown between multiple shared objects are public interfaces and must have default visibility.
The obvious first step is to mark all types throwable across shared object boundaries always as default visibility.
Where Theory Meets LLVM
Once we isolated the behavior described in the preceding section, we could easily provide the relevant patches in LLVM:.
1) Force visibility of llvm::Anyto external.
2) Fine grain control over some symbol visibility 3.
Add extra check for llvm::Any::TypeIdvisibility These patches fix the build issue mentioned at the beginning of the article and ensur.
Why did gcc add -fvisibility=hidden?
This causes GCC to generate optimal code.
But this is of course cumbersome:
this is why -fvisibility was added.
With -fvisibility=hidden, you are telling GCC that every declaration not explicitly marked with a visibility attribute has a hidden visibility.