2020-04-10 04:12:54 +08:00
|
|
|
# Flang
|
2020-03-28 00:23:32 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
Flang is a ground-up implementation of a Fortran front end written in modern
|
|
|
|
C++. It started off as the f18 project (https://github.com/flang-compiler/f18)
|
|
|
|
with an aim to replace the previous flang project
|
|
|
|
(https://github.com/flang-compiler/flang) and address its various deficiencies.
|
|
|
|
F18 was subsequently accepted into the LLVM project and rechristened as Flang.
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
## Getting Started
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
Read more about flang in the [documentation directory](documentation).
|
2019-03-20 14:47:18 +08:00
|
|
|
Start with the [compiler overview](documentation/Overview.md).
|
2019-02-26 01:39:27 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
To better understand Fortran as a language
|
2020-04-10 04:12:54 +08:00
|
|
|
and the specific grammar accepted by flang,
|
2019-03-20 14:47:18 +08:00
|
|
|
read [Fortran For C Programmers](documentation/FortranForCProgrammers.md)
|
|
|
|
and
|
2020-04-10 04:12:54 +08:00
|
|
|
flang's specifications of the [Fortran grammar](documentation/f2018-grammar.txt)
|
2019-03-20 14:47:18 +08:00
|
|
|
and
|
|
|
|
the [OpenMP grammar](documentation/OpenMP-4.5-grammar.txt).
|
2019-02-26 01:39:27 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
Treatment of language extensions is covered
|
|
|
|
in [this document](documentation/Extensions.md).
|
|
|
|
|
|
|
|
To understand the compilers handling of intrinsics,
|
|
|
|
see the [discussion of intrinsics](documentation/Intrinsics.md).
|
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
To understand how a flang program communicates with libraries at runtime,
|
2019-03-20 14:47:18 +08:00
|
|
|
see the discussion of [runtime descriptors](documentation/RuntimeDescriptor.md).
|
|
|
|
|
|
|
|
If you're interested in contributing to the compiler,
|
|
|
|
read the [style guide](documentation/C++style.md)
|
|
|
|
and
|
2020-04-10 04:12:54 +08:00
|
|
|
also review [how flang uses modern C++ features](documentation/C++17.md).
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
## Supported C++ compilers
|
2019-03-20 14:47:18 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
Flang is written in C++17.
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2018-05-19 04:02:58 +08:00
|
|
|
The code has been compiled and tested with
|
2020-04-10 04:12:54 +08:00
|
|
|
GCC versions from 7.2.0 to 9.3.0.
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
The code has been compiled and tested with
|
2020-04-10 04:12:54 +08:00
|
|
|
clang version 7.0, 8.0, 9.0 and 10.0
|
2019-03-20 14:47:18 +08:00
|
|
|
using either GNU's libstdc++ or LLVM's libc++.
|
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
The code has been compiled on
|
|
|
|
AArch64, x86\_64 and ppc64le servers
|
|
|
|
with CentOS7, Ubuntu18.04, Rhel, MacOs, Mojave, XCode and
|
|
|
|
Apple Clang version 10.0.1.
|
2019-03-20 14:47:18 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
The code does not compile with Windows and a compiler that does not have
|
|
|
|
support for C++17.
|
|
|
|
|
|
|
|
## Building Flang out of tree
|
|
|
|
These instructions are for building Flang separately from LLVM; if you are
|
|
|
|
building Flang alongside LLVM then follow the standard LLVM build instructions
|
|
|
|
and add flang to `LLVM_ENABLE_PROJECTS` instead, as detailed there.
|
|
|
|
|
|
|
|
### LLVM dependency
|
2019-03-20 14:47:18 +08:00
|
|
|
|
|
|
|
The instructions to build LLVM can be found at
|
2020-04-10 04:12:54 +08:00
|
|
|
https://llvm.org/docs/GettingStarted.html. If you are building flang as part
|
|
|
|
of LLVM, follow those instructions and add flang to `LLVM_ENABLE_PROJECTS`.
|
2019-03-20 14:47:18 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
We highly recommend using the same compiler to compile both llvm and flang.
|
2019-03-20 14:47:18 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
The flang CMakeList.txt file uses
|
2020-03-28 00:23:32 +08:00
|
|
|
the variable `LLVM_DIR` to find the installed LLVM components
|
|
|
|
and
|
|
|
|
the variable `MLIR_DIR` to find the installed MLIR components.
|
2019-03-20 14:47:18 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
To get the correct LLVM and MLIR libraries included in your flang build,
|
2020-03-28 00:23:32 +08:00
|
|
|
define LLVM_DIR and MLIR_DIR on the cmake command line.
|
2019-03-20 14:47:18 +08:00
|
|
|
```
|
2020-03-28 00:23:32 +08:00
|
|
|
LLVM=<LLVM_BUILD_DIR>/lib/cmake/llvm \
|
|
|
|
MLIR=<LLVM_BUILD_DIR>/lib/cmake/mlir \
|
|
|
|
cmake -DLLVM_DIR=$LLVM -DMLIR_DIR=$MLIR ...
|
2019-03-20 14:47:18 +08:00
|
|
|
```
|
2020-03-05 23:12:06 +08:00
|
|
|
where `LLVM_BUILD_DIR` is
|
|
|
|
the top-level directory where LLVM was built.
|
2020-01-15 00:20:49 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
### Building flang with GCC
|
2018-05-08 05:39:36 +08:00
|
|
|
|
2018-05-19 04:02:58 +08:00
|
|
|
By default,
|
|
|
|
cmake will search for g++ on your PATH.
|
2019-03-20 14:47:18 +08:00
|
|
|
The g++ version must be one of the supported versions
|
2020-04-10 04:12:54 +08:00
|
|
|
in order to build flang.
|
|
|
|
|
|
|
|
Or, cmake will use the variable CXX to find the C++ compiler. CXX should include
|
|
|
|
the full path to the compiler or a name that will be found on your PATH, e.g.
|
|
|
|
g++-8.3, assuming g++-8.3 is on your PATH.
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2018-05-19 04:02:58 +08:00
|
|
|
```
|
2020-03-28 00:23:32 +08:00
|
|
|
export CXX=g++-8.3
|
2018-05-19 04:02:58 +08:00
|
|
|
```
|
2019-03-20 14:47:18 +08:00
|
|
|
or
|
|
|
|
```
|
2020-03-28 00:23:32 +08:00
|
|
|
CXX=/opt/gcc-8.3/bin/g++-8.3 cmake ...
|
2019-03-20 14:47:18 +08:00
|
|
|
```
|
2018-05-19 04:02:58 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
### Building flang with clang
|
2018-05-19 04:02:58 +08:00
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
To build flang with clang,
|
2019-03-20 14:47:18 +08:00
|
|
|
cmake needs to know how to find clang++
|
|
|
|
and the GCC library and tools that were used to build clang++.
|
2018-05-19 04:02:58 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
CXX should include the full path to clang++
|
|
|
|
or clang++ should be found on your PATH.
|
|
|
|
```
|
|
|
|
export CXX=clang++
|
|
|
|
```
|
2018-05-19 04:02:58 +08:00
|
|
|
|
|
|
|
### Installation Directory
|
|
|
|
|
|
|
|
To specify a custom install location,
|
|
|
|
add
|
|
|
|
`-DCMAKE_INSTALL_PREFIX=<INSTALL_PREFIX>`
|
|
|
|
to the cmake command
|
|
|
|
where `<INSTALL_PREFIX>`
|
2020-04-10 04:12:54 +08:00
|
|
|
is the path where flang should be installed.
|
2018-05-19 04:02:58 +08:00
|
|
|
|
|
|
|
### Build Types
|
|
|
|
|
|
|
|
To create a debug build,
|
|
|
|
add
|
|
|
|
`-DCMAKE_BUILD_TYPE=Debug`
|
|
|
|
to the cmake command.
|
|
|
|
Debug builds execute slowly.
|
|
|
|
|
|
|
|
To create a release build,
|
|
|
|
add
|
|
|
|
`-DCMAKE_BUILD_TYPE=Release`
|
|
|
|
to the cmake command.
|
|
|
|
Release builds execute quickly.
|
|
|
|
|
2020-04-10 04:12:54 +08:00
|
|
|
### Build Flang out of tree
|
2018-05-19 04:02:58 +08:00
|
|
|
```
|
2020-04-10 04:12:54 +08:00
|
|
|
cd ~/flang/build
|
|
|
|
cmake -DLLVM_DIR=$LLVM -DMLIR_DIR=$MLIR ~/flang/src
|
2018-05-19 04:02:58 +08:00
|
|
|
make
|
|
|
|
```
|
2020-06-03 01:15:44 +08:00
|
|
|
# How to Run Tests
|
2020-01-15 00:20:49 +08:00
|
|
|
|
2020-06-03 01:15:44 +08:00
|
|
|
Flang supports 2 different categories of tests
|
|
|
|
1. Regression tests (https://www.llvm.org/docs/TestingGuide.html#regression-tests)
|
|
|
|
2. Unit tests (https://www.llvm.org/docs/TestingGuide.html#unit-tests)
|
|
|
|
|
|
|
|
## For out of tree builds
|
2020-01-15 00:20:49 +08:00
|
|
|
To run all tests:
|
|
|
|
```
|
2020-04-10 04:12:54 +08:00
|
|
|
cd ~/flang/build
|
|
|
|
cmake -DLLVM_DIR=$LLVM -DMLIR_DIR=$MLIR ~/flang/src
|
2020-03-17 01:46:17 +08:00
|
|
|
make test check-all
|
2020-01-15 00:20:49 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
To run individual regression tests llvm-lit needs to know the lit
|
2020-04-10 04:12:54 +08:00
|
|
|
configuration for flang. The parameters in charge of this are:
|
2020-01-15 00:20:49 +08:00
|
|
|
flang_site_config and flang_config. And they can be set as shown bellow:
|
|
|
|
```
|
|
|
|
<path-to-llvm-lit>/llvm-lit \
|
2020-04-10 04:12:54 +08:00
|
|
|
--param flang_site_config=<path-to-flang-build>/test-lit/lit.site.cfg.py \
|
|
|
|
--param flang_config=<path-to-flang-build>/test-lit/lit.cfg.py \
|
2020-01-15 00:20:49 +08:00
|
|
|
<path-to-fortran-test>
|
2020-06-03 01:15:44 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
Unit tests:
|
|
|
|
|
|
|
|
If flang was built with `-DFLANG_INCLUDE_TESTS=On` (`ON` by default), it is possible to generate unittests.
|
|
|
|
Note: Unit-tests will be skipped for LLVM install for an out-of-tree build as it does not include googletest related headers and libraries.
|
|
|
|
|
|
|
|
There are various ways to run unit-tests.
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
1. make check-flang-unit
|
|
|
|
2. make check-all or make check-flang
|
|
|
|
3. <path-to-llvm-lit>/llvm-lit \
|
|
|
|
test/Unit
|
|
|
|
4. Invoking tests from <out-of-tree flang build>/unittests/<respective unit test folder>
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## For in tree builds
|
|
|
|
If flang was built with `-DFLANG_INCLUDE_TESTS=On` (`On` by default), it is possible to
|
|
|
|
generate unittests.
|
|
|
|
|
|
|
|
To run all of the flang unit tests use the `check-flang-unit` target:
|
|
|
|
```
|
|
|
|
make check-flang-unit
|
|
|
|
```
|
|
|
|
To run all of the flang regression tests use the `check-flang` target:
|
|
|
|
```
|
|
|
|
make check-flang
|
2020-01-15 00:20:49 +08:00
|
|
|
```
|
2020-03-12 12:47:22 +08:00
|
|
|
|
2020-04-27 17:22:36 +08:00
|
|
|
# How to Generate Documentation
|
2020-03-12 12:47:22 +08:00
|
|
|
|
2020-04-27 17:22:36 +08:00
|
|
|
## Generate FIR Documentation
|
|
|
|
If flang was built with `-DLINK_WITH_FIR=On` (`On` by default), it is possible to
|
2020-03-12 12:47:22 +08:00
|
|
|
generate FIR language documentation by running `make flang-doc`. This will
|
2020-04-27 17:22:36 +08:00
|
|
|
create `docs/Dialect/FIRLangRef.md` in flang build directory.
|
|
|
|
|
|
|
|
## Generate Doxygen-based Documentation
|
|
|
|
To generate doxygen-style documentation from source code
|
|
|
|
- Pass `-DLLVM_ENABLE_DOXYGEN=ON -DFLANG_INCLUDE_DOCS=ON` to the cmake command.
|
|
|
|
|
|
|
|
```
|
|
|
|
cd ~/llvm-project/build
|
|
|
|
cmake -DLLVM_ENABLE_DOXYGEN=ON -DFLANG_INCLUDE_DOCS=ON ../llvm
|
|
|
|
make doxygen-flang
|
|
|
|
|
|
|
|
It will generate html in
|
|
|
|
|
|
|
|
<build-dir>/tools/flang/docs/doxygen/html # for flang docs
|
|
|
|
```
|