HP 3000 Manuals

Compiling, Linking, and Running Your Program [ HP Pascal/iX Programmer's Guide ] MPE/iX 5.0 Documentation


HP Pascal/iX Programmer's Guide

Compiling, Linking, and Running Your Program 

To make your HP Pascal program a valid HP-UX process, you must compile,
link (and load), and run it.

The HP-UX command pc coordinates the HP Pascal compiler
(/usr/lib/pascomp) and the HP-UX linker loader (/bin/ld).

The name of the file containing your source program must end with .p (for
example, prog.p).  The extension .p causes the pc command to call the HP
Pascal compiler, which compiles your program and stores the resultant
code in an object file.  The name of the object file ends in .o (if the
source file name is prog.p, the object file name is prog.o).  If prog.p
is the only file parameter of a particular pc command, and it compiles
and links successfully, then the object file is not saved.

If the compiler does not find errors in the program, the pc command calls
the linker, ld, which links the object file with required library files
into a program file.  The name of the program file is a.out (unless you
specify another name in the pc command) and it resides in the directory
from which pc was invoked.  The program file is ready to run.

Figure B-1  shows how a file named prog.p becomes a running program on
HP-UX.

	       Click here to view figure.
          Figure B-1.  How a File Becomes a Running Program on HP-UX 

This section explains:

   *   The HP-UX pc command.

   *   How to pass run-time parameters to your program.

   *   How HP-UX handles interrupts.

   *   How HP-UX handles run-time errors.

pc Command 

The HP-UX command pc coordinates the HP Pascal compiler
(/usr/lib/pascomp) and the HP-UX linker loader (/bin/ld).

Additionally, the compiler looks for a system-wide file called
/usr/lib/pasopts.  If the file exists and is not empty, the compiler
opens and reads the file.  The file should contain only directives and
comments.  If there is anything else in the file, the compiler emits an
error message.  If the file is empty, which is the default, the compiler
does not attempt to open it.  For more information on the system-wide
file, refer to the section on compiler options in the HP Pascal/HP-UX 
Reference Manual.

Syntax 
[REV BEG]

pc [file  ] [...]
   [option]
[REV END]

Parameters 

file    At least one file is required.

option  Any of the following instructions to the compiler:

        -A               Produce warnings when non-ANSI Pascal features
                         are found (same as ANSI ON).

        +a               Cause the compiler to generate archived object
                         (.a) files instead of simple object (.o) files.
                         This option exists for compatibility with the
                         Series 300 pc command.

        -C               Suppress code generation.  No object (.o) files
                         will be created and linking will be
                         suppressed.  This is effectively a request for
                         syntax/semantics checking only (same as CODE
                         OFF).

        +C               Convert MPE/iX format file names in the compiler
                         options BUILDINT, INCLUDE, LISTINTR, SPLINTR,
                         and SYSINTR to HP-UX-format file names.  Fully
                         qualified HP-UX-format file names (those that
                         begin with slash, like /mnt/srf/file) are not
                         converted.  This option is the same as the
                         compiler option CONVERT_MPE_NAMES

                         This option assumes an HP-UX directory structure
                         that is modeled after the MPE/iX accounting
                         structure, in which all files reside in
                         group-level directories and groups are
                         subdirectories of accounts.  This option
                         converts MPE/iX format file names to lower case
                         letters.

                         For example, assume the HP-UX directory
                         structure account/group, where group is a
                         directory containing the file f.  If a Pascal
                         source program contains the statement

                              $INCLUDE 'F.Group.Account'$

                         then the compiler appends the appropriate path
                         information to f and searches for the resulting
                         name (for example, root/account/group/f, where
                         root is the parent of the account-level
                         directories).

        -c               Suppress linking and only produce object (.o)
                         files from source files.

        -Dname=bool,     Defines name is as if it has been set (with
        -Dname           $SET) to the nth line on the source file.  bool 
                         can be either TRUE or FALSE; if bool in not
                         specified, name is set to TRUE. name and bool 
                         can be uppercase or lowercase.  The order in
                         which the compiler encounters $SETs (regardless
                         of relative order on the command line) is:

                            1.  -Dname=bool 

                            2.  +Q dfile 

                            3.  source file

                         The compiler overrides -Dname=bool with any
                         subsequent duplicate use of $SET, always taking
                         the last one and issuing a warning.

        +DAmodel         Generates object code for a specific version of
                         the PA-RISC architecture.  model can be a model
                         number such as 750 or 870, or one of the
                         following architecture specifications:

                         1.0     Generates object code suitable for all
                                 implementations of PA-RISC 1.0 or
                                 higher.  This is the default for all
                                 Series 800 models.

                         1.1     Generates object code suitable for all
                                 implementations of PA-RISC 1.1.  This is
                                 the default for all Series 700 models.

                                 Note that object code generated for
                                 PA-RISC 1.1 will not execute on PA-RISC
                                 1.0 implementations.

                         +DAmodel also specifies the appropriate library
                         search path for HP-UX math libraries.  If your
                         program calls any of the standard Pascal
                         Arithmetic functions, using +DA1.0 links the
                         PA-RISC 1.0 version of the math library and
                         using +DA1.1 links the PA-RISC 1.1 version of
                         the library.  The PA-RISC 1.1 libraries have
                         performance enhancements and new routines that
                         the PA-RISC 1.0 libraries lack.  See the HP-UX 
                         Floating-Point Guide for more information about
                         using math libraries.

        +DSmodel         Perform instruction scheduling appropriate for a
                         specific implementation of the PA-RISC
                         architecture.  model can be a model number such
                         as 750 or 870, or one of the following
                         architecture specifications:

                         1.0     Perform scheduling tuned to a model
                                 representative of PA-RISC 1.0
                                 implementations.

                         1.1     Perform scheduling tuned to a model
                                 representative of PA-RISC 1.1
                                 implementations.

                         The default scheduling is based on the model
                         number returned by uname(2).

                         This option affects only performance of the
                         object code by scheduling the code based on the
                         specific latencies of the target implementation.
                         The resulting code executes correctly on other
                         PA-RISC implementation, subject to the +DA
                         option.

        +FPflag          Specify how the run time environment for
                         floating-point operations should be initialized
                         at program start up.  flag is a series of
                         upper or lower case letters from the set
                         [VvZzOoUuIiDd] with no embedded white-space.  If
                         the upper-case letter is selected, that behavior
                         is enabled.  If the lower-case letter is
                         selected or if the letter is not present in
                         flag, the behavior is disabled.  The default is
                         that all behaviors are disabled.  The list below
                         describes the behaviors:

                         V       Trap on invalid floating-point
                                 operations.

                         Z       Trap on divide by zero.

                         O       Trap on floating-point overflow.

                         U       Trap on floating-point underflow.

                         I       Trap on floating-point operations that
                                 produce inexact results.

                         D       Enable sudden underflow (flush to zero)
                                 of denormalized values.

                                 Enabling underflow is possible only on
                                 implementations of PA-RISC 1.1 or
                                 higher; it is not possible on PA-RISC
                                 1.0.

                         To dynamically change these settings at run
                         time, refer to fpgetround(3M).

        -G               Prepare object files for profiling with the
                         gprof utility (see "GPROF" in the HP 
                         Pascal/HP-UX Reference Manual).

        -g               Generate additional information for the symbolic
                         debugger, and ensure that the program is linked
                         as required for the symbolic debugger.

        -Idir            Add dir to the list of directories that search
                         for $INCLUDE files whose names do not begin with
                         /.  The search is performed in the following
                         order:

                            1.  The directory containing the source file.

                            2.  Directories specified with the -I option.

                            3.  The current working directory.

                            4.  The standard directory /usr/include.

        -L               Write a program listing to stdout.

        -lx              Cause the linker to search the libx.sl or libx.a
                         libraries in an attempt to resolve currently
                         unresolved external references.  Because a
                         library is searched when its name is
                         encountered, placement of a -l is significant.
                         If a file contains an unresolved external
                         reference, the library containing the definition
                         must be placed after the file on the command
                         line.  See ld(1) for more information.

        -N               Cause the output file from the linker to be
                         marked as unshareable (see -n).

        -n               Cause the output file from the linker to be
                         marked as shareable (see -N).

        -O               Turn on optimization.  The compiler performs
                         level 2 optimization.  See +Oopt.

        +Oarg            Perform optimizations selected by arg.  There
                         are two kinds of arguments to the +O
                         optimization option.  Those in the first group
                         can have arg defined as:

                         1       Perform level 1 optimizations.  These
                                 include branch optimizations, dead code
                                 elimination, instruction scheduling, and
                                 peephole optimization.

                         2       Perform level 2 optimizations.  These
                                 include common subexpression
                                 elimination, constant folding, loop
                                 invariant code motion, coloring register
                                 allocation, and store-copy optimization.
                                 Level 2 optimizations are a superset of
                                 level 1 optimizations.  The -O option is
                                 equivalent to the +O2 option.

                         3       Perform level 3 optimizations.  These
                                 include, but are not limited to,
                                 interprocedural global optimizations.
                                 Level 3 optimizations are a superset of
                                 level 2 optimizations.

                         Those in the second group can have arg defines
                         as:

                         s       Suppress optimizations which tend to
                                 increase the generated code size.
                                 Currently, these optimizations include
                                 software pipelining and loop unrolling.

                         bbnum   Specify the maximum number of basic
                                 blocks allowed in a procedure that is to
                                 be optimized at level 2.  If a procedure
                                 contains more than num basic blocks,
                                 level 1 optimization is performed for
                                 that procedure.  The default value for
                                 num is 500 (same as $OPTIMIZE
                                 'BASIC_BLOCKSnum'$).

                         The arguments in the second group implicitly
                         request level 2 optimizations, but an argument
                         from the first group overrides the implicit
                         level 2 regardless of their relative positions
                         on the command line.

        -o outfile       Name the output file from the linker outfile 
                         instead of a.out.

        -P lines         Allow lines lines per page of compiler listing,
                         including header or trailer (same as the LINES
                         compiler option).

        -p               Prepare object files for profiling with the prof 
                         utility.

        -Q               Cause the output file from the linker to be
                         marked as not demand loadable (see -q).

        -q               Cause the output file from the linker to be
                         marked as demand loadable (see -Q).

        +Q dfile         Cause dfile to be read before compilation of
                         each source file.  The file dfile can only
                         contain compiler options.

        +R               Turns off range checking (same as the compiler
                         option RANGE OFF).

        -S               Output an assembly file.  This file is named
                         filename.s, where filename is the base name of
                         the source file.

        -s               Cause the output of the linker to be stripped of
                         symbol table information.  See strip(1) in
                         linker documentation.  This option is
                         incompatible with symbolic debugging.

        -t x,name        Substitute or insert subprocess x with
                         name where x is one or more of an
                         implementation-defined set of identifiers
                         indicating the subprocesses.  This option works
                         in the following modes:

                            *   If x is a single identifier, name 
                                represents the full path name of the new
                                subprocess.

                            *   If x is a set of identifiers, name 
                                represents a prefix to which the standard
                                suffixes are concatenated to construct
                                the full pathname of the new
                                subprocesses.

                         The values x can assume are:

                         c    Compiler body (standard suffix is pascomp).

                         0    Same as c.

                         l    Linker (standard suffix is ld).

        -v               Enable verbose mode, producing a step-by-step
                         description of the compilation process on
                         stderr.

        -w               Turn off warning messages (same as the compiler
                         option WARN OFF).

        -Wc,arg1         Cause arg1 through argn to be handed off to
        [,arg2,...       subprocess c.  The arg parameters are of the
        argn]            form:

                              -argoption[,argvalue]

                         where argoption is the name of an option
                         recognized by subprocess c and argvalue is a
                         parameter for argoption (if it has one).  The
                         parameter c can have these values:

                         Value     Meaning 

                         c         Compiler body (standard suffix is
                                   pascomp).
                         0         Same as c.
                         d         Driver program.
                         l         Linker (standard suffix is ld).

                         For example, the specification to pass the -r 
                         option (preserve rotation information) to the
                         linker is -Wl,-r.

        -Y               Enable 16-bit Native Language Support when
                         parsing string literals and comments (same as
                         the compiler option NLS_SOURCE). Note that 8-bit
                         parsing is always supported.

                         Other options--instructions to the linker--are
                         also allowed.  See pc(1) in the HP-UX Reference 
                         for details.

        -y               Generate additional information needed by static
                         analysis tools and ensure that the program is
                         linked as required for static analysis.  This
                         option is incompatible with optimization.

        +z, +Z           Both of these options cause the compiler to
                         generate position independent code (PIC) for use
                         in building shared libraries.  However, you must
                         use +z to generate PIC, unless certain limits
                         are exceeded.  Use +Z when limits are exceeded.
                         If both +z and +Z are specified, only the last
                         one encountered will apply.  Note that +z is the
                         same as $SHLIB_CODE ON$ and +Z is the same as
                         $SHLIB_CODE 2$.

                         The options -G and -p are ignored if you use
                         either +Z or +z.

                         For more information about PIC , refer to
                         Programming on HP-UX.

file    The name of a textfile that contains source code for an HP Pascal
        program, or the name of an object file.  The textfile name ends
        with .p; the object file name ends with .o.

        For each textfile, the pc command calls the HP Pascal compiler,
        which tries to compile it.  If the compiler compiles the textfile 
        named prog1.p without errors, it produces an object file named
        prog1.o (which resides in the current directory).

        If each textfile compiles successfully, the pc command calls the
        HP-UX Linker Loader, ld, which links all of the object files (pc 
        command parameters and those resulting from compiles) into the
        final program file.

        If prog.p is the only file parameter of a particular pc command,
        and it compiles and links successfully, then its object file,
        prog.o, is not saved.

Example 

The command:

     pc main.p ext1.p ext2.p

compiles the object files main.o, ext1.o, and ext2.o, into the final
program file a.out.  It is equivalent to the command sequence:

     pc -c main.p
     pc -c ext1.p
     pc -c ext2.p
     pc main.o ext1.o ext2.o


NOTE The HP Pascal compiler ignores the following Series 300 pc command options without warning: +X +x +M +b +bfpa +f +ffpa
Run-Time Parameters You can pass run-time parameters to your program as HP-UX command-line arguments when starting your program. No arguments are automatically bound to program parameters. Even the three pre-opened (standard) files, stdin, stdout, and stderr are only bound to the HP Pascal textfiles input, output, and stderr if the program heading declares the textfiles. Other run-time parameters must be obtained from the command line arguments by importing the predefined module arg and using the routines that it exports, which are: Function Return Value argc The total number of program arguments. (This integer is greater than or equal to one, because every HP-UX program has at least one program parameter, the program name.) argn An HP Pascal string that contains the nth program argument, where n is an argument to argn and must be in the range 0..argc - 1. If n is outside this range, the run-time library generates a range error. The call argn(0) returns the program name. argv A pointer to a null-terminated array of pointers, each of which points to a null-terminated PAC that contains an argument (see the export section of the arg module, on the next page). The module arg belongs to the default module library /usr/lib/paslib; therefore, your program can import it without specifying a library with the SEARCH compiler option. The export section for the module arg is: MODULE arg; EXPORT TYPE arg_string1024 = string[1024]; arg_type = PACKED ARRAY[1..32000] OF char; argarray = ARRAY[0..32000] OF ^argtype; argarrayptr = ^argarray; FUNCTION argv : argarrayptr; FUNCTION argc : integer; FUNCTION argn (n : integer) : arg_string1024; IMPLEMENT . . . . END. Example $STANDARD_LEVEL 'HP_MODCAL'$ PROGRAM arg_demo (input, output); VAR f : text; line : string[255]; fname : string[80]; IMPORT arg; BEGIN IF argc > 1 THEN BEGIN {If a program argument was passed ...} fname := argn(1); {assign it to fname ...} reset(f,fname); {reset the file fname ...} WHILE NOT eof(f) DO BEGIN {and list its contents.} readln(f,line); writeln(line); END; END; {IF} END. {arg_demo} Associating Program Header Files with Run-Time Parameters On HP-UX, files defined in the program header are implicitly associated with run-time parameters. For example, if the program header is: PROGRAM myprog (input, output, file1, file2); then when the program myprog is run with command-line arguments, file1 is bound to the first argument, and file2 is bound to the second. The predefined files input, output, and stderr are not subject to this implicit association. Other command-line arguments that are not subject to this implicit association are those that begin with plus (+) and minus (-). For example, if the compiled program produced from the above example is run with the command: a.out -opt1 arg1 +opt2 arg2 arg3 then file1 is bound to arg1 and file2 is bound to arg2. Therefore, if the program executes the statement: reset (file1); it is equivalent to the statement: reset (file1, 'arg1'); If there is no run-time argument for a program header file, then the upshifted formal name of the file is implicitly associated with it. For example, if the program above is run with the command: a.out arg1 then there is no run-time argument for file2, so it is associated with the file named FILE2. Of course, if you provide an explicit association, it overrides this implicit association. Also, if the file is already open before the statement executes, the usual rules apply (that is, the previous association is maintained). Interrupt Handling Your program can trap HP-UX interrupts (SIGINT and SIGQUIT, for example). The recommended way to trap these signals is to make explicit calls to the HP-UX system routine signal.
NOTE The HP9000 series 200 run-time routine catch_signals is supported, but a call to this routine will severely affect the error-handling mechanisms described in Chapter 11 , because those depend on trapping certain HP-UX signals themselves (namely, SIGILL, SIGFPE, SIGBUS, SIGSEGV, and SIGSYS). Use of this routine is strongly discouraged.
Example PROGRAM prog; CONST BADSIG = -1; SIG_DFL = 0; SIG_IGN = 1; SIG_INT = 2; SIG_QUIT = 3; VAR Old_Action : integer; FUNCTION signal (SignalNum : integer; ProcAddress : integer) : integer; EXTERNAL; The function signal accepts a signal number, SignalNum, and a procedure address, ProcAddress. Whenever the signal with the number SignalNum is raised, the function transfers control to the procedure with the address ProcAddress. The function signal returns the old stored value of ProcAddress. PROCEDURE InterruptHandler (SignalNum : integer); EXTERNAL; BEGIN Old_Action := signal (SIGINT, Baddress (InterruptHandler)); IF Old_Action = SIG_IGN THEN Old_Action := signal (SIGINT, SIG_IGN) ELSE IF Old_Action = BADSIG THEN {An invalid SignalNum or ProcAddress was passed}; Old_Action := signal (SIGQUIT, Baddress (InterruptHandler)); IF Old_Action = SIG_IGN THEN Old_Action := signal (SIGQUIT, SIG_IGN) ELSE IF Old_Action = BADSIG THEN {An invalid SignalNum or ProcAddress was passed}; END. When either of the signals SIGINT or SIGQUIT is raised (by entering CONTROL C on the keyboard, for example), the procedure InterruptHandler is called.
NOTE In the preceding example, if InterruptHandler is to return to the main program, its first action must be to rearm the signal mechanism (in the manner described above) for the signal that was trapped. This is necessary because every time a signal is trapped, the HP-UX operating system resets its action information (the stored value of ProcAddress) to SIG_DFL (the default action). The program cannot resume normal execution and trap interrupts again unless it rearms the signal handler.
Run-Time Error Handling If HP-UX detects a run-time error, it aborts the program unless the program defines error recovery code. Error recovery code can catch run-time errors that originate from: * In-line compiled code (for example: range violation errors, nil pointer errors, math overflow errors). * Run-time support routines (for example: string, set, math). * Pascal file system (I/O errors). * HP-UX file system support (system errors). * Hardware (signals), except the kill signal. When compiling a program, the compiler generates code that will call the predefined procedure escape if HP-UX detects a run-time error in the compiled program. The procedure escape transfers control to the program's error recovery code (if the program has no error recovery code, the program aborts). For a complete explanation of error recovery code, see Chapter 11 . Run-time errors in in-line compiled code are unique in that they can be suppressed--that is, you can tell the compiler not to generate code to catch them (see the compiler option RANGE in the HP Pascal/HP-UX Reference Manual). Run-time errors from other sources cannot be suppressed. Most run-time errors that arise from interaction between in-line compiled code and run-time support routines are I/O errors. A few are system errors.


MPE/iX 5.0 Documentation