| \input texinfo @c -*-texinfo-*- |
| @c %**start of header |
| @setfilename gfc-internals.info |
| @set copyrights-gfortran 2007-2022 |
| |
| @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 |