[cfe-commits] [RFC and PATCH] Fortran

Hal Finkel hfinkel at anl.gov
Thu May 3 13:55:18 PDT 2012


Hello,

In order to support our users who have Fortran codes, I would like to
start working on adding Fortran support into clang. While at first this
may seem like an odd fit, I think that it should work well for two
reasons:

 1. Most modern Fortran codes actually rely on the C preprocessor, and
 so almost all Fortran compilers provide some kind of "integrated" C
 preprocessor (often with some slightly different main-source
 tokenization rules). For those of you who are not familiar, the
 convention is that .f, .f90, etc. are plain Fortran files
 while .F, .F90, etc. require the C preprocessor. clang has a good
 preprocessor implementation, a lot of machinery for dealing with
 parsing on top of the preprocssor and providing good errors and
 warnings in the presence of macros. Reusing clang's capabilites here
 makes a lot of sense.

 2. Modern Fortran is actually very similar to C++. It provides modules
 (which are very much like C++ namespaces), types (which are very much
 like C++ classes), operator overloading, etc. The control-flow
 structures and built-in types are very similar between the two
 languages; almost all of the differences are syntactical. As a
 practical matter, Fortran is the "other" high-performance language. It
 would make a lot of sense to reuse the AST->LLVM code in clang, as
 much of it will be identical for Fortran.

My idea is to modify the Lexer to support Fortran tokenization, and
create a Fortran parser. This parser will, for the most part, map the
Fortran code onto the C++ AST. In doing so, we can even reuse a lot of
the semantic-analysis code. I think that this can be done is a clean
way while disturbing very little of the C/C++ code (and reusing large
chunks of it).

I would like to propose the attached patch, after some test cases are
added, for inclusion into clang. This patch contains what I believe to
be nearly complete modifications to the dirver and lexer. It also
contains a stub parser -- it is capable of compiling only the simplest
possible do-nothing free-form Fortran program:
program foo
end program

Perhaps we would like a more-complete implementation prior to
considering this for trunk integration, but as incremental patches may
be preferable, I figured that I'd try to start a discussion about this
earlier rather than later (and, hopefully, attract some collaborators).

Please let me know what you think.

Thanks again,
Hal

-- 
Hal Finkel
Postdoctoral Appointee
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clang_fortran_20120503.patch
Type: text/x-patch
Size: 66842 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120503/09e0b29d/attachment.bin>


More information about the cfe-commits mailing list