Document downloaded from:
em2 - EPC Modula-2 Compiler (Version 2.0.6)
em2 [ options ] .. files ..
em2 is a compiler for EPC Modula-2 implemented by Edinburgh
Portable Compilers Ltd. The language accepted by em2 is
based on the descriptions in editions 3 and 4 of the text-
book "Programming in Modula-2" by Professor Niklaus Wirth.
However, a control option -sun allows the compiler to accept
the dialect of Modula-2 available on Sun Workstations. The
only significant difference between this and the default
dialect selected by the option -epc is that under -sun the
types REAL and LONGREAL are compatible, whilst under -epc
they are not.
Both dialects contain a common set of extensions which pro-
vide a larger set of standard data types, logical bit opera-
tors, and support for mixed language programming. These
extensions are described in the EPC Modula-2 User's Refer-
ence Manual. Each dialect has an associated suite of
Modula-2 library modules. By default the -sun switch will
select the Sun library libSM2.a, whilst the -epc switch will
select the EPC library libEM2.a. The default choice may be
overridden and it is possible to use the Sun library with
the language dialect selected by -epc. See the ENVIRONMENT
em2 is the name of a driver program that controls the
overall compilation process. em2 analyses the set of
options provided and then passes them together with the name
of a file argument, to the compiler. If multiple file argu-
ments are specified, em2 invokes the compiler on each file
in turn. The nature of each input file is deduced from the
filename suffix. The suffixes recognized by em2 are
.mod Modula-2 source file
.def Modula-2 source file
.o Object file
If the suffix is .mod or .def, the file must contain the
source text of a single compilation unit. In the case of
.mod, the unit must be a program module or an implementation
module. In the case of .def, the unit must be a definition
A file with a .o suffix, or with an unrecognized suffix, or
with no suffix at all, is passed straight to the linking
phase - no attempt is made to compile its contents.
In this implementation of Modula-2, it is possible, but not
necessary to submit .def files to the compiler. When the
compiler processes a .mod file containing an implementation
module, it automatically deduces the name of the .def file
containing the corresponding definition module from the
module identifier or from additional information supplied
via compilation options. The compiler then processes the
definition module before proceeding to compile the implemen-
tation module. When the compiler processes a definition
module, only syntax and semantic checks are performed. No
code or intermediate symbol file is produced. There are
three implications resulting from this approach:
(1) The compiler handles compilation ordering problems
automatically. An implementation module is always
compiled after the definition modules upon which it
(2) By default, the definition part of a module with
identifier M must be held in a source file M.def. A
compilation option is provided to override this map-
ping if required.
(3) When the compiler processes the module heading
IMPLEMENTATION MODULE M
or an import statement of the form
FROM M IMPORT ..idents ..
the compiler searches for the definition part of M
in a file called M.def. The search is conducted
along a search path consisting of one or more direc-
tories and archive libraries. By default, the
current directory is searched first.
For each directory on the search path, the compiler
attempts to locate M either in a file called M.def
in the directory or in a member file M.def of an
archive library in the directory. However, the only
archive libraries considered are those nominated by
the -i option.
For each library on the search path, the compiler
attempts to locate M within a member file M.def of
When the compiler processes a .mod file, it checks for syn-
tax and semantic errors errors and generates object code in
an equivalent object file. The name of the object file is
derived by replacing the .mod suffix of the source file name
with a .o suffix
It is normal for compiler options to precede file arguments
on the command line. However, it is possible to locate -E,
-I, -M, -Qoption, -Qinstall, -Qpath, -e, -i, -o, -f and -m
after file arguments. In some cases this may be necessary to
ensure order dependent information is propagated to the
Files with the suffixes .def and .mod may be mixed on the
command line. If this is the case, the driver will call the
compiler for each of the .mod files first and then for each
of the .def files. The linker will not be called.
em2 supports the use of module libraries which are organised
as UNIX archive files containing definition modules and the
compiled object code. When a definition module is located as
a member of an archive file, the driver automatically passes
the name of the archive to the linker to ensure the
corresponding object code is linked at link time.
Detailed control of the compiler is provided by means of
control options that are submitted in the conventional UNIX
style. These options are summarised in the following para-
-Ak On some implementations, some local data structures
are stored on an auxiliary stack. Set the size of
this stack to k Kbytes. The default size is 128
Kbytes. Ignored on implementations which do not use
an auxiliary stack.
-a This option generates a .d file for use with the
test coverage utility tcov. The .d file accummu-
lates execution data for the corresponding .mod
file. See the Unix documentation tcov(1) for further
information. This option is only available on SunOS
and Solaris versions of UNIX.
Page align and pad the FORTRAN COMMON symbol _block.
This option is passed straight to the linker ld.
-Cstr Generate additional code to check for runtime
errors. str is a sequence of one or more digits in
the range 0 to 1 which control the class of errors
to be detected. In particular
-C0 enables the detection of range errors.
-C1 enables the detection of undefined value
Multiple classes of detections may be achieved by
including more than one digit in the string. Thus
-C01 enables both range and undefined value error
detection. The abbreviated form -C is equivalent to
-C01 and enables full error detection. When the -epc
option is used, most error checks are omitted. How-
ever some of the runtime libraries make checks
unconditionally for a small number of errors that
are potentially catastrophic. The EPC Modula-2
User's Reference Manual provides precise details of
the error checking capabilities of this implementa-
-c Suppress the linking phase of compilation. The
object program will be left in an equivalent .o
file. This option should be used when program
modules are to be compiled separately and then
linked at a later stage.
-Dn Control the level of post mortem diagnostic informa-
tion that is provided following the detection of a
runtime error. n is a single digit number in the
range 0 to 4. In particular
-D0 suppresses the production of all post mortem
diagnostics. When used with -g (see below)
it prevents the runtime system from setting
up signal handlers. The main reason for
this is to allow the generation of a core
file when an exception occurs. A side effect
of this is to prevent the runtime system
from setting up its own signal handlers
which might possibly interfere with signal
handlers set up by the programmer.
-D1 limits diagnostic information to a minimal
execution trace back giving the set of
active blocks at the time the error
-D2 enables the production of a full execution
trace back including source line numbers for
the statement causing the error and the
points of call for each of the active
-D3 supplements the trace back with a partial
dump of scalar variables.
-D4 supplements the trace back with a full vari-
able dump which includes a treatment of
The default setting for n is 1. The abbreviated form
-D is equivalent to -D4.
Perform a syntax and semantic check on the defini-
tion module specified by "filename".
Search for and perform a syntax and semantic check
on the definition module specified by "modulename".
-dryrun Cause the driver to do a 'dry run', ie. it will pro-
cess its arguments but will not call the compiler or
any other underlying utility. This is useful with -v
allowing the user to see what commands would be exe-
cuted by the driver.
-E root Ignored.
-e root Ignored.
-epc Select the EPC Modula-2 dialect and library suite.
-F Cause the compiler to fully evaluate BOOLEAN expres-
sions. By default, if an operand of AND evaluates to
FALSE, or an operand of OR evaluates to TRUE, the
remaining operands are ignored.
-f Specify a file of -m style options. Each line in the
file must have one of the forms
Leading blanks and lines whose first non-blank char-
acter is hash (#) are ignored.
-f1167 Generate code for the Weitek 1167 floating point
accelerator. Files compiled with this option should
not be linked with files compiled with the -f387
option. Ignored on systems not based on Intel
-f68881 Generate code for the Motorola M68881 coprocessor.
Ignored on systems not based on Motorola processors.
-fast Reserved for future use.
-ffpa Generate code for the Sun Floating Point Accelera-
tor. Ignored on systems not based on this hardware.
Generate code for the Sun FPA+ Accelerator. Ignored
on systems not based on this hardware.
-fpa A synonym for the -f1167 option. Ignored on systems
not based on Intel 80386/80486 processors.
-f387 Generate code for the Intel 80387 floating point
processor. This option is selected by default by the
compiler. Ignored on systems not based on Intel
-G Produce a numbered compilation listing of all lines
in the source files supplied as arguments. If the
source file holds an implementation module, the
corresponding definition module will be listed as
-g On some platforms this option generates additional
information for use with an interactive debugger.
On SunOS platforms information is generated for dbx.
See supporting Unix documentation for additional
information on dbx.
On Solaris 2.x, SPARC SVR4 and Intel SVR4 systems,
information is generated for the EPC interactive
debugger, edb. See edb documentation for more
On other platforms the option is ignored.
Where this option is enabled, it also affects the
behaviour of programs produced by the compiler. It
ensures that a SIGTRAP signal is generated should a
runtime check or library error occur. This in turn
generates a diagnostic traceback as would any other
signal. If however diagnostics have been disabled
(see -D above) then the runtime system sets up no
signal handlers of its own. Unless the programmer
has requested non-default signal behaviour then this
usually means that a core file is generated when a
signal occurs. The generation of a core file allows
a debugger to perform a postmortem on a program and
the generation of a signal when an exception occurs
allows a debugger to interactively trap exceptions.
-Ifile Takes file to be a full pathname. If file does not
exist it is ignored. If file is a directory, it is
added to the search path for definition modules and
the option -Lfile is passed to the linker. Otherwise
file is assumed to be an archive library which is
added to the search path and file is passed to the
On systems running AIX some extra processing is per-
formed. If file ends with .a then a test is made for
the existence of file_x.a otherwise a test is made
for the existence of file_x. If the file exists, a
corresponding -I argument is also passed to the com-
piler. See the -i option for an explanantion.
-iX Specify that archive libX.a is to be added to the
library set. The compiler will search in any file
libX.a occurring in directories on the search path.
The option -lX is passed to the linker.
On systems running AIX the archive libX_x.a is also
added to the library set. No equivalent -lX_x is
passed to the linker however.
The reason for this extra _x processing for -i and
-I is because of the AIX linker. On other UNIX sys-
tems it is possible to mix .def files and their
corresponding .o files in the same archive. The AIX
linker will not accept such files. em2 therefore
adopts the convention that .def files are put into
archives distinguished by _x. For example, the Sun
compatibility library provided with the compiler
comes in two parts: libSM2.a for .o files and
libSM2_x.a for .def files. User libraries can be
-j Specify that fields of a record are not to be
aligned for efficient access but should be jammed
together with no padding bytes. Ignored on systems
not based on Intel 80x86 processors.
-k Reserved for future use.
-Ldir Add dir to the list of directories searched while
processing the -l option. This option is passed
straight to the linker.
-list This option is an alternative for -G.
-lx Similar to -i However, the option is just passed to
the linker. If the library contains definition
modules, then -i must be used.
-Mdir An alternative to -Idir.
-m Override the default association of a module iden-
tifier M with a corresponding file M.def. When the
is used, an import statement
FROM OldName IMPORT .. idents ..
causes the compiler to search for a definition
module in the file NewName.def. When the form
is used, an import statement
FROM Module IMPORT .. idents ..
causes the compiler to read the definition module
from the file FileName. In either form a space may
be inserted between the m and the module identifier.
-n An alternative for -dryrun.
This option is used to disable range checking for
array indices and case selectors. The same effect
may be obtained by the compiler directive T-. This
option should only be used in conjunction with -sun.
This option is used to disable range checking for
assignments to subrange types. The same effect may
be obtained by the compiler directive R-. This
option should only be used in conjunction with -sun.
-On Optimize for code for execution speed. n is a single
digit expressing the level of optimization.
Currently, the only value permitted is zero which
enables instruction scheduling on SPARC and Motorola
M88K platforms. The form -O may be used to switch on
all available optimisations. This option is only
available on SunOS and Solaris versions of UNIX.
-o file Place the run file generated by the linker in the
named file rather than a.out. The file will be
created with the appropriate access permissions if
it does not already exist. When used in conjunction
with -c the object code will be generated in file.o
-P Reserved for use by EPC.
-p Generates additional information for use with the
profiling program prof. See the Unix documentation
prof(1) for further information. This option is
only available on SunOS, Solaris and SPARC SVR4 ver-
sions of UNIX.
-pg Generates additional information for use with the
profiling program gprof. See the Unix documentation
gprof(1) for further information. This option is
only available on SunOS versions of UNIX.
-pic Produce position independent code. Each reference to
a global datum is generated as a dereference of a
pointer to a global offset table. Each function call
is generated in pc-relative addressing mode through
a procedure linkage table. The size of the global
offset table is limited to 8K for SPARC processors.
This option is only available on SunOS, Solaris and
SPARC SVR4 versions of UNIX.
-PIC Produce position independent code, but allow the
global offset table to span the range of 32-bit
addresses. This option should be used in preference
to pic when there are too many global data objects
for the smaller 8K table to accommodate. This
option is only available on SunOS, Solaris and SPARC
SVR4 versions of UNIX.
-Qoption program option
Pass option to program. The option must be appropri-
ate to program. program may be either em2compiler or
Insert directory into the search path used by the
compiler to locate source files. This path is also
use to locate files such as the startups *crt*.o
that are linked to the compiled program.
-S Generate a pseudo assembler listing to the standard
output file. Ignored on some systems.
-sun Select the Sun Modula-2 dialect and library suite.
This option also has the effect of turning on all
possible range checks. These checks may be
suppressed by using the -norange and -nobounds
-T Reserved for future use.
-t Cause the compiler to output the name of the file
containing each imported module definition.
Set the directory for temporary file creation to
dir. The default is /tmp.
-U Update object files for make(1). For each .mod file
on the command line, the compiler will attempt to
remove the object file if it is older than the
source file or any of its imports. Implies -w, -y,
-c and disables any -G or -t options. Any .def files
given will be ignored. The EPC Modula-2 User's
Reference Manual gives examples of how to use this
option in make(1) scripts.
-v Cause the compiler driver to enter verbose mode and
print the commands and arguments which it issues.
-w Allows the compiler to suppress warnings regarding
unused variables or redundant or potentially
insecure language constructs.
-y Suppress the generation of object code and run the
compiler as a syntax and semantic checker.
Control over the choice of dialect or libraries may also be
exercised through the use of environment variables.
Currently, EPC Modula-2 supports three variables called
EM2_DEFAULTS, EM2_OPTIONS and EM2_FPAOPTIONS.
The language dialect accepted by the compiler is decided on
the basis of the options -sun and -epc, the contents of the
environment variable EM2_DEFAULTS and the host computer sys-
If -sun or -epc is specified on the command line then the
corresponding dialect and library are selected. If neither
option is specified, the driver will consult the environment
variable EM2_DEFAULTS. If this is set to "-sun" or "-epc"
then the appropriate dialect and library is selected. If the
environment variable is not found or not set, then then the
choice depends upon the host system. For platforms running
the SunOS or Solaris version of UNIX, the default choice is
-sun. For all other platforms, the default choice is -epc.
By default, the compiler driver em2 will append an implemen-
tation dependent set of additional options to the command
line. This set may be overridden by setting the environment
variable EM2_OPTIONS to an alternative set. EM2_OPTIONS is
interpreted by em2 as though its value had been placed on
the command line as in
em2 [ options ] .. files .. $EM2_OPTIONS
The default setting for EM2_OPTIONS is usually
"-I. -I/usr/local/lib -I/usr/lib -I/lib -i?M2 -iCEM2
However on SunOS and other platforms there is also a
-ltermcap option required
"-I. -I/usr/local/lib -I/usr/lib -I/lib -i?M2 -iCEM2
-ltermcap -lm -lc"
When the Sun dialect is specified, the ? in -i?M2 is
replaced by S with the effect that the Sun library suite is
selected. When the EPC dialect is specified, ? is replaced
with E with the effect that the EPC library is selected.
It is possible to select the Sun dialect but use the EPC
libraries instead. This may be done with a command line of
em2 -sun p.mod -iEM2
Similarily the Sun libraries may be selected in preference
em2 -epc p.mod -iSM2
Alternatively, the choice may be set permanently by setting
EM2_OPTIONS appropriately. For example the EPC libraries are
"-I. -I/usr/local/lib -I/usr/lib -I/lib -iEM2 -iCEM2 -lc
On Intel 80x86 based systems where -fpa or -f1167 has been
selected then EM2_FPAOPTIONS is used in place of
EM2_OPTIONS. Its default setting is of the form
"-I. -I/usr/local/lib -I/usr/lib -I/lib -i?M21167 -iCEM21167
NOTE: Environment variable names beginning with the charac-
ters `EM2_' are reserved for possible future enhancements.
file.def definition module
file.mod implementation module
file.o object file
file.a module library
a.out executable run file
em2 compiler driver
em2compiler compiler binary
em2list compilation listing utility
em2make Modula-2 make utility
em2errors error messages
libEM2.a EPC Modula-2 library
libSM2.a Sun Modula-2 library
libCEM2.a Runtime support library
em2 Make(1) A Modula-2 Program Make Utility
EPC Modula-2 User's Reference Manual, Edinburgh Portable
Compilers Limited, 1991.
The diagnostics produced by em2 are intended to be self
Last Change: EPCL