|  | \input texinfo  @c -*-texinfo-*- | 
|  | @c %**start of header | 
|  | @setfilename gfc-internals.info | 
|  | @set copyrights-gfortran 2007-2025 | 
|  |  | 
|  | @include gcc-common.texi | 
|  |  | 
|  | @synindex tp cp | 
|  |  | 
|  | @settitle GNU Fortran Compiler Internals | 
|  |  | 
|  | @c %**end of header | 
|  |  | 
|  | @c Use with @@smallbook. | 
|  |  | 
|  | @c %** start of document | 
|  |  | 
|  | @c Cause even numbered pages to be printed on the left hand side of | 
|  | @c the page and odd numbered pages to be printed on the right hand | 
|  | @c side of the page.  Using this, you can print on both sides of a | 
|  | @c sheet of paper and have the text on the same part of the sheet. | 
|  |  | 
|  | @c The text on right hand pages is pushed towards the right hand | 
|  | @c margin and the text on left hand pages is pushed toward the left | 
|  | @c hand margin. | 
|  | @c (To provide the reverse effect, set bindingoffset to -0.75in.) | 
|  |  | 
|  | @c @tex | 
|  | @c \global\bindingoffset=0.75in | 
|  | @c \global\normaloffset =0.75in | 
|  | @c @end tex | 
|  |  | 
|  | @copying | 
|  | Copyright @copyright{} @value{copyrights-gfortran} Free Software Foundation, Inc. | 
|  |  | 
|  | Permission is granted to copy, distribute and/or modify this document | 
|  | under the terms of the GNU Free Documentation License, Version 1.3 or | 
|  | any later version published by the Free Software Foundation; with the | 
|  | Invariant Sections being ``Funding Free Software'', the Front-Cover | 
|  | Texts being (a) (see below), and with the Back-Cover Texts being (b) | 
|  | (see below).  A copy of the license is included in the section entitled | 
|  | ``GNU Free Documentation License''. | 
|  |  | 
|  | (a) The FSF's Front-Cover Text is: | 
|  |  | 
|  | A GNU Manual | 
|  |  | 
|  | (b) The FSF's Back-Cover Text is: | 
|  |  | 
|  | You have freedom to copy and modify this GNU Manual, like GNU | 
|  | software.  Copies published by the Free Software Foundation raise | 
|  | funds for GNU development. | 
|  | @end copying | 
|  |  | 
|  | @ifinfo | 
|  | @dircategory Software development | 
|  | @direntry | 
|  | * gfortran: (gfortran).                  The GNU Fortran Compiler. | 
|  | @end direntry | 
|  | This file documents the internals of the GNU Fortran | 
|  | compiler, (@command{gfortran}). | 
|  |  | 
|  | Published by the Free Software Foundation | 
|  | 51 Franklin Street, Fifth Floor | 
|  | Boston, MA 02110-1301 USA | 
|  |  | 
|  | @insertcopying | 
|  | @end ifinfo | 
|  |  | 
|  |  | 
|  | @setchapternewpage odd | 
|  | @titlepage | 
|  | @title GNU Fortran Internals | 
|  | @versionsubtitle | 
|  | @author The @t{gfortran} team | 
|  | @page | 
|  | @vskip 0pt plus 1filll | 
|  | Published by the Free Software Foundation@* | 
|  | 51 Franklin Street, Fifth Floor@* | 
|  | Boston, MA 02110-1301, USA@* | 
|  | @c Last printed ??ber, 19??.@* | 
|  | @c Printed copies are available for $? each.@* | 
|  | @c ISBN ??? | 
|  | @sp 1 | 
|  | @insertcopying | 
|  | @end titlepage | 
|  |  | 
|  | @summarycontents | 
|  | @contents | 
|  |  | 
|  | @page | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c TexInfo table of contents. | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @ifnottex | 
|  | @node Top | 
|  | @top Introduction | 
|  | @cindex Introduction | 
|  |  | 
|  | This manual documents the internals of @command{gfortran}, | 
|  | the GNU Fortran compiler. | 
|  |  | 
|  | @ifset DEVELOPMENT | 
|  | @emph{Warning:} This document, and the compiler it describes, are still | 
|  | under development.  While efforts are made to keep it up-to-date, it might | 
|  | not accurately reflect the status of the most recent GNU Fortran compiler. | 
|  | @end ifset | 
|  |  | 
|  | @comment | 
|  | @comment  When you add a new menu item, please keep the right hand | 
|  | @comment  aligned to the same column.  Do not use tabs.  This provides | 
|  | @comment  better formatting. | 
|  | @comment | 
|  | @menu | 
|  | * Introduction::           About this manual. | 
|  | * User Interface::         Code that Interacts with the User. | 
|  | * Frontend Data Structures:: | 
|  | Data structures used by the frontend | 
|  | * Object Orientation::     Internals of Fortran 2003 OOP features. | 
|  | * Translating to GENERIC:: | 
|  | Generating the intermediate language for later stages. | 
|  | * LibGFortran::            The LibGFortran Runtime Library. | 
|  | * GNU Free Documentation License:: | 
|  | How you can copy and share this manual. | 
|  | * Index::                  Index of this documentation. | 
|  | @end menu | 
|  | @end ifnottex | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c Introduction | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Introduction | 
|  | @chapter Introduction | 
|  |  | 
|  | @c The following duplicates the text on the TexInfo table of contents. | 
|  | @iftex | 
|  | This manual documents the internals of @command{gfortran}, the GNU Fortran | 
|  | compiler. | 
|  |  | 
|  | @ifset DEVELOPMENT | 
|  | @emph{Warning:} This document, and the compiler it describes, are still | 
|  | under development.  While efforts are made to keep it up-to-date, it | 
|  | might not accurately reflect the status of the most recent GNU Fortran | 
|  | compiler. | 
|  | @end ifset | 
|  | @end iftex | 
|  |  | 
|  | At present, this manual is very much a work in progress, containing | 
|  | miscellaneous notes about the internals of the compiler.  It is hoped | 
|  | that at some point in the future it will become a reasonably complete | 
|  | guide; in the interim, GNU Fortran developers are strongly encouraged to | 
|  | contribute to it as a way of keeping notes while working on the | 
|  | compiler. | 
|  |  | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c Code that Interacts with the User | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node User Interface | 
|  | @chapter Code that Interacts with the User | 
|  |  | 
|  | @menu | 
|  | * Command-Line Options::    Command-Line Options. | 
|  | * Error Handling::          Error Handling. | 
|  | @end menu | 
|  |  | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c Command-Line Options | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Command-Line Options | 
|  | @section Command-Line Options | 
|  |  | 
|  | Command-line options for @command{gfortran} involve four interrelated | 
|  | pieces within the Fortran compiler code. | 
|  |  | 
|  | The relevant command-line flag is defined in @file{lang.opt}, according | 
|  | to the documentation in @ref{Options,, Options, gccint, GNU Compiler | 
|  | Collection Internals}.  This is then processed by the overall GCC | 
|  | machinery to create the code that enables @command{gfortran} and | 
|  | @command{gcc} to recognize the option in the command-line arguments and | 
|  | call the relevant handler function. | 
|  |  | 
|  | This generated code calls the @code{gfc_handle_option} code in | 
|  | @file{options.cc} with an enumerator variable indicating which option is | 
|  | to be processed, and the relevant integer or string values associated | 
|  | with that option flag.  Typically, @code{gfc_handle_option} uses these | 
|  | arguments to set global flags which record the option states. | 
|  |  | 
|  | The global flags that record the option states are stored in the | 
|  | @code{gfc_option_t} struct, which is defined in @file{gfortran.h}. | 
|  | Before the options are processed, initial values for these flags are set | 
|  | in @code{gfc_init_option} in @file{options.cc}; these become the default | 
|  | values for the options. | 
|  |  | 
|  |  | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c Error Handling | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Error Handling | 
|  | @section Error Handling | 
|  |  | 
|  | The GNU Fortran compiler's parser operates by testing each piece of | 
|  | source code against a variety of matchers.  In some cases, if these | 
|  | matchers do not match the source code, they will store an error message | 
|  | in a buffer.  If the parser later finds a matcher that does correctly | 
|  | match the source code, then the buffered error is discarded.  However, | 
|  | if the parser cannot find a match, then the buffered error message is | 
|  | reported to the user.  This enables the compiler to provide more | 
|  | meaningful error messages even in the many cases where (erroneous) | 
|  | Fortran syntax is ambiguous due to things like the absence of reserved | 
|  | keywords. | 
|  |  | 
|  | As an example of how this works, consider the following line: | 
|  | @smallexample | 
|  | IF = 3 | 
|  | @end smallexample | 
|  | Hypothetically, this may get passed to the matcher for an @code{IF} | 
|  | statement.  Since this could plausibly be an erroneous @code{IF} | 
|  | statement, the matcher will buffer an error message reporting the | 
|  | absence of an expected @samp{(} following an @code{IF}.  Since no | 
|  | matchers reported an error-free match, however, the parser will also try | 
|  | matching this against a variable assignment.  When @code{IF} is a valid | 
|  | variable, this will be parsed as an assignment statement, and the error | 
|  | discarded.  However, when @code{IF} is not a valid variable, this | 
|  | buffered error message will be reported to the user. | 
|  |  | 
|  | The error handling code is implemented in @file{error.cc}.  Errors are | 
|  | normally entered into the buffer with the @code{gfc_error} function. | 
|  | Warnings go through a similar buffering process, and are entered into | 
|  | the buffer with @code{gfc_warning}.  There is also a special-purpose | 
|  | function, @code{gfc_notify_std}, for things which have an error/warning | 
|  | status that depends on the currently-selected language standard. | 
|  |  | 
|  | The @code{gfc_error_check} function checks the buffer for errors, | 
|  | reports the error message to the user if one exists, clears the buffer, | 
|  | and returns a flag to the user indicating whether or not an error | 
|  | existed.  To check the state of the buffer without changing its state or | 
|  | reporting the errors, the @code{gfc_error_flag_test} function can be | 
|  | used.  The @code{gfc_clear_error} function will clear out any errors in | 
|  | the buffer, without reporting them.  The @code{gfc_warning_check} and | 
|  | @code{gfc_clear_warning} functions provide equivalent functionality for | 
|  | the warning buffer. | 
|  |  | 
|  | Only one error and one warning can be in the buffers at a time, and | 
|  | buffering another will overwrite the existing one.  In cases where one | 
|  | may wish to work on a smaller piece of source code without disturbing an | 
|  | existing error state, the @code{gfc_push_error}, @code{gfc_pop_error}, | 
|  | and @code{gfc_free_error} mechanism exists to implement a stack for the | 
|  | error buffer. | 
|  |  | 
|  | For cases where an error or warning should be reported immediately | 
|  | rather than buffered, the @code{gfc_error_now} and | 
|  | @code{gfc_warning_now} functions can be used.  Normally, the compiler | 
|  | will continue attempting to parse the program after an error has | 
|  | occurred, but if this is not appropriate, the @code{gfc_fatal_error} | 
|  | function should be used instead.  For errors that are always the result | 
|  | of a bug somewhere in the compiler, the @code{gfc_internal_error} | 
|  | function should be used. | 
|  |  | 
|  | The syntax for the strings used to produce the error/warning message in | 
|  | the various error and warning functions is similar to the @code{printf} | 
|  | syntax, with @samp{%}-escapes to insert variable values.  The details, | 
|  | and the allowable codes, are documented in the @code{error_print} | 
|  | function in @file{error.cc}. | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c Frontend Data Structures | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Frontend Data Structures | 
|  | @chapter Frontend Data Structures | 
|  | @cindex data structures | 
|  |  | 
|  | This chapter should describe the details necessary to understand how | 
|  | the various @code{gfc_*} data are used and interact.  In general it is | 
|  | advisable to read the code in @file{dump-parse-tree.cc} as its routines | 
|  | should exhaust all possible valid combinations of content for these | 
|  | structures. | 
|  |  | 
|  | @menu | 
|  | * gfc_code:: Representation of Executable Statements. | 
|  | * gfc_expr:: Representation of Values and Expressions. | 
|  | @end menu | 
|  |  | 
|  |  | 
|  | @c gfc_code | 
|  | @c -------- | 
|  |  | 
|  | @node gfc_code | 
|  | @section @code{gfc_code} | 
|  | @cindex statement chaining | 
|  | @tindex @code{gfc_code} | 
|  | @tindex @code{struct gfc_code} | 
|  |  | 
|  | The executable statements in a program unit are represented by a | 
|  | nested chain of @code{gfc_code} structures.  The type of statement is | 
|  | identified by the @code{op} member of the structure, the different | 
|  | possible values are enumerated in @code{gfc_exec_op}.  A special | 
|  | member of this @code{enum} is @code{EXEC_NOP} which is used to | 
|  | represent the various @code{END} statements if they carry a label. | 
|  | Depending on the type of statement some of the other fields will be | 
|  | filled in.  Fields that are generally applicable are the @code{next} | 
|  | and @code{here} fields.  The former points to the next statement in | 
|  | the current block or is @code{NULL} if the current statement is the | 
|  | last in a block, @code{here} points to the statement label of the | 
|  | current statement. | 
|  |  | 
|  | If the current statement is one of @code{IF}, @code{DO}, @code{SELECT} | 
|  | it starts a block, i.e.@: a nested level in the program.  In order to | 
|  | represent this, the @code{block} member is set to point to a | 
|  | @code{gfc_code} structure whose @code{next} member starts the chain of | 
|  | statements inside the block; this structure's @code{op} member should be set to | 
|  | the same value as the parent structure's @code{op} member.  The @code{SELECT} | 
|  | and @code{IF} statements may contain various blocks (the chain of @code{ELSE IF} | 
|  | and @code{ELSE} blocks or the various @code{CASE}s, respectively).  These chains | 
|  | are linked-lists formed by the @code{block} members. | 
|  |  | 
|  | Consider the following example code: | 
|  |  | 
|  | @example | 
|  | IF (foo < 20) THEN | 
|  | PRINT *, "Too small" | 
|  | foo = 20 | 
|  | ELSEIF (foo > 50) THEN | 
|  | PRINT *, "Too large" | 
|  | foo = 50 | 
|  | ELSE | 
|  | PRINT *, "Good" | 
|  | END IF | 
|  | @end example | 
|  |  | 
|  | This statement-block will be represented in the internal gfortran tree as | 
|  | follows, were the horizontal link-chains are those induced by the @code{next} | 
|  | members and vertical links down are those of @code{block}. @samp{==|} and | 
|  | @samp{--|} mean @code{NULL} pointers to mark the end of a chain: | 
|  |  | 
|  | @example | 
|  | ... ==> IF ==> ... | 
|  | | | 
|  | +--> IF foo < 20 ==> PRINT *, "Too small" ==> foo = 20 ==| | 
|  | | | 
|  | +--> IF foo > 50 ==> PRINT *, "Too large" ==> foo = 50 ==| | 
|  | | | 
|  | +--> ELSE ==> PRINT *, "Good" ==| | 
|  | | | 
|  | +--| | 
|  | @end example | 
|  |  | 
|  |  | 
|  | @subsection IF Blocks | 
|  |  | 
|  | Conditionals are represented by @code{gfc_code} structures with their | 
|  | @code{op} member set to @code{EXEC_IF}.  This structure's @code{block} | 
|  | member must point to another @code{gfc_code} node that is the header of the | 
|  | if-block.  This header's @code{op} member must be set to @code{EXEC_IF}, too, | 
|  | its @code{expr} member holds the condition to check for, and its @code{next} | 
|  | should point to the code-chain of the statements to execute if the condition is | 
|  | true. | 
|  |  | 
|  | If in addition an @code{ELSEIF} or @code{ELSE} block is present, the | 
|  | @code{block} member of the if-block-header node points to yet another | 
|  | @code{gfc_code} structure that is the header of the elseif- or else-block.  Its | 
|  | structure is identical to that of the if-block-header, except that in case of an | 
|  | @code{ELSE} block without a new condition the @code{expr} member should be | 
|  | @code{NULL}.  This block can itself have its @code{block} member point to the | 
|  | next @code{ELSEIF} or @code{ELSE} block if there's a chain of them. | 
|  |  | 
|  |  | 
|  | @subsection Loops | 
|  |  | 
|  | @code{DO} loops are stored in the tree as @code{gfc_code} nodes with their | 
|  | @code{op} set to @code{EXEC_DO} for a @code{DO} loop with iterator variable and | 
|  | to @code{EXEC_DO_WHILE} for infinite @code{DO}s and @code{DO WHILE} blocks. | 
|  | Their @code{block} member should point to a @code{gfc_code} structure heading | 
|  | the code-chain of the loop body; its @code{op} member should be set to | 
|  | @code{EXEC_DO} or @code{EXEC_DO_WHILE}, too, respectively. | 
|  |  | 
|  | For @code{DO WHILE} loops, the loop condition is stored on the top | 
|  | @code{gfc_code} structure's @code{expr} member; @code{DO} forever loops are | 
|  | simply @code{DO WHILE} loops with a constant @code{.TRUE.} loop condition in | 
|  | the internal representation. | 
|  |  | 
|  | Similarly, @code{DO} loops with an iterator have instead of the condition their | 
|  | @code{ext.iterator} member set to the correct values for the loop iterator | 
|  | variable and its range. | 
|  |  | 
|  |  | 
|  | @subsection @code{SELECT} Statements | 
|  |  | 
|  | A @code{SELECT} block is introduced by a @code{gfc_code} structure with an | 
|  | @code{op} member of @code{EXEC_SELECT} and @code{expr} containing the expression | 
|  | to evaluate and test.  Its @code{block} member starts a list of @code{gfc_code} | 
|  | structures linked together by their @code{block} members that stores the various | 
|  | @code{CASE} parts. | 
|  |  | 
|  | Each @code{CASE} node has its @code{op} member set to @code{EXEC_SELECT}, too, | 
|  | its @code{next} member points to the code-chain to be executed in the current | 
|  | case-block, and @code{extx.case_list} contains the case-values this block | 
|  | corresponds to.  The @code{block} member links to the next case in the list. | 
|  |  | 
|  |  | 
|  | @subsection @code{BLOCK} and @code{ASSOCIATE} | 
|  |  | 
|  | The code related to a @code{BLOCK} statement is stored inside an | 
|  | @code{gfc_code} structure (say @var{c}) | 
|  | with @code{c.op} set to @code{EXEC_BLOCK}.  The | 
|  | @code{gfc_namespace} holding the locally defined variables of the | 
|  | @code{BLOCK} is stored in @code{c.ext.block.ns}.  The code inside the | 
|  | construct is in @code{c.code}. | 
|  |  | 
|  | @code{ASSOCIATE} constructs are based on @code{BLOCK} and thus also have | 
|  | the internal storage structure described above (including @code{EXEC_BLOCK}). | 
|  | However, for them @code{c.ext.block.assoc} is set additionally and points | 
|  | to a linked list of @code{gfc_association_list} structures.  Those | 
|  | structures basically store a link of associate-names to target expressions. | 
|  | The associate-names themselves are still also added to the @code{BLOCK}'s | 
|  | namespace as ordinary symbols, but they have their @code{gfc_symbol}'s | 
|  | member @code{assoc} set also pointing to the association-list structure. | 
|  | This way associate-names can be distinguished from ordinary variables | 
|  | and their target expressions identified. | 
|  |  | 
|  | For association to expressions (as opposed to variables), at the very beginning | 
|  | of the @code{BLOCK} construct assignments are automatically generated to | 
|  | set the corresponding variables to their target expressions' values, and | 
|  | later on the compiler simply disallows using such associate-names in contexts | 
|  | that may change the value. | 
|  |  | 
|  |  | 
|  | @c gfc_expr | 
|  | @c -------- | 
|  |  | 
|  | @node gfc_expr | 
|  | @section @code{gfc_expr} | 
|  | @tindex @code{gfc_expr} | 
|  | @tindex @code{struct gfc_expr} | 
|  |  | 
|  | Expressions and ``values'', including constants, variable-, array- and | 
|  | component-references as well as complex expressions consisting of operators and | 
|  | function calls are internally represented as one or a whole tree of | 
|  | @code{gfc_expr} objects.  The member @code{expr_type} specifies the overall | 
|  | type of an expression (for instance, @code{EXPR_CONSTANT} for constants or | 
|  | @code{EXPR_VARIABLE} for variable references).  The members @code{ts} and | 
|  | @code{rank} as well as @code{shape}, which can be @code{NULL}, specify | 
|  | the type, rank and, if applicable, shape of the whole expression or expression | 
|  | tree of which the current structure is the root.  @code{where} is the locus of | 
|  | this expression in the source code. | 
|  |  | 
|  | Depending on the flavor of the expression being described by the object | 
|  | (that is, the value of its @code{expr_type} member), the corresponding structure | 
|  | in the @code{value} union will usually contain additional data describing the | 
|  | expression's value in a type-specific manner.  The @code{ref} member is used to | 
|  | build chains of (array-, component- and substring-) references if the expression | 
|  | in question contains such references, see below for details. | 
|  |  | 
|  |  | 
|  | @subsection Constants | 
|  |  | 
|  | Scalar constants are represented by @code{gfc_expr} nodes with their | 
|  | @code{expr_type} set to @code{EXPR_CONSTANT}.  The constant's value shall | 
|  | already be known at compile-time and is stored in the @code{logical}, | 
|  | @code{integer}, @code{real}, @code{complex} or @code{character} struct inside | 
|  | @code{value}, depending on the constant's type specification. | 
|  |  | 
|  |  | 
|  | @subsection Operators | 
|  |  | 
|  | Operator-expressions are expressions that are the result of the execution of | 
|  | some operator on one or two operands.  The expressions have an @code{expr_type} | 
|  | of @code{EXPR_OP}.  Their @code{value.op} structure contains additional data. | 
|  |  | 
|  | @code{op1} and optionally @code{op2} if the operator is binary point to the | 
|  | two operands, and @code{operator} or @code{uop} describe the operator that | 
|  | should be evaluated on these operands, where @code{uop} describes a user-defined | 
|  | operator. | 
|  |  | 
|  |  | 
|  | @subsection Function Calls | 
|  |  | 
|  | If the expression is the return value of a function-call, its @code{expr_type} | 
|  | is set to @code{EXPR_FUNCTION}, and @code{symtree} must point to the symtree | 
|  | identifying the function to be called.  @code{value.function.actual} holds the | 
|  | actual arguments given to the function as a linked list of | 
|  | @code{gfc_actual_arglist} nodes. | 
|  |  | 
|  | The other members of @code{value.function} describe the function being called | 
|  | in more detail, containing a link to the intrinsic symbol or user-defined | 
|  | function symbol if the call is to an intrinsic or external function, | 
|  | respectively.  These values are determined during resolution-phase from the | 
|  | structure's @code{symtree} member. | 
|  |  | 
|  | A special case of function calls are ``component calls'' to type-bound | 
|  | procedures; those have the @code{expr_type} @code{EXPR_COMPCALL} with | 
|  | @code{value.compcall} containing the argument list and the procedure called, | 
|  | while @code{symtree} and @code{ref} describe the object on which the procedure | 
|  | was called in the same way as a @code{EXPR_VARIABLE} expression would. | 
|  | @xref{Type-bound Procedures}. | 
|  |  | 
|  |  | 
|  | @subsection Array- and Structure-Constructors | 
|  |  | 
|  | Array- and structure-constructors (one could probably call them ``array-'' and | 
|  | ``derived-type constants'') are @code{gfc_expr} structures with their | 
|  | @code{expr_type} member set to @code{EXPR_ARRAY} or @code{EXPR_STRUCTURE}, | 
|  | respectively.  For structure constructors, @code{symtree} points to the | 
|  | derived-type symbol for the type being constructed. | 
|  |  | 
|  | The values for initializing each array element or structure component are | 
|  | stored as linked-list of @code{gfc_constructor} nodes in the | 
|  | @code{value.constructor} member. | 
|  |  | 
|  |  | 
|  | @subsection Null | 
|  |  | 
|  | @code{NULL} is a special value for pointers; it can be of different base types. | 
|  | Such a @code{NULL} value is represented in the internal tree by a | 
|  | @code{gfc_expr} node with @code{expr_type} @code{EXPR_NULL}.  If the base type | 
|  | of the @code{NULL} expression is known, it is stored in @code{ts} (that's for | 
|  | instance the case for default-initializers of @code{ALLOCATABLE} components), | 
|  | but this member can also be set to @code{BT_UNKNOWN} if the information is not | 
|  | available (for instance, when the expression is a pointer-initializer | 
|  | @code{NULL()}). | 
|  |  | 
|  |  | 
|  | @subsection Variables and Reference Expressions | 
|  |  | 
|  | Variable references are @code{gfc_expr} structures with their @code{expr_type} | 
|  | set to @code{EXPR_VARIABLE}; their @code{symtree} should point to the variable | 
|  | that is referenced. | 
|  |  | 
|  | For this type of expression, it's also possible to chain array-, component- | 
|  | or substring-references to the original expression to get something like | 
|  | @samp{struct%component(2:5)}, where @code{component} is either an array or | 
|  | a @code{CHARACTER} member of @code{struct} that is of some derived-type.  Such a | 
|  | chain of references is achieved by a linked list headed by @code{ref} of the | 
|  | @code{gfc_expr} node.  For the example above it would be (@samp{==|} is the | 
|  | last @code{NULL} pointer): | 
|  |  | 
|  | @smallexample | 
|  | EXPR_VARIABLE(struct) ==> REF_COMPONENT(component) ==> REF_ARRAY(2:5) ==| | 
|  | @end smallexample | 
|  |  | 
|  | If @code{component} is a string rather than an array, the last element would be | 
|  | a @code{REF_SUBSTRING} reference, of course.  If the variable itself or some | 
|  | component referenced is an array and the expression should reference the whole | 
|  | array rather than being followed by an array-element or -section reference, a | 
|  | @code{REF_ARRAY} reference must be built as the last element in the chain with | 
|  | an array-reference type of @code{AR_FULL}. Consider this example code: | 
|  |  | 
|  | @smallexample | 
|  | TYPE :: mytype | 
|  | INTEGER :: array(42) | 
|  | END TYPE mytype | 
|  |  | 
|  | TYPE(mytype) :: variable | 
|  | INTEGER :: local_array(5) | 
|  |  | 
|  | CALL do_something (variable%array, local_array) | 
|  | @end smallexample | 
|  |  | 
|  | The @code{gfc_expr} nodes representing the arguments to the @samp{do_something} | 
|  | call will have a reference-chain like this: | 
|  |  | 
|  | @smallexample | 
|  | EXPR_VARIABLE(variable) ==> REF_COMPONENT(array) ==> REF_ARRAY(FULL) ==| | 
|  | EXPR_VARIABLE(local_array) ==> REF_ARRAY(FULL) ==| | 
|  | @end smallexample | 
|  |  | 
|  |  | 
|  | @subsection Constant Substring References | 
|  |  | 
|  | @code{EXPR_SUBSTRING} is a special type of expression that encodes a substring | 
|  | reference of a constant string, as in the following code snippet: | 
|  |  | 
|  | @smallexample | 
|  | x = "abcde"(1:2) | 
|  | @end smallexample | 
|  |  | 
|  | In this case, @code{value.character} contains the full string's data as if it | 
|  | was a string constant, but the @code{ref} member is also set and points to a | 
|  | substring reference as described in the subsection above. | 
|  |  | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c F2003 OOP | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Object Orientation | 
|  | @chapter Internals of Fortran 2003 OOP Features | 
|  |  | 
|  | @menu | 
|  | * Type-bound Procedures:: Type-bound procedures. | 
|  | * Type-bound Operators::  Type-bound operators. | 
|  | @end menu | 
|  |  | 
|  |  | 
|  | @c Type-bound procedures | 
|  | @c --------------------- | 
|  |  | 
|  | @node Type-bound Procedures | 
|  | @section Type-bound Procedures | 
|  |  | 
|  | Type-bound procedures are stored in the @code{tb_sym_root} of the namespace | 
|  | @code{f2k_derived} associated with the derived-type symbol as @code{gfc_symtree} | 
|  | nodes.  The name and symbol of these symtrees corresponds to the binding-name | 
|  | of the procedure, i.e. the name that is used to call it from the context of an | 
|  | object of the derived-type. | 
|  |  | 
|  | In addition, this type of symtrees stores in @code{n.tb} a struct of type | 
|  | @code{gfc_typebound_proc} containing the additional data needed:  The | 
|  | binding attributes (like @code{PASS} and @code{NOPASS}, @code{NON_OVERRIDABLE} | 
|  | or the access-specifier), the binding's target(s) and, if the current binding | 
|  | overrides or extends an inherited binding of the same name, @code{overridden} | 
|  | points to this binding's @code{gfc_typebound_proc} structure. | 
|  |  | 
|  |  | 
|  | @subsection Specific Bindings | 
|  | @c -------------------------- | 
|  |  | 
|  | For specific bindings (declared with @code{PROCEDURE}), if they have a | 
|  | passed-object argument, the passed-object dummy argument is first saved by its | 
|  | name, and later during resolution phase the corresponding argument is looked for | 
|  | and its position remembered as @code{pass_arg_num} in @code{gfc_typebound_proc}. | 
|  | The binding's target procedure is pointed-to by @code{u.specific}. | 
|  |  | 
|  | @code{DEFERRED} bindings are just like ordinary specific bindings, except | 
|  | that their @code{deferred} flag is set of course and that @code{u.specific} | 
|  | points to their ``interface'' defining symbol (might be an abstract interface) | 
|  | instead of the target procedure. | 
|  |  | 
|  | At the moment, all type-bound procedure calls are statically dispatched and | 
|  | transformed into ordinary procedure calls at resolution time; their actual | 
|  | argument list is updated to include at the right position the passed-object | 
|  | argument, if applicable, and then a simple procedure call to the binding's | 
|  | target procedure is built.  To handle dynamic dispatch in the future, this will | 
|  | be extended to allow special code generation during the trans-phase to dispatch | 
|  | based on the object's dynamic type. | 
|  |  | 
|  |  | 
|  | @subsection Generic Bindings | 
|  | @c ------------------------- | 
|  |  | 
|  | Bindings declared as @code{GENERIC} store the specific bindings they target as | 
|  | a linked list using nodes of type @code{gfc_tbp_generic} in @code{u.generic}. | 
|  | For each specific target, the parser records its symtree and during resolution | 
|  | this symtree is bound to the corresponding @code{gfc_typebound_proc} structure | 
|  | of the specific target. | 
|  |  | 
|  | Calls to generic bindings are handled entirely in the resolution-phase, where | 
|  | for the actual argument list present the matching specific binding is found | 
|  | and the call's target procedure (@code{value.compcall.tbp}) is re-pointed to | 
|  | the found specific binding and this call is subsequently handled by the logic | 
|  | for specific binding calls. | 
|  |  | 
|  |  | 
|  | @subsection Calls to Type-bound Procedures | 
|  | @c --------------------------------------- | 
|  |  | 
|  | Calls to type-bound procedures are stored in the parse-tree as @code{gfc_expr} | 
|  | nodes of type @code{EXPR_COMPCALL}.  Their @code{value.compcall.actual} saves | 
|  | the actual argument list of the call and @code{value.compcall.tbp} points to the | 
|  | @code{gfc_typebound_proc} structure of the binding to be called.  The object | 
|  | in whose context the procedure was called is saved by combination of | 
|  | @code{symtree} and @code{ref}, as if the expression was of type | 
|  | @code{EXPR_VARIABLE}. | 
|  |  | 
|  | For code like this: | 
|  | @smallexample | 
|  | CALL myobj%procedure (arg1, arg2) | 
|  | @end smallexample | 
|  | @noindent | 
|  | the @code{CALL} is represented in the parse-tree as a @code{gfc_code} node of | 
|  | type @code{EXEC_COMPCALL}.  The @code{expr} member of this node holds an | 
|  | expression of type @code{EXPR_COMPCALL} of the same structure as mentioned above | 
|  | except that its target procedure is of course a @code{SUBROUTINE} and not a | 
|  | @code{FUNCTION}. | 
|  |  | 
|  | Expressions that are generated internally (as expansion of a type-bound | 
|  | operator call) may also use additional flags and members. | 
|  | @code{value.compcall.ignore_pass} signals that even though a @code{PASS} | 
|  | attribute may be present the actual argument list should not be updated because | 
|  | it already contains the passed-object. | 
|  | @code{value.compcall.base_object} overrides, if it is set, the base-object | 
|  | (that is normally stored in @code{symtree} and @code{ref} as mentioned above); | 
|  | this is needed because type-bound operators can be called on a base-object that | 
|  | need not be of type @code{EXPR_VARIABLE} and thus representable in this way. | 
|  | Finally, if @code{value.compcall.assign} is set, the call was produced in | 
|  | expansion of a type-bound assignment; this means that proper dependency-checking | 
|  | needs to be done when relevant. | 
|  |  | 
|  |  | 
|  | @c Type-bound operators | 
|  | @c -------------------- | 
|  |  | 
|  | @node Type-bound Operators | 
|  | @section Type-bound Operators | 
|  |  | 
|  | Type-bound operators are in fact basically just @code{GENERIC} procedure | 
|  | bindings and are represented much in the same way as those (see | 
|  | @ref{Type-bound Procedures}). | 
|  |  | 
|  | They come in two flavours: | 
|  | User-defined operators (like @code{.MYOPERATOR.}) | 
|  | are stored in the @code{f2k_derived} namespace's @code{tb_uop_root} | 
|  | symtree exactly like ordinary type-bound procedures are stored in | 
|  | @code{tb_sym_root}; their symtrees' names are the operator-names (e.g. | 
|  | @samp{myoperator} in the example). | 
|  | Intrinsic operators on the other hand are stored in the namespace's | 
|  | array member @code{tb_op} indexed by the intrinsic operator's enum | 
|  | value.  Those need not be packed into @code{gfc_symtree} structures and are | 
|  | only @code{gfc_typebound_proc} instances. | 
|  |  | 
|  | When an operator call or assignment is found that cannot be handled in | 
|  | another way (i.e. neither matches an intrinsic nor interface operator | 
|  | definition) but that contains a derived-type expression, all type-bound | 
|  | operators defined on that derived-type are checked for a match with | 
|  | the operator call.  If there's indeed a relevant definition, the | 
|  | operator call is replaced with an internally generated @code{GENERIC} | 
|  | type-bound procedure call to the respective definition and that call is | 
|  | further processed. | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c - Translating to GENERIC | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Translating to GENERIC | 
|  | @chapter Generating the intermediate language for later stages. | 
|  |  | 
|  | This chapter deals with the transformation of gfortran's frontend data | 
|  | structures to the intermediate language used by the later stages of | 
|  | the compiler, the so-called middle end. | 
|  |  | 
|  | Data structures relating to this are found in the source files | 
|  | @file{trans*.h} and @file{trans-*.c}. | 
|  |  | 
|  | @menu | 
|  | * Basic Data Structures::       Basic data structures. | 
|  | * Converting Expressions::      Converting expressions to tree. | 
|  | * Translating Statements::      Translating statements. | 
|  | * Accessing Declarations::      Accessing declarations. | 
|  | @end menu | 
|  |  | 
|  | @node Basic Data Structures | 
|  | @section Basic data structures | 
|  |  | 
|  | Gfortran creates GENERIC as an intermediate language for the | 
|  | middle-end. Details about GENERIC can be found in the GCC manual. | 
|  |  | 
|  | The basic data structure of GENERIC is a @code{tree}. Everything in | 
|  | GENERIC is a @code{tree}, including types and statements.  Fortunately | 
|  | for the gfortran programmer, @code{tree} variables are | 
|  | garbage-collected, so doing memory management for them is not | 
|  | necessary. | 
|  |  | 
|  | @code{tree} expressions are built using functions such as, for | 
|  | example, @code{fold_build2_loc}.  For two tree variables @code{a} and | 
|  | @code{b}, both of which have the type @code{gfc_arry_index_type}, | 
|  | calculation @code{c = a * b} would be done by | 
|  |  | 
|  | @smallexample | 
|  | c = fold_build2_loc (input_location, MULT_EXPR, | 
|  | gfc_array_index_type, a, b); | 
|  | @end smallexample | 
|  |  | 
|  | The types have to agree, otherwise internal compiler errors will occur | 
|  | at a later stage.  Expressions can be converted to a different type | 
|  | using @code{fold_convert}. | 
|  |  | 
|  | Accessing individual members in the @code{tree} structures should not | 
|  | be done. Rather, access should be done via macros. | 
|  |  | 
|  | One basic data structure is the @code{stmtblock_t} struct. This is | 
|  | used for holding a list of statements, expressed as @code{tree} | 
|  | expressions.  If a block is created using @code{gfc_start_block}, it | 
|  | has its own scope for variables; if it is created using | 
|  | @code{gfc_init_block}, it does not have its own scope. | 
|  |  | 
|  | It is possible to | 
|  | @itemize @bullet | 
|  | @item Add an expression to the end of a block using | 
|  | @code{gfc_add_expr_to_block} | 
|  | @item Add an expression to the beginning of a block using | 
|  | @code{void gfc_prepend_expr_to_block} | 
|  | @item Make a block into a single @code{tree} using | 
|  | @code{gfc_finish_block}.  For example, this is needed to put the | 
|  | contents of a block into the @code{if} or @code{else} branch of | 
|  | a @code{COND_EXPR}. | 
|  | @end itemize | 
|  |  | 
|  | Variables are also @code{tree} expressions, they can be created using | 
|  | @code{gfc_create_var}. Assigning to a variable can be done with | 
|  | @code{gfc_add_modify}. | 
|  |  | 
|  | An example: Creating a default integer type variable in the current | 
|  | scope with the prefix ``everything'' in the @code{stmt_block} | 
|  | @code{block} and assigning the value 42 would be | 
|  |  | 
|  | @smallexample | 
|  | tree var, *block; | 
|  | /* Initialize block somewhere here.  */ | 
|  | var = gfc_create_var (integer_type_node, "everything"); | 
|  | gfc_add_modify (block, var, build_int_cst (integer_type_node, 42)); | 
|  | @end smallexample | 
|  |  | 
|  | @node Converting Expressions | 
|  | @section Converting Expressions to tree | 
|  |  | 
|  | Converting expressions to @code{tree} is done by functions called | 
|  | @code{gfc_conv_*}. | 
|  |  | 
|  | The central data structure for a GENERIC expression is the | 
|  | @code{gfc_se} structure.  Its @code{expr} member is a @code{tree} that | 
|  | holds the value of the expression.  A @code{gfc_se} structure is | 
|  | initialized using @code{gfc_init_se}; it needs to be embedded in an | 
|  | outer @code{gfc_se}. | 
|  |  | 
|  | Evaluating Fortran expressions often require things to be done before | 
|  | and after evaluation of the expression, for example code for the | 
|  | allocation of a temporary variable and its subsequent deallocation. | 
|  | Therefore, @code{gfc_se} contains the members @code{pre} and | 
|  | @code{post}, which point to @code{stmt_block} blocks for code that | 
|  | needs to be executed before and after evaluation of the expression. | 
|  |  | 
|  | When using a local @code{gfc_se} to convert some expression, it is | 
|  | often necessary to add the generated @code{pre} and @code{post} blocks | 
|  | to the @code{pre} or @code{post} blocks of the outer @code{gfc_se}. | 
|  | Code like this (lifted from @file{trans-expr.cc}) is fairly common: | 
|  |  | 
|  | @smallexample | 
|  | gfc_se cont_se; | 
|  | tree cont_var; | 
|  |  | 
|  | /* cont_var = is_contiguous (expr); .  */ | 
|  | gfc_init_se (&cont_se, parmse); | 
|  | gfc_conv_is_contiguous_expr (&cont_se, expr); | 
|  | gfc_add_block_to_block (&se->pre, &(&cont_se)->pre); | 
|  | gfc_add_modify (&se->pre, cont_var, cont_se.expr); | 
|  | gfc_add_block_to_block (&se->pre, &(&cont_se)->post); | 
|  | @end smallexample | 
|  |  | 
|  | Conversion functions which need a @code{gfc_se} structure will have a | 
|  | corresponding argument. | 
|  |  | 
|  | @code{gfc_se} also contains pointers to a @code{gfc_ss} and a | 
|  | @code{gfc_loopinfo} structure.  These are needed by the scalarizer. | 
|  |  | 
|  | @node Translating Statements | 
|  | @section Translating statements | 
|  | Translating statements to @code{tree} is done by functions called | 
|  | @code{gfc_trans_*}.  These functions usually get passed a | 
|  | @code{gfc_code} structure, evaluate any expressions and then | 
|  | return a @code{tree} structure. | 
|  |  | 
|  | @node Accessing Declarations | 
|  | @section Accessing declarations | 
|  |  | 
|  | @code{gfc_symbol}, @code{gfc_charlen} and other front-end structures | 
|  | contain a @code{backend_decl} variable, which contains the @code{tree} | 
|  | used for accessing that entity in the middle-end. | 
|  |  | 
|  | Accessing declarations is usually done by functions called | 
|  | @code{gfc_get*}. | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c LibGFortran | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node LibGFortran | 
|  | @chapter The LibGFortran Runtime Library | 
|  |  | 
|  | @menu | 
|  | * Symbol Versioning::    Symbol Versioning. | 
|  | @end menu | 
|  |  | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c Symbol Versioning | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Symbol Versioning | 
|  | @section Symbol Versioning | 
|  | @comment Based on https://gcc.gnu.org/wiki/SymbolVersioning, | 
|  | @comment as of 2006-11-05, written by Janne Blomqvist. | 
|  |  | 
|  | In general, this capability exists only on a few platforms, thus there | 
|  | is a need for configure magic so that it is used only on those targets | 
|  | where it is supported. | 
|  |  | 
|  | The central concept in symbol versioning is the so-called map file, | 
|  | which specifies the version node(s) exported symbols are labeled with. | 
|  | Also, the map file is used to hide local symbols. | 
|  |  | 
|  | Some relevant references: | 
|  | @itemize @bullet | 
|  | @item | 
|  | @uref{https://sourceware.org/binutils/docs/ld/VERSION.html, | 
|  | GNU @command{ld} manual} | 
|  |  | 
|  | @item | 
|  | @uref{https://www.akkadia.org/drepper/symbol-versioning, ELF Symbol | 
|  | Versioning - Ulrich Depper} | 
|  |  | 
|  | @item | 
|  | @uref{https://www.akkadia.org/drepper/dsohowto.pdf, How to Write Shared | 
|  | Libraries - Ulrich Drepper (see Chapter 3)} | 
|  |  | 
|  | @end itemize | 
|  |  | 
|  | If one adds a new symbol to a library that should be exported, the new | 
|  | symbol should be mentioned in the map file and a new version node | 
|  | defined, e.g., if one adds a new symbols @code{foo} and @code{bar} to | 
|  | libgfortran for the next GCC release, the following should be added to | 
|  | the map file: | 
|  | @smallexample | 
|  | GFORTRAN_1.1 @{ | 
|  | global: | 
|  | foo; | 
|  | bar; | 
|  | @} GFORTRAN_1.0; | 
|  | @end smallexample | 
|  | @noindent | 
|  | where @code{GFORTRAN_1.0} is the version node of the current release, | 
|  | and @code{GFORTRAN_1.1} is the version node of the next release where | 
|  | foo and bar are made available. | 
|  |  | 
|  | If one wants to change an existing interface, it is possible by using | 
|  | some asm trickery (from the @command{ld} manual referenced above): | 
|  |  | 
|  | @smallexample | 
|  | __asm__(".symver original_foo,foo@@"); | 
|  | __asm__(".symver old_foo,foo@@VERS_1.1"); | 
|  | __asm__(".symver old_foo1,foo@@VERS_1.2"); | 
|  | __asm__(".symver new_foo,foo@@VERS_2.0"); | 
|  | @end smallexample | 
|  |  | 
|  | In this example, @code{foo@@} represents the symbol @code{foo} bound to | 
|  | the unspecified base version of the symbol. The source file that | 
|  | contains this example would define 4 C functions: @code{original_foo}, | 
|  | @code{old_foo}, @code{old_foo1}, and @code{new_foo}. | 
|  |  | 
|  | In this case the map file must contain @code{foo} in @code{VERS_1.1} | 
|  | and @code{VERS_1.2} as well as in @code{VERS_2.0}. | 
|  |  | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c GNU Free Documentation License | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @include fdl.texi | 
|  |  | 
|  |  | 
|  | @c --------------------------------------------------------------------- | 
|  | @c Index | 
|  | @c --------------------------------------------------------------------- | 
|  |  | 
|  | @node Index | 
|  | @unnumbered Index | 
|  |  | 
|  | @printindex cp | 
|  |  | 
|  | @bye |