llvm/flang
Tim Keith 73c630a4ea [flang] Improve module file reading and writing
Fix problems with writing a mod file while another compilation is
reading or writing. Write to a temp and then rename it:
- compute the new contents of the .mod file
- if it already exists, check if it is already correct
- if not, write new contents to a temp file
- rename the temp to the final destination

`mkstemps()` seems to be the best way to create the temp file.
It returns a file descriptor, so change the rest of the mod file
writing to use POSIX open/read/write/close. This seems to set
errno more reliably too.

There is some extra work around creating the temp to make it have
the same directory and suffix as the final file (so that if one gets
left behind by a crash, "rm *.mod" still cleans it up).
`mkstemps()` creates file with 0600 permissions so try to change it
to what it would have been if we just wrote the file.

Change module file reading to only read the file once; we used to
read it to verify the checksum and then again to parse it.
Instead, change `Parsing` so that we can get the file contents
after `Prescan()` and use that to verify the checksum. Also, it has
a mechanism for searching directories for files, so make use of that
instead of duplicating that functionality in `ModFileReader`.
This requires some changes to how errors are returned so they can
be reported in the right place.

Original-commit: flang-compiler/f18@d0d54971a5
Reviewed-on: https://github.com/flang-compiler/f18/pull/758
Tree-same-pre-rewrite: false
2019-09-25 14:55:40 -07:00
..
documentation [flang] Address editorial comments and use oxford comma 2019-09-17 01:54:51 -07:00
include [flang] Add FIR dialect header 2019-08-16 19:01:49 -07:00
lib [flang] Improve module file reading and writing 2019-09-25 14:55:40 -07:00
module [flang] Fixed the declarations of IEEE_SUPPORT_FLAG and IEEE_SUPPORT_HALTING to 2019-09-10 12:43:16 -07:00
runtime [flang] Correct obsolete comment in descriptor.h 2019-08-28 09:14:46 -07:00
test [flang] Improve module file reading and writing 2019-09-25 14:55:40 -07:00
tools [flang] Using new Prov to Cooked mappings for get-definition. 2019-09-10 17:55:59 -07:00
.clang-format [flang] Changed .clang-format so that it will not add a comment after the closing brace of each namespace. Removed all such previous comments from all .cc and .h files 2018-10-25 05:55:23 -07:00
.gitignore [flang] Do not remove things from .gitignore 2019-07-23 14:57:46 -07:00
CMakeLists.txt [flang] Prep for review 2019-09-25 09:04:35 -07:00
LICENSE [flang] Create LICENSE 2018-05-18 13:06:22 -07:00
README.md [flang] Reorder the advice about putting GCC bin and lib on 2019-03-20 14:09:35 -07:00

F18

F18 is a ground-up implementation of a Fortran front end written in modern C++. F18, when combined with LLVM, is intended to replace the Flang compiler.

Flang is a Fortran compiler targeting LLVM. Visit the Flang wiki for more information about Flang.

Getting Started

Read more about f18 in the documentation directory. Start with the compiler overview.

To better understand Fortran as a language and the specific grammar accepted by f18, read Fortran For C Programmers and f18's specifications of the Fortran grammar and the OpenMP grammar.

Treatment of language extensions is covered in this document.

To understand the compilers handling of intrinsics, see the discussion of intrinsics.

To understand how an f18 program communicates with libraries at runtime, see the discussion of runtime descriptors.

If you're interested in contributing to the compiler, read the style guide and also review how f18 uses modern C++ features.

Building F18

Get the Source Code

cd where/you/want/the/source
git clone https://github.com/flang-compiler/f18.git

Supported C++ compilers

F18 is written in C++17.

The code has been compiled and tested with GCC versions 7.2.0, 7.3.0, 8.1.0, and 8.2.0.

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 the variable LLVM_DIR to find the installed components.

To get the correct LLVM libraries included in your f18 build, define LLVM_DIR on the cmake command line.

LLVM=<LLVM_INSTALLATION_DIR>/lib/cmake/llvm cmake -DLLVM_DIR=$LLVM ...

where LLVM_INSTALLATION_DIR is the top-level directory where llvm is installed.

Building f18 with GCC

By default, cmake will search for g++ on your PATH. The g++ version must be one of the supported versions in order to build f18.

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++-7.2, assuming g++-7.2 is on your PATH.

export CXX=g++-7.2

or

CXX=/opt/gcc-7.2/bin/g++-7.2 cmake ...

There's a third option! The CMakeList.txt file uses the variable GCC as the path to the bin directory containing the C++ compiler.

GCC can be defined on the cmake command line where <GCC_DIRECTORY> is the path to a GCC installation with bin, lib, etc:

cmake -DGCC=<GCC_DIRECTORY> ...

Building f18 with clang

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++.

The CMakeList.txt file expects either CXX or BUILD_WITH_CLANG to be set.

CXX should include the full path to clang++ or clang++ should be found on your PATH.

export CXX=clang++

BUILD_WITH_CLANG can be defined on the cmake command line where <CLANG_DIRECTORY> is the path to a clang installation with bin, lib, etc:

cmake -DBUILD_WITH_CLANG=<CLANG_DIRECTORY>

Or GCC can be defined on the f18 cmake command line where <GCC_DIRECTORY> is the path to a GCC installation with bin, lib, etc:

cmake -DGCC=<GCC_DIRECTORY> ...

To use f18 after it is built, the environment variables PATH and LD_LIBRARY_PATH must be set to use GCC and its associated libraries.

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

cd ~/f18/build
cmake -DLLVM_DIR=$LLVM ~/f18/src
make