It’s been a few weeks since I last gave an update on F18 and our progress on readying it for inclusion into the monorepo. Last time we discussed this the community challenged us to make the F18 source code look more like an LLVM project and to come up with a plan and schedule for completing this work (http://lists.llvm.org/pipermail/llvm-dev/2020-January/137989.html)
The full list of changes that could be made to make F18 more LLVM-like is very long. We’re interested in identifying what the absolute dealbreakers are that block inclusion into the monorepo and which changes would be acceptable to make after inclusion to the monorepo. We’ve come up with strawman lists for each and would like to propose the following plan of action:
- We have captured our strawman proposal for all the changes that need to happen to F18 to make it ready for inclusion into the monorepo on a github project board: https://github.com/orgs/flang-compiler/projects/8 (also repeated at the end of this mail.)
- We are working through this list and we believe that we can complete this work in time for a new upstreaming date of 16th March.
- We have captured further work that we plan to complete on F18 after merging to the monorepo https://github.com/orgs/flang-compiler/projects/10 (also repeated below)
- We believe that we can complete this work before the LLVM11 branching date in June.
- After this date, we’ll keep improving the code as we go along and not on any specific timescale.
We’d really appreciate feedback on the two lists of changes, specifically: are these lists complete? Is everyone satisfied that with all the items on https://github.com/orgs/flang-compiler/projects/8, we’d be happy to accept F18 into the monorepo? Are there any further changes that would need to be made to F18 for this to happen?
More info on the lists:
Pre-merge list: https://github.com/orgs/flang-compiler/projects/8
The status today is that many of the items on the pre-merge list are well underway or complete.
- Integrate into the monorepo CMake
- This will be as an optional project, and default to not building.
- This also adds Doxygen infrastructure so we can start to improve interface documentation and continue post-merge.
- F18 changes to make it more LLVM-like in code style
- Rationalise headers to put public headers in /include and not /lib
- Examine F18’s clang-format file and minimise deviations to the LLVM clang-format
- Rename all .cc files to .cpp
- Capitalize the module directory names in /lib and /include (e.g. /lib/Parser)
- Increase use of LLVM APIs and utilities in F18
- Switch F18 custom File handling to LLVM’s File handling (helps with non-POSIX platform support)
- Change uses of C++ standard stream IO library to LLVM’s equivalent library
- Audit use of std::list and consider migrating to a suitable alternative in LLVM’s API
- Use llvm_unreachable with an error message for unreachable cases
- Convert the regression test suite to using lit rather than ctest
- Porting off the custom scripts to FileCheck will continue after this but we think it should not gate inclusion to the monorepo.
- Ensure that F18 builds with the same compilers as the rest of the monorepo
- One caveat is that we can only support C++17 compilers
- We propose to defer Windows support until after we merge
- We will specifically also check with the latest LLVM 10 rc
Post-merge list: https://github.com/orgs/flang-compiler/projects/10
This is the work that will happen right away after merging to the monorepo
- F18 changes to make it more LLVM-like in code style - We will perform a one-off exercise where we audit the code to find these instances and bring them in line. We’ll look at:
- Braces on all single-line if statements
- Uses of else-after-return.
- Increase use of LLVM APIs and utilities in F18 - We’ll audit the uses of these datatypes and try to move to a suitable LLVM alternative
- Further work on porting the test suite to make it more LLVM-like
- Port lit tests to FileCheck
- Port unit tests to gtest
- Implement equivalent to clang -verify and port tests to that
- Support Windows
- Porting to LLVM file I/O is the main blocker - included in the post-merge worklist - but there will be more to do after this.
- Isuru Fernando is going to lead this effort
- Set up official builders
- Arm will handle bots for AArch64
- Nvidia will handle X86
- Tarique Islam at IBM will set up a builder for Power: http://lists.llvm.org/pipermail/flang-dev/2020-February/000232.html
- Any further help from community bot maintainers to cover all the platforms and compilers would be greatly appreciated.
One specific ask in the last round of feedback was on sharing lib/common/Although we see the benefit of doing this exercise, we feel it is a bit too early to start. One design principle we wish to stick to is for the Fortran runtime and compiler align on their implementations. For the specific example of https://github.com/flang-compiler/f18/blob/master/include/flang/common/bit-population-count.h we’d want the compiler and runtime POPCNT intrinsic to align on implementation. The F18 runtime is still a work in progress. We need to decide on how or if this could share code with LLVM libraries and then we can revisit the implementations in include/flang/common.
After all the above is done, we will continue to bring the code more in line with LLVM style and API usage by fixing things as we find them during development and enforce the new style through code review. A few specific areas that have been mentioned before that we will tackle in this way are:
- Add Doxygen style comments to interfaces
- Classes, files, names, etc. where a more LLVM-standard naming can be used.
- Refactor code to use early exits when suitable
- Audit functions in include/flang/common and port to LLVM equivalents (e.g. builtin_popcount)