Intro¶
This document goes briefly over compiler phases in Flang. It focuses on the internal implementation and as such, it is intended for Flang developers rather than end-users.
Overview of Compiler Phases¶
Each phase produces either correct output or fatal errors.
Prescan and Preprocess¶
See: Preprocessing.md.
Input: Fortran source and header files, command line macro definitions, set of enabled compiler directives (to be treated as directives rather than comments).
Output:
A “cooked” character stream: the entire program as a contiguous stream of normalized Fortran source. Extraneous whitespace and comments are removed (except comments that are compiler directives that are not disabled) and case is normalized.
Provenance information mapping each character back to the source it came from. This is used in subsequent phases to issue errors messages that refer to source locations.
Entry point: parser::Parsing::Prescan
Command: flang-new -fc1 -E src.f90
dumps the cooked character stream
Parse¶
Input: Cooked character stream.
Output: A parse tree representing a syntactically correct program,
rooted at a parser::Program
.
See: Parsing.md and ParserCombinators.md.
Entry point: parser::Parsing::Parse
Command:
flang-new -fc1 -fdebug-dump-parse-tree src.f90
dumps the parse treeflang-new -fc1 -fdebug-unparse src.f90
converts the parse tree to normalized Fortran
Validate Labels and Canonicalize Do Statements¶
Input: Parse tree.
Output: The parse tree with label constraints and construct names checked,
and each LabelDoStmt
converted to a NonLabelDoStmt
.
See: LabelResolution.md.
Entry points: semantics::ValidateLabels
, parser::CanonicalizeDo
Resolve Names¶
Input: Parse tree (without LabelDoStmt
) and .mod
files from compilation
of USEd modules.
Output:
Tree of scopes populated with symbols and types
Parse tree with some refinements:
each
parser::Name::symbol
field points to one of the symbolseach
parser::TypeSpec::declTypeSpec
field points to one of the typesarray element references that were parsed as function references or statement functions are corrected
Entry points: semantics::ResolveNames
, semantics::RewriteParseTree
Command: flang-new -fc1 -fdebug-dump-symbols src.f90
dumps the
tree of scopes and symbols in each scope
Check DO CONCURRENT Constraints¶
Input: Parse tree with names resolved.
Output: Parse tree with semantically correct DO CONCURRENT loops.
Write Module Files¶
Input: Parse tree with names resolved.
Output: For each module and submodule, a .mod
file containing a minimal
Fortran representation suitable for compiling program units that depend on it.
See ModFiles.md.
Analyze Expressions and Assignments¶
Input: Parse tree with names resolved.
Output: Parse tree with parser::Expr::typedExpr
filled in and semantic
checks performed on all expressions and assignment statements.
Entry points: semantics::AnalyzeExpressions
, semantics::AnalyzeAssignments
Produce the Intermediate Representation¶
Input: Parse tree with names and labels resolved.
Output: An intermediate representation of the executable program. See FortranIR.md.