123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- .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
|