Initial revision
This commit is contained in:
163
doc/ego/ic/ic5
Normal file
163
doc/ego/ic/ic5
Normal file
@@ -0,0 +1,163 @@
|
||||
.NH 2
|
||||
The Intermediate Code construction phase
|
||||
.PP
|
||||
The first phase of the global optimizer,
|
||||
called
|
||||
.UL IC,
|
||||
constructs a major part of the intermediate code.
|
||||
To be specific, it produces:
|
||||
.IP -
|
||||
the EM text
|
||||
.IP -
|
||||
the object table
|
||||
.IP -
|
||||
part of the procedure table
|
||||
.LP
|
||||
The calling, change and use attributes of a procedure
|
||||
and all its flags except the external and bodyseen flags
|
||||
are computed by the next phase (Control Flow phase).
|
||||
.PP
|
||||
As explained before,
|
||||
the intermediate code does not contain
|
||||
any names of variables or procedures.
|
||||
The normal identifiers are replaced by identifying
|
||||
numbers.
|
||||
Yet, the output of the global optimizer must
|
||||
contain normal identifiers, as this
|
||||
output is in Compact Assembly Language format.
|
||||
We certainly want all externally visible names
|
||||
to be the same in the input as in the output,
|
||||
because the optimized EM module may be a library unit,
|
||||
used by other modules.
|
||||
IC dumps the names of all procedures and data labels
|
||||
on two files:
|
||||
.IP -
|
||||
the procedure dump file, containing tuples (P_ID, procedure name)
|
||||
.IP -
|
||||
the data dump file, containing tuples (D_ID, data label name)
|
||||
.LP
|
||||
The names of instruction labels are not dumped,
|
||||
as they are not visible outside the procedure
|
||||
in which they are defined.
|
||||
.PP
|
||||
The input to IC consists of one or more files.
|
||||
Each file is either an EM module in Compact Assembly Language
|
||||
format, or a Unix archive file (library) containing such modules.
|
||||
IC only extracts those modules from a library that are
|
||||
needed somehow, just as a linker does.
|
||||
It is advisable to present as much code
|
||||
of the EM program as possible to the optimizer,
|
||||
although it is not required to present the whole program.
|
||||
If a procedure is called somewhere in the EM text,
|
||||
but its body (text) is not included in the input,
|
||||
its bodyseen flag in the procedure table will still
|
||||
be off.
|
||||
Whenever such a procedure is called,
|
||||
we assume the worst case for everything;
|
||||
it will change and use all variables it has access to,
|
||||
it will call every procedure etc.
|
||||
.sp
|
||||
Similarly, if a data label is used
|
||||
but not defined, the PSEUDO attribute in its data block
|
||||
will be set to UNKNOWN.
|
||||
.NH 3
|
||||
Implementation
|
||||
.PP
|
||||
Part of the code for the EM Peephole Optimizer
|
||||
.[
|
||||
staveren peephole toplass
|
||||
.]
|
||||
has been used for IC.
|
||||
Especially the routines that read and unravel
|
||||
Compact Assembly Language and the identifier
|
||||
lookup mechanism have been used.
|
||||
New code was added to recognize objects,
|
||||
build the object and procedure tables and to
|
||||
output the intermediate code.
|
||||
.PP
|
||||
IC uses singly linked linear lists for both the
|
||||
procedure and object table.
|
||||
Hence there are no limits on the size of such
|
||||
a table (except for the trivial fact that it must fit
|
||||
in main memory).
|
||||
Both tables are outputted after all EM code has
|
||||
been processed.
|
||||
IC reads the EM text of one entire procedure
|
||||
at a time,
|
||||
processes it and appends the modified code to
|
||||
the EM text file.
|
||||
EM code is represented internally as a doubly linked linear
|
||||
list of EM instructions.
|
||||
.PP
|
||||
Objects are recognized by looking at the operands
|
||||
of instructions that reference global data.
|
||||
If we come across the instructions:
|
||||
.DS
|
||||
LDE X+6 -- Load Double External
|
||||
LAE X+20 -- Load Address External
|
||||
.DE
|
||||
we conclude that the data block
|
||||
preceded by the data label X contains an object
|
||||
at offset 6 of size twice the word size,
|
||||
and an object at offset 20 of unknown size.
|
||||
.sp
|
||||
A data block entry of the object table is allocated
|
||||
at the first reference to a data label.
|
||||
If this reference is a defining occurrence
|
||||
or a INA pseudo instruction,
|
||||
the label is not externally visible
|
||||
.[~[
|
||||
keizer architecture
|
||||
.], section 11.1.4.3]
|
||||
In this case, the external flag of the data block
|
||||
is turned off.
|
||||
If the first reference is an applied occurrence
|
||||
or a EXA pseudo instruction, the flag is set.
|
||||
We record this information, because the
|
||||
optimizer may change the order of defining and
|
||||
applied occurrences.
|
||||
The INA and EXA pseudos are removed from the EM text.
|
||||
They may be regenerated by the last phase
|
||||
of the optimizer.
|
||||
.sp
|
||||
Similar rules hold for the procedure table
|
||||
and the INP and EXP pseudos.
|
||||
.NH 3
|
||||
Source files of IC
|
||||
.PP
|
||||
The source files of IC consist
|
||||
of the files ic.c, ic.h and several packages.
|
||||
.UL ic.h
|
||||
contains type definitions, macros and
|
||||
variable declarations that may be used by
|
||||
ic.c and by every package.
|
||||
.UL ic.c
|
||||
contains the definitions of these variables,
|
||||
the procedure
|
||||
.UL main
|
||||
and some high level I/O routines used by main.
|
||||
.sp
|
||||
Every package xxx consists of two files.
|
||||
ic_xxx.h contains type definitions,
|
||||
macros, variable declarations and
|
||||
procedure declarations that may be used by
|
||||
every .c file that includes this .h file.
|
||||
The file ic_xxx.c provides the
|
||||
definitions of these variables and
|
||||
the implementation of the declared procedures.
|
||||
IC uses the following packages:
|
||||
.IP lookup: 18
|
||||
procedures that loop up procedure, data label
|
||||
and instruction label names; procedures to dump
|
||||
the procedure and data label names.
|
||||
.IP lib:
|
||||
one procedure that gets the next useful input module;
|
||||
while scanning archives, it skips unnecessary modules.
|
||||
.IP aux:
|
||||
several auxiliary routines.
|
||||
.IP io:
|
||||
low-level I/O routines that unravel the Compact
|
||||
Assembly Language.
|
||||
.IP put:
|
||||
routines that output the intermediate code
|
||||
.LP
|
||||
Reference in New Issue
Block a user