forked from OSchip/llvm-project
97a32d3e43
This patch adds 2 missing items required for `flang-new` to be able to generate executables: 1. The Fortran_main runtime library, which implements the main entry point into Fortran's `PROGRAM` in Flang, 2. Extra linker flags to include Fortran runtime libraries (e.g. Fortran_main). Fortran_main is the bridge between object files generated by Flang and the C runtime that takes care of program set-up at system-level. For every Fortran `PROGRAM`, Flang generates the `_QQmain` function. Fortran_main implements the C `main` function that simply calls `_QQmain`. Additionally, "<driver-path>/../lib" directory is added to the list of search directories for libraries. This is where the required runtime libraries are currently located. Note that this the case for the build directory. We haven't considered installation directories/targets yet. With this change, you can generate an executable that will print `hello, world!` as follows: ```bash $ cat hello.f95 PROGRAM HELLO write(*, *) "hello, world!" END PROGRAM HELLO $ flang-new -flang-experimental-exec hello.f95 ./a.out hello, world! ``` NOTE 1: Fortran_main has to be a static library at all times. It invokes `_QQmain`, which is the main entry point generated by Flang for the given input file (you can check this with `flang-new -S hello.f95 -o - | grep "Qmain"`). This means that Fortran_main has an unresolved dependency at build time. The linker will allow this for a static library. However, if Fortran_main was a shared object, then the linker will produce an error: `undefined symbol: `_QQmain`. NOTE 2: When Fortran runtime libraries are generated as shared libraries (excluding Fortran_main, which is always static), you will need to tell the dynamic linker (by e.g. tweaking LD_LIBRARY_PATH) where to look for them when invoking the executables. For example: ```bash LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<flang-build-dir>/lib/ ./a.out ``` NOTE 3: This feature is considered experimental and currently guarded with a flag: `-flang-experimental-exec`. Differential Revision: https://reviews.llvm.org/D122008 [1] https://github.com/flang-compiler/f18-llvm-project CREDITS: Fortran_main was originally written by Eric Schweitz, Jean Perier, Peter Klausler and Steve Scalpone in the fir-dev` branch in [1]. Co-authored-by: Eric Schweitz <eschweitz@nvidia.com> Co-authored-by: Peter Klausler <pklausler@nvidia.com> Co-authored-by: Jean Perier <jperier@nvidia.com> Co-authored-by: Steve Scalpone <sscalpone@nvidia.com |
||
---|---|---|
.. | ||
CMakeLists.txt | ||
driver.cpp | ||
fc1_main.cpp |