================ @@ -163,6 +163,40 @@ forward compiler options to the frontend driver, `flang-new -fc1`. You can read more on the design of `clangDriver` in Clang's [Driver Design & Internals](https://clang.llvm.org/docs/DriverInternals.html). +## Linker Driver +When used as a linker, Flang's frontend driver assembles the command line for an +external linker command (e.g., LLVM's `lld`) and invokes it to create the final +executable by linking static and shared libraries together with all the +translation units supplied as object files. + +By default, the Flang linker driver adds several libraries to the linker +invocation to make sure that all entrypoints for program start +(Fortran's program unit) and runtime routines can be resolved by the linker. +The libraries are: + +* `Fortran_main`: Provides the main entry point `main` that then invokes + `_QQmain` with the Fortran program unit. This library has a dependency to + the `FortranRuntime` library. +* `FortranRuntime`: Provides most of the Flang runtime library. +* `FortranDecimal`: Provides operations for decimal numbers. + +The default is that, when using Flang as the linker, one of the Fortran +translation units provides the program unit and therefore it is assumed that +Fortran is the main code part (calling into C/C++ routines via `BIND +(C)` interfaces). When composing the linker commandline, Flang uses +`--whole-archive` and `--no-whole-archive` (Windows: `/WHOLEARCHIVE:`, +Darwin: *not implemented yet*) to make sure that all for `Fortran_main` is +processed by the linker. This is done to issue a proper error message when +multiple definitions of `main` occur. This happens, for instance, when linking +a code that has a Fortran program unit with a C/C++ code that also defines a +`main` function. + +If the code is C/C++ based and invokes Fortran routines, either use Clang as the +linker driver (supplying `FortranRuntime` and/or `FortranDecimal` to the linker ---------------- mjklemm wrote:
> I think this requirement of using Clang as the linker driver if the `main` is > C changes the usability for users coming from XLF or gfortran. I can reword this. There are two options: either do C/C++ linkage and supply Fortran libraries or do Fortran linkage and supply C/C++ libraries. Either way is equally difficult at this point. > I think the fundamental question is why Fortran_main.c is inserting a "fake" > main on the Fortran side when there is not user defined main in Fortrran code. This was inherited from Classic Flang and is also done by other compilers (e.g., Intel). > Is it possible to only creating a main when users define one in Fortran code? That would also be possible. I guess the compiler could generate all of `main` in IR and emit it. That's what GFortran does. https://github.com/llvm/llvm-project/pull/75816 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits