.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