Data-flow methods - <Step 1>¶
CallGraph.terminateTypesAndZones()
--> Unit.import*SymbolTables()
--> Unit.typeCheck()
--> Unit.allocate*Zones()
--> Unit.computeZoneInterfaces()
--> Unit.computeArrowZoneInterfaces()
Unit.importAllSymbolTables()
and
Unit.importInheritedClassesSymbolTables()
deal with USE
’d MODULE
’s
or with inherited classes. In this case, (a part of) the SymbolTable
of the used or inherited Unit
must be made available to the using
Unit
. This is done by copying (some of) its SymbolDecl
’s into a
special new SymbolTable
that is inserted into the SymbolTable
hierarchy, jut on top of the rootmost (i.e. in general public or
parameter) SymbolTable
of the using Unit
.
Unit.typeCheck()
can then be started, since all symbols used in a
Block
should now be visible in the SymbolTable
of this Block
or in
some enclosing SymbolTable
. Unit.typeCheck()
checks for type
consistency and emits warning and error messages. It also tries to do
type inference in case of errors. This type inference behavior may not
be such a good idea because it makes the implementation complex. This
also implies that Unit.typeCheck()
actually modifies the IR
.
Therefore it should not be called for only finding the type of an
expression. Use SymbolTable.typeOf()
instead.
When all types are clear and agreed upon, Tapenade studies the machine
memory layout that results from it. As a result, it defines a number of
so-called memory zones and assigns to each declared variable its set
of zones. This is done by Unit.allocateDeclaredZones()
and
Unit.allocateSideEffectZones()
See below for a detailled description
of these zones.
Missing: distinction between declared zones and side-effect zones
Finally Unit.computeZoneInterfaces()
and
Unit.computeArrowZoneInterfaces()
build the convenience arrays that
are useful in Data-Flow analysis to translate Data-Flow information
through subroutine calls. At any call site, the Data-Flow information
based on the variables of the caller function must be translated to be
based on the variables of the callee, and vice versa upon exit. This
uses correspondence tables:Unit.externalShape, Unit.translator, Unit.transferMatrix, CallArrow.translator
that are built by these two methods.