167 lines
5 KiB
Plaintext
167 lines
5 KiB
Plaintext
.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
|
|
.TS
|
|
l l.
|
|
LDE X+6 -- Load Double External
|
|
LAE X+20 -- Load Address External
|
|
.TE
|
|
.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
|