2020-03-28 00:23:32 +08:00
|
|
|
<!--===- README.md
|
|
|
|
|
2019-12-21 04:52:07 +08:00
|
|
|
Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2020-03-28 00:23:32 +08:00
|
|
|
|
2018-05-02 03:50:34 +08:00
|
|
|
-->
|
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
# F18
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2019-03-21 05:09:35 +08:00
|
|
|
F18 is a ground-up implementation of a Fortran front end written in modern C++.
|
2019-03-20 14:47:18 +08:00
|
|
|
F18, when combined with LLVM, is intended to replace the Flang compiler.
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
Flang is a Fortran compiler targeting LLVM.
|
|
|
|
Visit the [Flang wiki](https://github.com/flang-compiler/flang/wiki)
|
|
|
|
for more information about 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
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
Read more about f18 in the [documentation directory](documentation).
|
|
|
|
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
|
|
|
|
and the specific grammar accepted by f18,
|
|
|
|
read [Fortran For C Programmers](documentation/FortranForCProgrammers.md)
|
|
|
|
and
|
|
|
|
f18's specifications of the [Fortran grammar](documentation/f2018-grammar.txt)
|
|
|
|
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).
|
|
|
|
|
|
|
|
To understand how an f18 program communicates with libraries at runtime,
|
|
|
|
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
|
|
|
|
also review [how f18 uses modern C++ features](documentation/C++17.md).
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2018-05-19 04:02:58 +08:00
|
|
|
## Building F18
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
### Get the Source Code
|
|
|
|
|
|
|
|
```
|
|
|
|
cd where/you/want/the/source
|
|
|
|
git clone https://github.com/flang-compiler/f18.git
|
|
|
|
```
|
|
|
|
|
|
|
|
### Supported C++ compilers
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2018-05-19 04:02:58 +08:00
|
|
|
F18 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
|
2018-08-04 07:11:29 +08:00
|
|
|
GCC versions 7.2.0, 7.3.0, 8.1.0, and 8.2.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
|
|
|
|
clang version 7.0 and 8.0
|
|
|
|
using either GNU's libstdc++ or LLVM's libc++.
|
|
|
|
|
|
|
|
### LLVM dependency
|
|
|
|
|
|
|
|
F18 uses components from LLVM.
|
|
|
|
|
|
|
|
The instructions to build LLVM can be found at
|
|
|
|
https://llvm.org/docs/GettingStarted.html.
|
|
|
|
|
|
|
|
We highly recommend using the same compiler to compile both llvm and f18.
|
|
|
|
|
|
|
|
The f18 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-03-28 00:23:32 +08:00
|
|
|
To get the correct LLVM and MLIR libraries included in your f18 build,
|
|
|
|
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-03-12 12:47:22 +08:00
|
|
|
### LLVM dependency when building f18 with Fortran IR
|
|
|
|
|
|
|
|
If you do not want to build Fortran IR, add `-DLINK_WITH_FIR=Off` to f18 cmake
|
|
|
|
command and ignore the rest of this section.
|
|
|
|
|
|
|
|
If you intend to build f18 with Fortran IR (`-DLINK_WITH_FIR` On by default),
|
|
|
|
you must:
|
|
|
|
- build LLVM with the same compiler and options as the one you are using
|
|
|
|
to build F18.
|
|
|
|
- pass `-DCMAKE_CXX_STANDARD=17 -DLLVM_ENABLE_PROJECTS="mlir"`
|
|
|
|
to LLVM cmake command.
|
|
|
|
- install LLVM somewhere with `make install` in order to get the required
|
|
|
|
AddMLIR cmake file (it is not generated in LLVM build directory).
|
|
|
|
|
|
|
|
Installing LLVM from packages is most likely not an option as it will not include
|
|
|
|
MLIR and not be built following C++17 standard.
|
|
|
|
|
|
|
|
MLIR is under active development and the most recent development version
|
|
|
|
may be incompatible. A branch named `f18` is available inside LLVM fork in
|
|
|
|
https://github.com/flang-compiler/f18-llvm-project. It contains a version of LLVM
|
|
|
|
that is known be compatible to build f18 with FIR.
|
|
|
|
|
|
|
|
The fastest way to get set up is to do:
|
|
|
|
|
|
|
|
```
|
|
|
|
cd where/you/want/to/build/llvm
|
|
|
|
git clone --depth=1 -b f18 https://github.com/flang-compiler/f18-llvm-project.git
|
|
|
|
mkdir build
|
|
|
|
mkdir install
|
|
|
|
cd build
|
|
|
|
cmake ../f18-llvm-project/llvm -DCMAKE_BUILD_TYPE=Release \
|
|
|
|
-DLLVM_ENABLE_PROJECTS=mlir -DCMAKE_CXX_STANDARD=17 \
|
|
|
|
-DLLVM_INSTALL_UTILS=On \
|
|
|
|
-DCMAKE_INSTALL_PREFIX=../install
|
|
|
|
make
|
|
|
|
make install
|
|
|
|
```
|
|
|
|
|
|
|
|
Then, `-DLLVM_DIR` would have to be set to
|
2020-03-28 00:23:32 +08:00
|
|
|
`<where/you/want/to/build/llvm>/install/lib/cmake/llvm`
|
|
|
|
and, `-DMLIR_DIR` would have to be set to
|
|
|
|
`<where/you/want/to/build/llvm>/install/lib/cmake/mlir`
|
|
|
|
|
|
|
|
in f18 cmake command.
|
2020-03-12 12:47:22 +08:00
|
|
|
|
|
|
|
To run lit tests,
|
|
|
|
`-DLLVM_EXTERNAL_LIT=<where/you/want/to/build/llvm>/build/bin/llvm-lit` must be
|
|
|
|
added to f18 cmake command. This is because `llvm-lit` is not part of
|
|
|
|
LLVM installation.
|
|
|
|
|
|
|
|
Note that when using some advanced options from f18 cmake file it may be
|
|
|
|
necessary to reproduce their effects in LLVM cmake command.
|
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
### Building f18 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
|
|
|
|
in order to build f18.
|
2018-05-03 20:54:53 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
Or,
|
2018-05-19 04:02:58 +08:00
|
|
|
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,
|
2020-03-28 00:23:32 +08:00
|
|
|
e.g. g++-8.3, assuming g++-8.3 is on your PATH.
|
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
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
### Building f18 with clang
|
2018-05-19 04:02:58 +08:00
|
|
|
|
2019-03-20 14:47:18 +08:00
|
|
|
To build f18 with clang,
|
|
|
|
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>`
|
|
|
|
is the path where f18 should be installed.
|
|
|
|
|
|
|
|
### 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.
|
|
|
|
|
|
|
|
### Build F18
|
|
|
|
```
|
2019-03-21 05:09:35 +08:00
|
|
|
cd ~/f18/build
|
2020-03-28 00:23:32 +08:00
|
|
|
cmake -DLLVM_DIR=$LLVM -DMLIR_DIR=$MLIR ~/f18/src
|
2018-05-19 04:02:58 +08:00
|
|
|
make
|
|
|
|
```
|
2020-01-15 00:20:49 +08:00
|
|
|
|
|
|
|
### How to Run the Regression Tests
|
|
|
|
|
|
|
|
To run all tests:
|
|
|
|
```
|
|
|
|
cd ~/f18/build
|
2020-03-28 00:23:32 +08:00
|
|
|
cmake -DLLVM_DIR=$LLVM -DMLIR_DIR=$MLIR ~/f18/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
|
|
|
|
configuration for f18. The parameters in charge of this are:
|
|
|
|
flang_site_config and flang_config. And they can be set as shown bellow:
|
|
|
|
```
|
|
|
|
<path-to-llvm-lit>/llvm-lit \
|
|
|
|
--param flang_site_config=<path-to-f18-build>/test-lit/lit.site.cfg.py \
|
|
|
|
--param flang_config=<path-to-f18-build>/test-lit/lit.cfg.py \
|
|
|
|
<path-to-fortran-test>
|
|
|
|
```
|
2020-03-12 12:47:22 +08:00
|
|
|
|
|
|
|
# How to Generate FIR Documentation
|
|
|
|
|
|
|
|
If f18 was built with `-DLINK_WITH_FIR=On` (`On` by default), it is possible to
|
|
|
|
generate FIR language documentation by running `make flang-doc`. This will
|
|
|
|
create `docs/Dialect/FIRLangRef.md` in f18 build directory.
|