[MemProf] Templatize CallStackRadixTreeBuilder (NFC) (#117014)
[llvm-project.git] / flang / docs / FlangDriver.md
blob23cbab30ee903e57e853bf7404cd20cf3d2c9d81
1 <!--===- docs/FlangDriver.md
3    Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4    See https://llvm.org/LICENSE.txt for license information.
5    SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 -->
9 # Flang drivers
11 ```{contents}
12 ---
13 local:
14 ---
15 ```
17 There are two main drivers in Flang:
18 * the compiler driver, `flang`
19 * the frontend driver, `flang -fc1`
21 The **compiler driver** will allow you to control all compilation phases (e.g.
22 preprocessing, semantic checks, code-generation, code-optimisation, lowering
23 and linking). For frontend specific tasks, the compiler driver creates a
24 Fortran compilation job and delegates it to `flang -fc1`, the frontend
25 driver. For linking, it creates a linker job and calls an external linker (e.g.
26 LLVM's [`lld`](https://lld.llvm.org/)). It can also call other tools such as
27 external assemblers (e.g. [`as`](https://www.gnu.org/software/binutils/)). In
28 Clang, the compiler driver can also link the generated binaries with LLVM's
29 static analysis/sanitizer libraries (e.g.
30 [MemorySanitizer](https://clang.llvm.org/docs/MemorySanitizer.html)). This is
31 not yet available in Flang, but will be relatively easy to support once such
32 libraries become available. Flang's compiler driver is intended for Flang's
33 end-users - its interface needs to remain stable. Otherwise, Flang's users will
34 have to adjust their build scripts every time a compiler flag is changed.
36 | ![Compiler Driver](compiler_driver.png) |
37 |:--:|
38 | *Flang’s compiler driver and the **tools** that it runs* |
40 The **frontend driver** glues together and drives all of the Flang's frontend
41 libraries. As such, it provides an easy-to-use and intuitive interface to the
42 frontend. It uses MLIR and LLVM for code-generation and can be viewed as a
43 driver for Flang, LLVM and MLIR libraries. Contrary to the compiler driver, it
44 is not capable of calling any external tools (including linkers).  It is aware
45 of all the frontend internals that are "hidden" from the compiler driver. It
46 accepts many frontend-specific options not available in `flang` and as such
47 it provides a finer control over the frontend. Note that this tool is mostly
48 intended for Flang developers. In particular, there are no guarantees about the
49 stability of its interface and compiler developers can use it to experiment
50 with new flags.
52 | ![Frontend Driver](frontend_driver.png) |
53 |:-:|
54 | *Flang's frontend driver and the **libraries** that it drives* |
56 Note that similarly to `-Xclang` in `clang`, you can use `-Xflang` to forward a
57 frontend specific flag from the _compiler_ directly to the _frontend_ driver,
58 e.g.:
60 ```bash
61 flang -Xflang -fdebug-dump-parse-tree input.f95
62 ```
64 In the invocation above, `-fdebug-dump-parse-tree` is forwarded to `flang
65 -fc1`. Without the forwarding flag, `-Xflang`, you would see the following
66 warning:
68 ```bash
69 flang: warning: argument unused during compilation:
70 ```
72 As `-fdebug-dump-parse-tree` is only supported by `flang -fc1`, `flang`
73 will ignore it when used without `Xflang`.
75 ## Why Do We Need Two Drivers?
76 As hinted above, `flang` and `flang -fc1` are two separate tools. The
77 fact that these tools are accessed through one binary, `flang`, is just an
78 implementation detail. Each tool has a separate list of options, albeit defined
79 in the same file: `clang/include/clang/Driver/Options.td`.
81 The separation helps us split various tasks and allows us to implement more
82 specialised tools. In particular, `flang` is not aware of various
83 compilation phases within the frontend (e.g. scanning, parsing or semantic
84 checks). It does not have to be. Conversely, the frontend driver, `flang
85 -fc1`, needs not to be concerned with linkers or other external tools like
86 assemblers. Nor does it need to know where to look for various systems
87 libraries, which is usually OS and platform specific.
89 One helpful way of differentiating these tools is to keep in mind that:
91 * the compiler driver is an end-user tool
92 * frontend driver is a compiler developer tool with many additional options,
94 Also, Since the compiler driver can call external tools, e.g. linkers, it can
95 be used to generate **executables**. The frontend driver cannot call external
96 tools and hence can only generate **object files**. A similar model is
97 implemented in Clang (`clang` vs `clang -cc1` vs `clang -cc1as`), which is
98 based on the [architecture of
99 GCC](https://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/GNU_C_Compiler_Architecture).
100 In fact, Flang needs to adhere to this model in order to be able to re-use
101 Clang's driver library. If you are more familiar with the [architecture of
102 GFortran](https://gcc.gnu.org/onlinedocs/gcc-4.7.4/gfortran/About-GNU-Fortran.html)
103 than Clang, then `flang` corresponds to `gfortran` and `flang -fc1` to
104 `f951`.
106 ## Compiler Driver
107 The main entry point for Flang's compiler driver is implemented in
108 `flang/tools/flang-driver/driver.cpp`.  Flang's compiler driver is implemented
109 in terms of Clang's driver library, `clangDriver`. This approach allows us to:
110 * benefit from Clang's support for various targets, platforms and operating systems
111 * leverage Clang's ability to drive various backends available in LLVM, as well
112   as linkers and assemblers.
113 One implication of this dependency on Clang is that all of Flang's compiler
114 options are defined alongside Clang's options in
115 `clang/include/clang/Driver/Options.td`. For options that are common for both
116 Flang and Clang, the corresponding definitions are shared.
118 Internally, a `clangDriver` based compiler driver works by creating actions
119 that correspond to various compilation phases, e.g. `PreprocessJobClass`,
120 `CompileJobClass`, `BackendJobClass` or `LinkJobClass` from the
121 `clang::driver::Action::ActionClass` enum. There are also other, more
122 specialised actions, e.g. `MigrateJobClass` or `InputClass`, that do not map
123 directly to common compilation steps. The actions to run are determined from
124 the supplied compiler flags, e.g.
126 * `-E` for `PreprocessJobClass`,
127 * `-c` for `CompileJobClass`.
129 In most cases, the driver creates a chain of actions/jobs/phases where the
130 output from one action is the input for the subsequent one. You can use the
131 `-ccc-print-phases` flag to see the sequence of actions that the driver will
132 create for your compiler invocation:
133 ```bash
134 flang -ccc-print-phases -E file.f
135 +- 0: input, "file.f", f95-cpp-input
136 1: preprocessor, {0}, f95
138 As you can see, for `-E` the driver creates only two jobs and stops immediately
139 after preprocessing. The first job simply prepares the input. For `-c`, the
140 pipeline of the created jobs is more complex:
141 ```bash
142 flang -ccc-print-phases -c file.f
143          +- 0: input, "file.f", f95-cpp-input
144       +- 1: preprocessor, {0}, f95
145    +- 2: compiler, {1}, ir
146 +- 3: backend, {2}, assembler
147 4: assembler, {3}, object
149 The other phases are printed nonetheless when using `-ccc-print-phases`, as
150 that reflects what `clangDriver`, the library, will try to create and run.
152 For actions specific to the frontend (e.g. preprocessing or code generation), a
153 command to call the frontend driver is generated (more specifically, an
154 instance of `clang::driver::Command`). Every command is bound to an instance of
155 `clang::driver::Tool`. For Flang we introduced a specialisation of this class:
156 `clang::driver::Flang`. This class implements the logic to either translate or
157 forward compiler options to the frontend driver, `flang -fc1`.
159 You can read more on the design of `clangDriver` in Clang's [Driver Design &
160 Internals](https://clang.llvm.org/docs/DriverInternals.html).
162 ## Linker Driver
163 When used as a linker, Flang's frontend driver assembles the command line for an
164 external linker command (e.g., LLVM's `lld`) and invokes it to create the final
165 executable by linking static and shared libraries together with all the
166 translation units supplied as object files.
168 By default, the Flang linker driver adds several libraries to the linker
169 invocation to make sure that all entrypoints for program start
170 (Fortran's program unit) and runtime routines can be resolved by the linker.
172 An abridged example (only showing the Fortran specific linker flags, omission
173 indicated by `[...]`) for such a linker invocation on a Linux system would look
174 like this:
177 $ flang -v -o example example.o
178 "/usr/bin/ld" [...] example.o [...] "-lFortranRuntime" "-lFortranDecimal" [...]
181 The automatically added libraries are:
183 * `FortranRuntime`: Provides most of the Flang runtime library.
184 * `FortranDecimal`: Provides operations for decimal numbers.
186 If the code is C/C++ based and invokes Fortran routines, one can either use Clang
187 or Flang as the linker driver.  If Clang is used, it will automatically all
188 required runtime libraries needed by C++ (e.g., for STL) to the linker invocation.
189 In this case, one has to explicitly provide the Fortran runtime libraries
190 `FortranRuntime` and/or `FortranDecimal`.  An alternative is to use Flang to link.
191 In this case, it may be required to explicitly supply C++ runtime libraries.
193 On Darwin, the logical root where the system libraries are located (sysroot)
194 must be specified. This can be done with the CMake build flag `DEFAULT_SYSROOT`
195 or by using the `-isysroot` flag when linking a binary. On other targets
196 `-isysroot` doesn't change the linker command line (it only affects the header
197 search path). While with Clang `-isysroot` also changes the sysroot for
198 includes, with Flang (and Fortran in general) it only affects Darwin libraries'
199 sysroot.
201 ## Frontend Driver
202 Flang's frontend driver is the main interface between compiler developers and
203 the Flang frontend. The high-level design is similar to Clang's frontend
204 driver, `clang -cc1` and consists of the following classes:
205 * `CompilerInstance`, which is a helper class that encapsulates and manages
206   various objects that are always required by the frontend (e.g. `AllSources`,
207   `AllCookedSources, `Parsing`, `CompilerInvocation`, etc.). In most cases
208   `CompilerInstance` owns these objects, but it also can share them with its
209   clients when required. It also implements utility methods to construct and
210   manipulate them.
211 * `CompilerInvocation` encapsulates the configuration of the current
212   invocation of the compiler as derived from the command-line options and the
213   input files (in particular, file extensions). Among other things, it holds an
214   instance of `FrontendOptions`. Like `CompilerInstance`, it owns the objects
215   that it manages. It can share them with its clients that want to access them
216   even after the corresponding `CompilerInvocation` has been destructed.
217 * `FrontendOptions` holds options that control the behaviour of the frontend,
218   as well as e.g. the list of the input files. These options come either
219   directly from the users (through command-line flags) or are derived from
220   e.g. the host system configuration.
221 * `FrontendAction` and `FrontendActions` (the former being the base class for
222   the latter) implement the actual actions to perform by the frontend. Usually
223   there is one specialisation of `FrontendActions` for every compiler action flag
224   (e.g. `-E`, `-fdebug-unparse`). These classes also contain various hooks that
225   allow you to e.g. fine-tune the configuration of the frontend based on the
226   input.
228 This list is not exhaustive and only covers the main classes that implement the
229 driver. The main entry point for the frontend driver, `fc1_main`, is
230 implemented in `flang/tools/flang-driver/driver.cpp`. It can be accessed by
231 invoking the compiler driver, `flang`, with the `-fc1` flag.
233 The frontend driver will only run one action at a time. If you specify multiple
234 action flags, only the last one will be taken into account. The default action
235 is `ParseSyntaxOnlyAction`, which corresponds to `-fsyntax-only`. In other
236 words, `flang -fc1 <input-file>` is equivalent to `flang -fc1 -fsyntax-only
237 <input-file>`.
239 ## Adding new Compiler Options
240 Adding a new compiler option in Flang consists of two steps:
241 * define the new option in a dedicated TableGen file,
242 * parse and implement the option in the relevant drivers that support it.
244 ### Option Definition
245 All of Flang's compiler and frontend driver options are defined in
246 `clang/include/clang/Driver/Options.td` in Clang. When adding a new option to
247 Flang, you will either:
248   * extend the existing definition for an option that is already available
249     in one of Clang's drivers (e.g.  `clang`), but not yet available in Flang, or
250   * add a completely new definition if the option that you are adding has not
251     been defined yet.
253 There are many predefined TableGen classes and records that you can use to fine
254 tune your new option. The list of available configurations can be overwhelming
255 at times. Sometimes the easiest approach is to find an existing option that has
256 similar semantics to your new option and start by copying that.
258 For every new option, you will also have to define the visibility of the new
259 option. This is controlled through the `Visibility` field. You can use the
260 following Flang specific visibility flags to control this:
261   * `FlangOption` - this option will be available in the `flang` compiler driver,
262   * `FC1Option` - this option will be available in the `flang -fc1` frontend driver,
264 Options that are supported by clang should explicitly specify `ClangOption` in
265 `Visibility`, and options that are only supported in Flang should not specify
266 `ClangOption`.
268 When deciding what `OptionGroup` to use when defining a new option in the
269 `Options.td` file, many new options fall into one of the following two
270 categories:
271   * `Action_Group` - options that define an action to run (e.g.
272     `-fsyntax-only`, `-E`)
273   * `f_Group` - target independent compiler flags (e.g. `-ffixed-form`,
274     `-fopenmp`)
275 There are also other groups and occasionally you will use them instead of the
276 groups listed above.
278 ### Option Implementation
279 First, every option needs to be parsed. Flang compiler options are parsed in
280 two different places, depending on which driver they belong to:
282 * frontend driver: `flang/lib/Frontend/CompilerInvocation.cpp`,
283 * compiler driver: `clang/lib/Driver/ToolChains/Flang.cpp`.
285 The parsing will depend on the semantics encoded in the TableGen definition.
287 When adding a compiler driver option (i.e. an option that contains
288 `FlangOption` among in it's `Visibility`) that you also intend to be understood
289 by the frontend, make sure that it is either forwarded to `flang -fc1` or
290 translated into some other option that is accepted by the frontend driver. In
291 the case of options that contain both `FlangOption` and `FC1Option` among its
292 flags, we usually just forward from `flang` to `flang -fc1`. This is
293 then tested in `flang/test/Driver/frontend-forward.F90`.
295 What follows is usually very dependant on the meaning of the corresponding
296 option. In general, regular compiler flags (e.g. `-ffree-form`) are mapped to
297 some state within the driver. A lot of this state is stored within an instance
298 of `FrontendOptions`, but there are other more specialised classes too. Action
299 flags (e.g. `-fsyntax-only`) are usually more complex overall, but also more
300 structured in terms of the implementation.
302 ### Action Options
303 For options that correspond to an action (i.e. marked as `Action_Group`), you
304 will have to define a dedicated instance of `FrontendActions` in
305 `flang/include/flang/Frontend/FrontendOptions.h`. For example, for
306 `-fsyntax-only` we defined:
307 ```cpp
308 class ParseSyntaxOnlyAction : public PrescanAndSemaAction {
309   void ExecuteAction() override;
312 Command line options are mapped to frontend actions through the
313 `Fortran::frontend::ActionKind` enum.  For every new action option that you
314 add, you will have to add a dedicated entry in that enum (e.g.
315 `ParseSyntaxOnly` for `-fsyntax-only`) and a corresponding `case` in
316 `ParseFrontendArgs` function in the `CompilerInvocation.cpp` file, e.g.:
317 ```cpp
318     case clang::driver::options::OPT_fsyntax_only:
319       opts.programAction = ParseSyntaxOnly;
320       break;
322 Note that this simply sets the program/frontend action within the frontend
323 driver. You still have make sure that the corresponding frontend action class
324 is instantiated when your new action option is used. The relevant `switch`
325 statement is implemented in `Fortran::frontend::CreatedFrontendBaseAction` in
326 the `ExecuteCompilerInvocation.cpp` file. Here's an example for
327 `-fsyntax-only`:
328 ```cpp
329   case ParseSyntaxOnly:
330     return std::make_unique<ParseSyntaxOnlyAction>();
332 At this point you should be able to trigger that frontend action that you have
333 just added using your new frontend option.
336 ## CMake Support
337 As of [#7246](https://gitlab.kitware.com/cmake/cmake/-/merge_requests/7246)
338 (CMake 3.28.0), `cmake` can detect `flang` as a
339 supported Fortran compiler. You can configure your CMake projects to use
340 `flang` as follows:
341 ```bash
342 cmake -DCMAKE_Fortran_COMPILER=<path/to/flang> <src/dir>
344 You should see the following in the output:
346 -- The Fortran compiler identification is LLVMFlang <version>
348 where `<version>` corresponds to the LLVM Flang version.
350 ## Testing
351 In LIT, we define two variables that you can use to invoke Flang's drivers:
352 * `%flang` is expanded as `flang` (i.e. the compiler driver)
353 * `%flang_fc1` is expanded as `flang -fc1` (i.e. the frontend driver)
355 For most regression tests for the frontend, you will want to use `%flang_fc1`.
356 In some cases, the observable behaviour will be identical regardless of whether
357 `%flang` or `%flang_fc1` is used. However, when you are using `%flang` instead
358 of `%flang_fc1`, the compiler driver will add extra flags to the frontend
359 driver invocation (i.e. `flang -fc1 -<extra-flags>`). In some cases that might
360 be exactly what you want to test.  In fact, you can check these additional
361 flags by using the `-###` compiler driver command line option.
363 Lastly, you can use `! REQUIRES: <feature>` for tests that will only work when
364 `<feature>` is available. For example, you can use`! REQUIRES: shell` to mark a
365 test as only available on Unix-like systems (i.e. systems that contain a Unix
366 shell). In practice this means that the corresponding test is skipped on
367 Windows.
369 ## Frontend Driver Plugins
370 Plugins are an extension to the frontend driver that make it possible to run
371 extra user defined frontend actions, in the form of a specialization of a
372 `PluginParseTreeAction`. These actions are run during compilation, after
373 semantic checks. Similarly to Clang, Flang leverages `LoadLibraryPermanently`
374 from LLVM's `llvm::sys::DynamicLibrary` to load dynamic objects that implement
375 plugins. The process for using plugins includes:
376 * [Creating a plugin](#creating-a-plugin)
377 * [Loading and running a plugin](#loading-and-running-a-plugin)
379 Flang plugins are limited to `flang -fc1` and are currently only available /
380 been tested on Linux.
382 ### Creating a Plugin
383 There are three parts required for plugins to work:
384 1. [`PluginParseTreeAction` subclass](#a-pluginparsetreeaction-subclass)
385 1. [Implementation of `ExecuteAction`](#implementation-of-executeaction)
386 1. [Plugin registration](#plugin-registration)
388 There is an example plugin located in `flang/example/PrintFlangFunctionNames`
389 that demonstrates these points by using the `ParseTree` API to print out
390 function and subroutine names declared in the input file.
392 #### A `PluginParseTreeAction` Subclass
393 This subclass will wrap everything together and represent the `FrontendAction`
394 corresponding to your plugin. It will need to inherit from
395 `PluginParseTreeAction` (defined in `flang/include/flang/FrontendActions.h`), in
396 order to have access to the parse tree post semantic checks, and also so that it
397 can be registered, e.g.
398 ```cpp
399 class PrintFunctionNamesAction : public PluginParseTreeAction
402 #### Implementation of `ExecuteAction`
403 Like in other frontend actions, the driver looks for an `ExecuteAction` function
404 to run, so in order for your plugin to do something, you will need to implement
405 the `ExecuteAction` method in your plugin class. This method will contain the
406 implementation of what the plugin actually does, for example:
407 ```cpp
408 // Forward declaration
409 struct ParseTreeVisitor;
411 void ExecuteAction() override {
412   ParseTreeVisitor visitor;
413   Fortran::parser::Walk(getParsing().parseTree(), visitor);
416 In the example plugin, the `ExecuteAction` method first creates an instance of
417 `visitor` struct, before passing it together with the parse tree to the
418 `Fortran::parser::Walk` function that will traverse the parse tree. The parse
419 tree will normally be generated by the frontend driver and can be retrieved in
420 your plugin through the `getParsing()` member method. Implementation and
421 details of the `Walk` function can be found in
422 `flang/include/flang/Parser/parse-tree-visitor.h`.
424 You will have to define your own `visitor` struct. It should define different
425 `Pre` and `Post` functions that take the type of a specific `ParseTree` node as
426 an argument. When the `Walk` function is traversing the parse tree, these
427 functions will be run before/after a node of that type is visited. Template
428 functions for `Pre`/`Post` are defined so that when a node is visited that you
429 have not defined a function for, it will still be able to continue. `Pre`
430 returns a `bool` indicating whether to visit that node's children or not. For
431 example:
432 ```cpp
433 struct ParseTreeVisitor {
434   template <typename A> bool Pre(const A&) { return true; }
435   template <typename A> void Post(const A&) {}
436   void Post(const Fortran::parser::FunctionStmt &f) {
437     llvm::outs() << std::get<Fortran::parser::Name>(f.t).ToString() << "\n" ;
438   }
441 The different types of nodes and also what each node structure contains are
442 defined in `flang/include/flang/Parser/parse-tree.h`. In the example, there is a
443 `Post` function, with a line that gets the `Name` element from a tuple `t` in
444 the `FunctionStmt` struct and prints it. This function will be run after every
445 `FunctionStmt` node is visited in the parse tree.
447 #### Plugin Registration
448 A plugin registry is used to store names and descriptions of a collection of
449 plugins. The Flang plugin registry, defined in
450 `flang/include/flang/Frontend/FrontendPluginRegistry.h`, is an alias of
451 `llvm::Registry` of type `PluginParseTreeAction`.
453 The plugin will need to be registered, which will add the Plugin to the registry
454 and allow it to be used. The format is as follows, with `print-fns` being the
455 plugin name that is used later to call the plugin and `Print Function names`
456 being the description:
457 ```cpp
458 static FrontendPluginRegistry::Add<PrintFunctionNamesAction> X(
459     "print-fns", "Print Function names");
462 ### Loading and Running a Plugin
463 In order to use plugins, there are 2 command line options made available to the
464 frontend driver, `flang -fc1`:
465 * [`-load <dsopath>`](#the--load-dsopath-option) for loading the dynamic shared
466   object of the plugin
467 * [`-plugin <name>`](#the--plugin-name-option) for calling the registered plugin
469 Invocation of the example plugin is done through:
470 ```bash
471 flang -fc1 -load flangPrintFunctionNames.so -plugin print-fns file.f90
474 Both these options are parsed in `flang/lib/Frontend/CompilerInvocation.cpp` and
475 fulfil their actions in
476 `flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp`
478 #### The `-load <dsopath>` option
479 This loads the plugin shared object library, with the path given at `<dsopath>`,
480 using `LoadLibraryPermantly` from LLVM's `llvm::sys::DynamicLibrary`, which
481 itself uses `dlopen`. During this stage, the plugin is registered with the
482 registration line from the plugin, storing the name and description.
484 #### The `-plugin <name>` option
485 This sets `frontend::ActionKind programAction` in `FrontendOptions` to
486 `PluginAction`, through which it searches the plugin registry for the plugin
487 name from `<name>`. If found, it returns the instantiated plugin, otherwise it
488 reports an error diagnostic and returns `nullptr`.
490 ### Enabling In-Tree Plugins
491 For in-tree plugins, there is the CMake flag `FLANG_PLUGIN_SUPPORT`, enabled by
492 default, that controls the exporting of executable symbols from `flang`,
493 which plugins need access to. Additionally, there is the CMake flag
494 `LLVM_BUILD_EXAMPLES`, turned off by default, that is used to control if the
495 example programs are built. This includes plugins that are in the
496 `flang/example` directory and added as a `sub_directory` to the
497 `flang/examples/CMakeLists.txt`, for example, the `PrintFlangFunctionNames`
498 plugin. It is also possible to develop plugins out-of-tree.
500 ### Limitations
501 Note that the traversal API presented here is under active development and
502 might change in the future. We expect it to evolve as support for new
503 language features are added. This document and the examples will be updated
504 accordingly.
506 The current `ParseTree` structure is not suitable for modifications. The
507 copy constructors are not available and hence duplicating code might not be
508 trivial. Please take this into consideration when designing your plugin. In
509 particular, creating a transformation plugin will be noticeably harder than
510 analysis plugins that just consume (rather than edit) `ParseTree`.
512 Lastly, if `ParseTree` modifications are performed, then it might be necessary
513 to re-analyze expressions and modify scope or symbols. You can check
514 [Semantics.md](Semantics.md) for more details on how `ParseTree` is edited
515 e.g. during the semantic checks.
517 ## FIR Optimizer Pass Pipeline Extension Points
519 The default FIR optimizer pass pipeline `createDefaultFIROptimizerPassPipeline`
520 in `flang/lib/Optimizer/Passes/Pipelines.cpp` contains extension point callback
521 invocations `invokeFIROptEarlyEPCallbacks`, `invokeFIRInlinerCallback`, and
522 `invokeFIROptLastEPCallbacks` for Flang drivers to be able to insert additonal
523 passes at different points of the default pass pipeline. An example use of these
524 extension point callbacks is shown in `registerDefaultInlinerPass` to invoke the
525 default inliner pass in `flang`.
527 ## LLVM Pass Plugins
529 Pass plugins are dynamic shared objects that consist of one or more LLVM IR
530 passes. The `-fpass-plugin` option enables these passes to be passed to the
531 middle-end where they are added to the optimization pass pipeline and run after
532 lowering to LLVM IR.The exact position of the pass in the pipeline will depend
533 on how it has been registered with the `llvm::PassBuilder`. See the
534 documentation for
535 [`llvm::PassBuilder`](https://llvm.org/doxygen/classllvm_1_1PassBuilder.html)
536 for details.
538 The framework to enable pass plugins in `flang` uses the exact same
539 machinery as that used by `clang` and thus has the same capabilities and
540 limitations.
542 In order to use a pass plugin, the pass(es) must be compiled into a dynamic
543 shared object which is then loaded using the `-fpass-plugin` option.
546 flang -fpass-plugin=/path/to/plugin.so <file.f90>
549 This option is available in both the compiler driver and the frontend driver.
550 Note that LLVM plugins are not officially supported on Windows.
552 ## LLVM Pass Extensions
554 Pass extensions are similar to plugins, except that they can also be linked
555 statically. Setting `-DLLVM_${NAME}_LINK_INTO_TOOLS` to `ON` in the cmake
556 command turns the project into a statically linked extension. An example would
557 be Polly, e.g., using `-DLLVM_POLLY_LINK_INTO_TOOLS=ON` would link Polly passes
558 into `flang` as built-in middle-end passes.
560 See the
561 [`WritingAnLLVMNewPMPass`](https://llvm.org/docs/WritingAnLLVMNewPMPass.html#id9)
562 documentation for more details.
564 ## Ofast and Fast Math
565 `-Ofast` in Flang means `-O3 -ffast-math -fstack-arrays`.
567 `-ffast-math` means the following:
568  - `-fno-honor-infinities`
569  - `-fno-honor-nans`
570  - `-fassociative-math`
571  - `-freciprocal-math`
572  - `-fapprox-func`
573  - `-fno-signed-zeros`
574  - `-ffp-contract=fast`
576 These correspond to LLVM IR Fast Math attributes:
577 https://llvm.org/docs/LangRef.html#fast-math-flags
579 When `-ffast-math` is specified, any linker steps generated by the compiler
580 driver will also link to `crtfastmath.o`, which adds a static constructor
581 that sets the FTZ/DAZ bits in MXCSR, affecting not only the current only the
582 current compilation unit but all static and shared libraries included in the
583 program. Setting these bits causes denormal floating point numbers to be flushed
584 to zero.
586 ### Comparison with GCC/GFortran
587 GCC/GFortran translate `-Ofast` to
588 `-O3 -ffast-math -fstack-arrays -fno-semantic-interposition`.
589 `-fno-semantic-interposition` is not used because Clang does not enable this as
590 part of `-Ofast` as the default behaviour is similar.
592 GCC/GFortran has a wider definition of `-ffast-math`: also including
593 `-fno-trapping-math`,  `-fno-rounding-math`, and  `-fsignaling-nans`; these
594 aren't included in Flang because Flang currently has no support for strict
595 floating point and so always acts as though these flags were specified.
597 GCC/GFortran will also set flush-to-zero mode: linking `crtfastmath.o`, the same
598 as Flang.
600 The only GCC/GFortran warning option currently supported is `-Werror`.  Passing
601 any unsupported GCC/GFortran warning flags into Flang's compiler driver will
602 result in warnings being emitted.
604 ### Comparison with nvfortran
605 nvfortran defines `-fast` as
606 `-O2 -Munroll=c:1 -Mnoframe -Mlre -Mpre -Mvect=simd -Mcache_align -Mflushz -Mvect`.
607  - `-O2 -Munroll=c:1 -Mlre -Mautoinline -Mpre -Mvect-simd` affect code
608    optimization. `flang -O3` should enable all optimizations for execution time,
609    similarly to `clang -O3`. The `-O3` pipeline has passes that perform
610    transformations like inlining, vectorisation, unrolling, etc. Additionally,
611    the GVN and LICM passes perform redundancy elimination like `Mpre` and `Mlre`
612  - `-Mnoframe`: the equivalent flag would be `-fomit-frame-pointer`. This flag
613    is not yet supported in Flang and so Flang follows GFortran in not including
614    this in `-Ofast`. There is no plan to include this flag as part of `-Ofast`.
615  - `-Mcache_align`: there is no equivalent flag in Flang or Clang.
616  - `-Mflushz`: flush-to-zero mode - when `-ffast-math` is specified, Flang will
617    link to `crtfastmath.o` to ensure denormal numbers are flushed to zero.