[SelectOpt] Support ADD and SUB with zext operands. (#115489)
[llvm-project.git] / clang / docs / Multilib.rst
blob7637d0db9565b8f21f34d527aa15a1d8dad2d316
1 ========
2 Multilib
3 ========
5 Introduction
6 ============
8 This document describes how multilib is implemented in Clang.
10 What is multilib and why might you care?
11 If you're :doc:`cross compiling<CrossCompilation>` then you can't use native
12 system headers and libraries. To address this, you can use a combination of
13 ``--sysroot``, ``-isystem`` and ``-L`` options to point Clang at suitable
14 directories for your target.
15 However, when there are many possible directories to choose from, it's not
16 necessarily obvious which one to pick.
17 Multilib allows a toolchain designer to imbue the toolchain with the ability to
18 pick a suitable directory automatically, based on the options the user provides
19 to Clang. For example, if the user specifies
20 ``--target=arm-none-eabi -mcpu=cortex-m4`` the toolchain can choose a directory
21 containing headers and libraries suitable for Armv7E-M, because it knows that's
22 a suitable architecture for Arm Cortex-M4.
23 Multilib can also choose between libraries for the same architecture based on
24 other options. For example if the user specifies ``-fno-exceptions`` then a
25 toolchain could select libraries built without exception support, thereby
26 reducing the size of the resulting binary.
28 Design
29 ======
31 Clang supports GCC's ``-print-multi-lib`` and ``-print-multi-directory``
32 options. These are described in
33 `GCC Developer Options <https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Developer-Options.html>`_.
35 There are two ways to configure multilib in Clang: hard-coded or via a
36 configuration file.
38 Hard-coded Multilib
39 ===================
41 The available libraries can be hard-coded in Clang. Typically this is done
42 using the ``MultilibBuilder`` interface in
43 ``clang/include/clang/Driver/MultilibBuilder.h``.
44 There are many examples of this in ``lib/Driver/ToolChains/Gnu.cpp``.
45 The remainder of this document will not focus on this type of multilib.
47 EXPERIMENTAL Multilib via configuration file
48 ============================================
50 Some Clang toolchains support loading multilib configuration from a
51 ``multilib.yaml`` configuration file.
53 A ``multilib.yaml`` configuration file specifies which multilib variants are
54 available, their relative location, what compilation options were used to build
55 them, and the criteria by which they are selected.
57 Multilib processing
58 ===================
60 Clang goes through the following steps to use multilib from a configuration
61 file:
63 #. Normalize command line options. Clang can accept the same
64    information via different options - for example,
65    ``--target=arm-none-eabi -march=armv7-m`` and
66    ``--target=armv7m-none-eabi`` are equivalent.
67    Clang normalizes the command line before passing them to the multilib system.
68    To see what flags are emitted for a given set of command line options, use
69    the ``-print-multi-flags-experimental`` command line option
70    along with the rest of the options you want to use.
71 #. Load ``multilib.yaml`` from sysroot.
72 #. Generate additional flags. ``multilib.yaml`` contains a ``Mappings`` section,
73    which specifies how to generate additional flags based on the flags derived
74    from command line options. Flags are matched using regular expressions.
75    These regular expressions shall use the POSIX extended regular expression
76    syntax.
77 #. Match flags against multilib variants. If the generated flags are a superset
78    of the flags specified for a multilib variant then the variant is considered
79    a match.
80    If more than one variant matches then a toolchain may opt to either use only
81    the *last* matching multilib variant, or may use all matching variants,
82    thereby :ref:`layering<multilib-layering>` them.
83 #. Generate ``-isystem`` and ``-L`` options. Iterate in reverse order over
84    the matching multilib variants, and generate ``-isystem`` and ``-L``
85    options based on the multilib variant's directory.
87 .. _multilib-layering:
89 Multilib layering
90 =================
92 When Clang selects multilib variants, it may find that more than one variant
93 matches.
95 It is up to the ToolChain subclass to decide what to do in this case.
96 There are two options permitted:
98 #. Use only the *last* matching multilib variant. This option exists primarily
99    for compatibility with the previous multilib design.
100 #. Use all matching variants, thereby layering them.
102 This decision is hard-coded per ToolChain subclass. The latter option is
103 preferred for ToolChain subclasses without backwards compatibility
104 requirements.
106 If the latter option is chosen then ``-isystem`` and ``-L`` options will be
107 generated for each matching multilib variant, in reverse order.
109 This means that the compiler or linker will find files in the last matching
110 multilib variant that has the given file.
111 This behaviour permits multilib variants with only a partial set of files.
112 This means a toolchain can be distributed with one base multilib variant
113 containing all system headers and includes, and more specialised multilib
114 variants containing only files that are different to those in the base variant.
116 For example, a multilib variant could be compiled with ``-fno-exceptions``.
117 This option doesn't affect the content of header files, nor does it affect the
118 C libraries. Therefore if multilib layering is supported by the ToolChain
119 subclass and a suitable base multilib variant is present then the
120 ``-fno-exceptions`` multilib variant need only contain C++ libraries.
122 It is the responsibility of layered multilib authors to ensure that headers and
123 libraries in each layer are complete enough to mask any incompatibilities.
125 Stability
126 =========
128 Multilib via configuration file shall be considered an experimental feature
129 until LLVM 18, at which point ``-print-multi-flags-experimental``
130 should be renamed to ``-print-multi-flags``.
131 A toolchain can opt in to using this feature by including a ``multilib.yaml``
132 file in its distribution, once support for it is added in relevant ToolChain
133 subclasses.
134 Once stability is reached, flags emitted by ``-print-multi-flags``
135 should not be removed or changed, although new flags may be added.
137 Restrictions
138 ============
140 Despite the name, multilib is used to locate both ``include`` and ``lib``
141 directories. Therefore it is important that consistent options are passed to
142 the Clang driver when both compiling and linking. Otherwise inconsistent
143 ``include`` and ``lib`` directories may be used, and the results will be
144 undefined.
146 EXPERIMENTAL multilib.yaml
147 ==========================
149 The below example serves as a small of a possible multilib, and documents
150 the available options.
152 For a more comprehensive example see
153 ``clang/test/Driver/baremetal-multilib.yaml`` in the ``llvm-project`` sources.
155 .. code-block:: yaml
157   # multilib.yaml
159   # This format is experimental and is likely to change!
161   # Syntax is YAML 1.2
163   # This required field defines the version of the multilib.yaml format.
164   # Clang will emit an error if this number is greater than its current multilib
165   # version or if its major version differs, but will accept lesser minor
166   # versions.
167   MultilibVersion: 1.0
169   # The rest of this file is in two parts:
170   # 1. A list of multilib variants.
171   # 2. A list of regular expressions that may match flags generated from
172   #    command line options, and further flags that shall be added if the
173   #    regular expression matches.
174   # It is acceptable for the file to contain properties not documented here,
175   # and these will be ignored by Clang.
177   # List of multilib variants. Required.
178   # The ordering of items in the variants list is important if more than one
179   # variant can match the same set of flags. See the docs on multilib layering
180   # for more info.
181   Variants:
183   # Example of a multilib variant targeting Arm v6-M.
184   # Dir is the relative location of the directory containing the headers
185   # and/or libraries.
186   # Exactly how Dir is used is left up to the ToolChain subclass to define, but
187   # typically it will be joined to the sysroot.
188   - Dir: thumb/v6-m
189     # List of one or more normalized command line options, as generated by Clang
190     # from the command line options or from Mappings below.
191     # Here, if the flags are a superset of {target=thumbv6m-unknown-none-eabi}
192     # then this multilib variant will be considered a match.
193     Flags: [--target=thumbv6m-unknown-none-eabi]
195   # Similarly, a multilib variant targeting Arm v7-M with an FPU (floating
196   # point unit).
197   - Dir: thumb/v7-m
198     # Here, the flags generated by Clang must be a superset of
199     # {--target=thumbv7m-none-eabi, -mfpu=fpv4-sp-d16} for this multilib variant
200     # to be a match.
201     Flags: [--target=thumbv7m-none-eabi, -mfpu=fpv4-sp-d16]
203   # If there is no multilib available for a particular set of flags, and the
204   # other multilibs are not adequate fallbacks, then you can define a variant
205   # record with an Error key in place of the Dir key.
206   - Error: this multilib collection has no hard-float ABI support
207     Flags: [--target=thumbv7m-none-eabi, -mfloat-abi=hard]
210   # The second section of the file is a list of regular expressions that are
211   # used to map from flags generated from command line options to custom flags.
212   # This is optional.
213   # Each regular expression must match a whole flag string.
214   # Flags in the "Flags" list will be added if any flag generated from command
215   # line options matches the regular expression.
216   Mappings:
218   # Set a "--target=thumbv7m-none-eabi" flag if the regular expression matches
219   # any of the flags generated from the command line options.
220   # Match is a POSIX extended regular expression string.
221   - Match: --target=thumbv([7-9]|[1-9][0-9]+).*
222     # Flags is a list of one or more strings.
223     Flags: [--target=thumbv7m-none-eabi]
225 Design principles
226 =================
228 Stable interface
229 ----------------
231 ``multilib.yaml`` and ``-print-multi-flags-experimental`` are new
232 interfaces to Clang. In order for them to be usable over time and across LLVM
233 versions their interfaces should be stable.
234 The new multilib system will be considered experimental in LLVM 17, but in
235 LLVM 18 it will be stable. In particular this is important to which multilib
236 selection flags Clang generates from command line options. Once a flag is
237 generated by a released version of Clang it may be used in ``multilib.yaml``
238 files that exist independently of the LLVM release cycle, and therefore
239 ceasing to generate the flag would be a breaking change and should be
240 avoided.
242 However, an exception is the normalization of ``-march``.
243 ``-march`` for Arm architectures contains a list of enabled and disabled
244 extensions and this list is likely to grow. Therefore ``-march`` flags are
245 unstable.
247 Incomplete interface
248 --------------------
250 The new multilib system does multilib selection based on only a limited set of
251 command line options, and limits which flags can be used for multilib
252 selection. This is in order to avoid committing to too large an interface.
253 Later LLVM versions can add support for multilib selection from more command
254 line options as needed.
256 Extensible
257 ----------
259 It is likely that the configuration format will need to evolve in future to
260 adapt to new requirements.
261 Using a format like YAML that supports key-value pairs helps here as it's
262 trivial to add new keys alongside existing ones.
264 Backwards compatibility
265 -----------------------
267 New versions of Clang should be able to use configuration written for earlier
268 Clang versions.
269 To avoid behaving in a way that may be subtly incorrect, Clang should be able
270 to detect if the configuration is too new and emit an error.
272 Forwards compatibility
273 ----------------------
275 As an author of a multilib configuration, it should be possible to design the
276 configuration in such a way that it is likely to work well with future Clang
277 versions. For example, if a future version of Clang is likely to add support
278 for newer versions of an architecture and the architecture is known to be
279 designed for backwards compatibility then it should be possible to express
280 compatibility for such architecture versions in the multilib configuration.
282 Not GNU spec files
283 ------------------
285 The GNU spec files standard is large and complex and there's little desire to
286 import that complexity to LLVM. It's also heavily oriented towards processing
287 command line argument strings which is hard to do correctly, hence the large
288 amount of logic dedicated to that task in the Clang driver. While compatibility
289 with GNU would bring benefits, the cost in this case is deemed too high.
291 Avoid re-inventing feature detection in the configuration
292 ---------------------------------------------------------
294 A large amount of logic in the Clang driver is dedicated to inferring which
295 architectural features are available based on the given command line options.
296 It is neither desirable nor practical to repeat such logic in each multilib
297 configuration. Instead the configuration should be able to benefit from the
298 heavy lifting Clang already does to detect features.
300 Low maintenance
301 ---------------
303 Multilib is a relatively small feature in the scheme of things so supporting it
304 should accordingly take little time. Where possible this should be achieved by
305 implementing it in terms of existing features in the LLVM codebase.
307 Minimal additional API surface
308 ------------------------------
310 The greater the API surface, the greater the difficulty of keeping it stable.
311 Where possible the additional API surface should be kept small by defining it
312 in relation to existing APIs. An example of this is keeping a simple
313 relationship between flag names and command line options where possible.
314 Since the command line options are part of a stable API they are unlikely
315 to change, and therefore the flag names get the same stability.
317 Low compile-time overhead
318 -------------------------
320 If the process of selecting multilib directories must be done on every
321 invocation of the Clang driver then it must have a negligible impact on
322 overall compile time.