[flang-dev] Flang + CMake

Andrzej Warzynski via flang-dev flang-dev at lists.llvm.org
Mon Sep 27 04:04:00 PDT 2021

@Tin, given the status of 
https://gitlab.kitware.com/cmake/cmake/-/issues/22387, I think that 
https://gitlab.kitware.com/cmake/cmake/-/merge_requests/6323 could be 
re-opened now. Are you still available to work on this?

Thank you,


On 23/07/2021 20:47, Andrzej Warzynski via flang-dev wrote:
> @Kiran, thank you for that great summary!
> We also discussed this with Peter Klausler (Nvidia, one of the authors 
> of the preprocessor/prescanner in LLVM Flang) on 
> flang-compiler.slack.com. Please check the thread started by Johannes 
> Doerfert on Monday, July 12th 2020.
> The conversation on Slack is publicly available, but perhaps it is worth 
> to summarise it here. As Kiran already highlighted, the output generated 
> with `-E` is the "cooked character stream" rather than "pre-processed" 
> file. In general, it's not valid Fortran source and it should be 
> re-formatted/post-processed first. It is unfortunate that we use `-E` to 
> generate this - perhaps we should rename this option? We did discuss the 
> possibility of modifying the prescanner/preprocessor, but due to its 
> design, this wouldn't be feasible right now.
> All the information required to re-format the cooked character stream as 
> valid fixed/free form Fortran source should already be available. Making 
> sure that the debug info based on the "pre-processed" file matches the 
> original file will be much trickier. This could be implemented at a 
> later time though. For now, we can focus on fixing `-E` and the CMake 
> integration.
> I agree with Kiran in that intially we could focus on the Makefile 
> generator in CMake. AFAIK, everything that's required is already in 
> place. In order to have a functioning Ninja generator, we will have to 
> implement the reformatting of the "cooked character stream" (or, in 
> other words, fix `-E`).
> Please reply here if I missed or misinterpreted anything.
> -Andrzej
> [1] 
> https://github.com/llvm/llvm-project/blob/main/flang/docs/Overview.md#prescan-and-preprocess 
> [2] 
> https://github.com/llvm/llvm-project/blob/main/flang/docs/Parsing.md#prescanning-and-preprocessing 
> On 21/07/2021 13:57, Kiran Chandramohan wrote:
>> For the Ninja CMake generator, CMake uses an intrusive mechanism for 
>> finding the dependencies (through modules) among Fortran files. CMake 
>> uses the compiler to preprocess the file and then finds the 
>> dependencies and then passes the preprocessed files onto another 
>> invocation of the compiler to compile. This has tripped up a few 
>> compilers like Cray, IBM etc which they fixed recently (see links to 
>> issues below). The issue does not apply for the Makefile generator 
>> since it internally uses a Fortran parser/preprocessor (makedepf90) to 
>> go through the files and find the dependencies.  See the following 
>> link for more details. An ideal non-intrusive mechanism would have 
>> been to ask the compiler to list modules used and modules defined and 
>> then build the dependencies from that.
>> https://mathstuf.fedorapeople.org/fortran-modules/fortran-modules.html 
>> <https://mathstuf.fedorapeople.org/fortran-modules/fortran-modules.html>
>> https://gitlab.kitware.com/cmake/cmake/-/issues/20697 
>> <https://gitlab.kitware.com/cmake/cmake/-/issues/20697>
>> https://gitlab.kitware.com/cmake/cmake/-/issues/20731 
>> <https://gitlab.kitware.com/cmake/cmake/-/issues/20731>
>> I believe in Flang, the preprocessor and prescanner 
>> (https://github.com/llvm/llvm-project/blob/main/flang/docs/Parsing.md#prescanning-and-preprocessing 
>> <https://github.com/llvm/llvm-project/blob/main/flang/docs/Parsing.md#prescanning-and-preprocessing>) 
>> run together to produce a cooked character stream (normalized with no 
>> spaces, lowercase etc). I guess prescanner helps the preprocessor to 
>> be Fortran aware. In classic flang we have had issues where we had to 
>> make the preprocessor aware of Fortran syntax 
>> (https://github.com/flang-compiler/flang/pull/658 
>> <https://github.com/flang-compiler/flang/pull/658>). The cooked 
>> character stream is currently the output if we use the -E flag. Due to 
>> loss of whitespace etc this is not fixed form anymore. Also, flang 
>> would have constructed the provenance information while creating the 
>> cooked character stream. A new invocation of Flang on the cooked 
>> character stream will not be able to capture the source provenance 
>> information. As Bryan points out 
>> (https://gitlab.kitware.com/cmake/cmake/-/issues/22387#note_986516 
>> <https://gitlab.kitware.com/cmake/cmake/-/issues/22387#note_986516>) I 
>> guess line directives have to be inserted to retain this information.
>> Is it possible to retain fixed-form formatting after prescanning? And 
>> can we normalize it as the first step in parsing, so that the parser 
>> remains unchanged?
>> Can line directive information be added to retain source location 
>> information? And can this be consumed and interpreted before parsing?
>> Can CMake use the make generator flow? (The CMake folks have a 
>> preference to fix this in the compiler side. 
>> https://gitlab.kitware.com/cmake/cmake/-/issues/22387#note_983394 
>> <https://gitlab.kitware.com/cmake/cmake/-/issues/22387#note_983394>.)
>> --Kiran
>> ------------------------------------------------------------------------
>> *From:* flang-dev <flang-dev-bounces at lists.llvm.org> on behalf of 
>> Andrzej Warzynski via flang-dev <flang-dev at lists.llvm.org>
>> *Sent:* 21 July 2021 11:15
>> *To:* flang-dev at lists.llvm.org <flang-dev at lists.llvm.org>
>> *Subject:* Re: [flang-dev] Flang + CMake
>> Hi everyone,
>> We are a bit stuck here. From the discussions so far, it seems that we
>> may need to make some changes to the preprocessor in order to progress
>> this. Would someone familiar with the design of the preprocessor be able
>> to chime in (either here, on Slack, CMake [1] or Bugzilla [2])? That
>> would be greatly appreciated!
>> Lack of CMake integration is already limiting us in terms of _what_ can
>> be tested. The project will benefit greatly if we manage to get this
>> introduced soon. And it will make LLVM Flang much more attractive to
>> end-users.
>> Best regards,
>> -Andrzej
>> [1] https://gitlab.kitware.com/cmake/cmake/-/issues/22387 
>> <https://gitlab.kitware.com/cmake/cmake/-/issues/22387>
>> [2] https://bugs.llvm.org/show_bug.cgi?id=50993 
>> <https://bugs.llvm.org/show_bug.cgi?id=50993>
>> On 06/07/2021 11:57, Andrzej Warzynski via flang-dev wrote:
>>> FYI, I've just opened an issue for this: 
>>> https://gitlab.kitware.com/cmake/cmake/-/issues/22387 
>> <https://gitlab.kitware.com/cmake/cmake/-/issues/22387>
>>> -Andrzej
>>> On 02/07/2021 22:06, Andrzej Warzynski via flang-dev wrote:
>>>> Hi Tin,
>>>> Thank you for taking a look at this!
>>>> * LLVM Flang - https://github.com/llvm/llvm-project/tree/main/flang 
>> <https://github.com/llvm/llvm-project/tree/main/flang>
>>>> * Classic Flang - https://github.com/flang-compiler/flang 
>> <https://github.com/flang-compiler/flang>
>>>> IIUC, the existing identification in CMake is for "Classic Flang". 
>>>> We want to preserve it - there will be a lot of developers that rely 
>>>> on it. So for "LLVM Flang", we probably want to add something new 
>>>> rather then modify the existing identification.
>>>> I'm not too concerned about the actual name, but I think that it 
>>>> would be very beneficial if we abandoned the name "Flang" in favour 
>>>> of something that uniquely identifies "Classic Flang" and "LLVM 
>>>> Flang". Otherwise this gets too confusing.
>>>> In my original e-mail I was only referring to "LLVM Flang". It was 
>>>> my incorrect assumption that the existing identification in CMake 
>>>> was introduced for "LLVM Flang". Apologies for that.
>>>> -Andrzej
>>>> On 02/07/2021 18:25, Tin Huynh via flang-dev wrote:
>>>>> Hi,
>>>>> I've been asked by Steve to take a look at Flang CMake integration 
>>>>> as I have upstreamed the original flang integration in the past.
>>>>> I've taken a look and confirm that if we change the predefines that 
>>>>> CMake looks for from upper case __FLANG to __flang__ (and other 
>>>>> similar predefines) cmake will be able to identify and use flang.
>>>>> The question I want to pose is: what should we name this flang for 
>>>>> cmake identification? There is already an existing flang 
>>>>> identification in CMake that I assume people depend on. So we will 
>>>>> need to duplicate the CMake identification bits for original flang 
>>>>> into a different name. I would like suggestions for what to name 
>>>>> it. (Perhaps llvm-flang?)
>>>>> I can set up the initial CMake identification for flang and create 
>>>>> a pull request upstream, but going forward someone with more 
>>>>> familiarity with flang's options should maintain it.
>>>>> Tin
>>>>> _______________________________________________
>>>>> flang-dev mailing list
>>>>> flang-dev at lists.llvm.org
>>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev 
>> <https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev>
>>>> _______________________________________________
>>>> flang-dev mailing list
>>>> flang-dev at lists.llvm.org
>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev 
>> <https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev>
>>> _______________________________________________
>>> flang-dev mailing list
>>> flang-dev at lists.llvm.org
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev 
>> <https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev>
>> _______________________________________________
>> flang-dev mailing list
>> flang-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev 
>> <https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev>
> _______________________________________________
> flang-dev mailing list
> flang-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/flang-dev

More information about the flang-dev mailing list