blob: 6e2294d3965ac22df433fa24ca78033767b9aad4 [file] [log] [blame]
Eric Fiselier1b57fa82016-09-15 22:27:07 +00001========================
2Symbol Visibility Macros
3========================
4
5.. contents::
6 :local:
7
8Overview
9========
10
11Libc++ uses various "visibility" macros in order to provide a stable ABI in
12both the library and the headers. These macros work by changing the
13visibility and inlining characteristics of the symbols they are applied to.
14
15Visibility Macros
16=================
17
18**_LIBCPP_HIDDEN**
19 Mark a symbol as hidden so it will not be exported from shared libraries.
20
21**_LIBCPP_FUNC_VIS**
22 Mark a symbol as being exported by the libc++ library. This attribute must
23 be applied to the declaration of all functions exported by the libc++ dylib.
24
25**_LIBCPP_INLINE_VISIBILITY**
26 Mark a function as hidden and force inlining whenever possible.
27
28**_LIBCPP_ALWAYS_INLINE**
29 A synonym for `_LIBCPP_INLINE_VISIBILITY`
30
31**_LIBCPP_TYPE_VIS**
32 Mark a type's typeinfo and vtable as having default visibility.
33 `_LIBCPP_TYPE_VIS`. This macro has no effect on the visibility of the
34 type's member functions. This attribute cannot be used on class templates.
35
36 **GCC Behavior**: GCC does not support Clang's `type_visibility(...)`
37 attribute. With GCC the `visibility(...)` attribute is used and member
38 functions are affected.
39
40**_LIBCPP_TYPE_VIS_ONLY**
41 The same as `_LIBCPP_TYPE_VIS` except that it may be applied to templates.
42
43 **Windows Behavior**: DLLs do not support dllimport/export on class templates.
44 The macro has an empty definition on this platform.
45
46 Note: This macro should be renamed `_LIBCPP_TEMPLATE_TYPE_VIS`.
47
48**_LIBCPP_ENUM_VIS**
49 Mark the typeinfo of an enum as having default visibility. This attribute
50 should be applied to all enum declarations.
51
52 **Windows Behavior**: DLLs do not support importing or exporting enumeration
53 typeinfo. The macro has an empty definition on this platform.
54
55 **GCC Behavior**: GCC un-hides the typeinfo for enumerations by default, even
56 if `-fvisibility=hidden` is specified. Additionally applying a visibility
57 attribute to an enum class results in a warning. The macro has an empty
58 definition with GCC.
59
60**_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS**
61 Mark the member functions, typeinfo, and vtable of the type named in
62 a `_LIBCPP_EXTERN_TEMPLATE` declaration as being exported by the libc++ library.
63 This attribute must be specified on all extern class template declarations.
64
65 This macro is used to override the `_LIBCPP_TYPE_VIS_ONLY` attribute
66 specified on the primary template and to export the member functions produced
67 by the explicit instantiation in the dylib.
68
69 **GCC Behavior**: GCC ignores visibility attributes applied the type in
70 extern template declarations and applying an attribute results in a warning.
71 However since `_LIBCPP_TYPE_VIS_ONLY` is the same as `_LIBCPP_TYPE_VIS` the
72 visibility is already correct. The macro has an empty definition with GCC.
73
74**_LIBCPP_EXCEPTION_ABI**
75 Mark the member functions, typeinfo, and vtable of the type as being exported
76 by the libc++ library. This macro must be applied to all *exception types*.
77 Exception types must be defined directly in namespace `std` and not the
78 versioning namespace.
79
80Links
81=====
82
83* `[cfe-dev] Visibility in libc++ - 1 <http://lists.llvm.org/pipermail/cfe-dev/2013-July/030610.html>`_
84* `[cfe-dev] Visibility in libc++ - 2 <http://lists.llvm.org/pipermail/cfe-dev/2013-August/031195.html>`_
85* `[libcxx] Visibility fixes for Windows <http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20130805/085461.html>`_