Iron Spring PL/I Compiler

Linux Version 0.9.10e
18 May 2022

Release Notes


This document provides information on using the Iron Spring PL/I compiler and compiled programs on the Linux platform. For information on the OS/2 platform, see the corresponding document

The current version still contains bugs. As a user of beta software, you can help improve the compiler. See the section Reporting bugs.

ArcaOS is a trademark of Arca Noae.
Gnu is a trademark of the Free Software Foundation.
IBM is a trademark of IBM, Inc.
Intel is a trademark of Intel Corporation.
Iron Spring is a trademark of Iron Spring Software.
Linux is a registered trademark of Linus Torvalds.
VAX is a trademark of Hewlett-Packard, Inc.
WATCOM is a trademark of Sybase, Inc. and its subsidiaries.
Library heap manager based on code Copyright (c) 2001-2006 Wolfram Gloger.


This license a legal agreement between you and Iron Spring Software. Your use of this software signifies that you agree to the terms of this license.

Iron Spring Software grants you the right to use and copy the Iron Spring PL/I compiler and library freely. You may distribute programs compiled using the compiler and/or linked with the library under any terms you wish without restriction. The source to the library is licensed under the terms of the Gnu Lesser General Public License (LGPL).

All material is copyright Iron Spring Software, 2014, 2015.



This distribution includes the executable for the PL/I compiler plic, the static library lib/static/libprf.a, and the sources for the library and sample programs.

    |                          |                    |
 plic                       (Sample sources and     +--------------------------static---include----source-----------alt
 (compiler executable)       %include files,                                   |         |         |                 | 
 (documentation, etc.)       sample makefiles                                  |         |         +--------asm      |
                             and module definition                             |         |   (PL/I source)   |     (alt storage   
                             file).                                            |         |               (assembler management)
                                                                               |  (%include files          source)
                                                                               |    required by                                                                                      
                                                                               |     library).
                                                                     libprf.a (static library)


The folowing software is required to run the Linux version of the compiler:
The following software is recommended:


Version 0.9.10e has a number of restrictions. The most significant are:


  1. The distribution file is supplied as a gzipped tar file. Unpacking it will create a directory named "pli-0.9.10e".
  2. Only the compiler (pli-0.9.10e/plic) and the static runtime library (pli-0.9.10e/lib/libprf.a) are required.
  3. Move the compiler to a directory in your $PATH such as /usr/bin, and move libprf.a to a directory such as /usr/lib. Alternatatively, you can specify which directory the library is in in your makefiles.
    An installation procedure is provided. cd to the 'pli-0.9.10e' directory and type 'make install' (with suitable authority). This procedure moves the compiler to '/usr/bin' and creates a symlink 'plic' referencing it, and moves the library to '/usr/lib' and creates the symlink 'libprf.a'.

A later version will be installable using one or more of the standard package managers.

Sample Programs

The file samples/samples.html contains a list of all the sample programs. The comments in each program contain information on using the program.
  1. Test the sample programs. In this release only static linking is supported. CD to the directory "pli-0.9.10e/samples" and type "make -f Makefile.Linux" without the quotes, case is significant.. The sample programs "numwrd", "filedump", "libver", "print_listing", and "task" build to executables, the remainder should generate object files.
  2. Test numwrd. Enter "./numwrd 123". The program should display the result "one hundred twenty-three".
  3. You might want access to the %INCLUDE files in "pli-0.9.10e/lib/include" or "pli-0.9.10e/samples" for your own programming.

Using the compiler

The "samples" directory contains three sample makefiles that can be used to compile and link PL/I programs. You should copy these and modify them for your requirements. "LC_make" and "LCC_make" both use gcc to drive the linker; the program entry will be libc's "_start". "SA_make" calls ld directly and should be used only for programs that don't call any C functions. The program entry will be PL/I's "main". In all cases the static PL/I runtime linkary "libprf.a" is required, indicated by "-lprf" in the linker command.

The Iron Spring PL/I Compiler Programming Guide describes the PL/I compiler options available.

Linking PL/I programs

The following examples show different methods of linking PL/I programs.

This command uses gcc to link a PL/I program with libc, and use C's malloc and free for heap storage management.
gcc -o ${EXE} ${OBJ} ${ALTDIR}/fhs.o ${ALTDIR}/ghs.o -lprf -Wl,-M >${MAP}

This command uses gcc to link a PL/I program with libc, and use PL/I's heap storage management.
gcc -o ${EXE} ${OBJ} -lprf -Wl,-M >${MAP}

This command uses ld to link a standalone PL/I program with no reference to libc.
ld -z muldefs -Bstatic -M -e main -t -o ${EXE} \ ${OBJ} \ -lprf \ >${MAP}

64-bit Linux Considerations

The Iron Spring PL/I compiler, and compiled PL/I programs, will run on a 64-bit system as 32-bit applications. The following steps are required:


Iron Spring PL/I Compiler Programming Guide contains a description of the features of the compiler. Except as noted in the Programming Guide under Compiler Differences and Restrictions this compiler is compatible with the IBM "PL/I for MVS and VM Compiler 1.1". A complete language reference will be available as part of a future release.

Documentation for the IBM compiler is available online.


Changes in the current version
Mapping of slack bytes in structures has changed. If you share a structure, or a pointer to a structure, between separately-compiled procedures, all procedures should be recompiled.
The compiler option "-lg" requests printing of an aggregate map.
Changes in version 0.9.9a
Added external structure _pli_argc containing argc, *argv[] and *envp[] equivalent to arguments to a C main().
Changes in version 0.9.9
Added ROUND builtin.
Added compiler option "-N" to generate line number information for debugging.
Changes in version 0.9.8
Stream I/O data lists can now contain items with Type-3 DO iteration.
Added PRECISION, ATAN, and ATAND builtins.
Fixed problems with OVERFLOW handling and conversion of FLOAT constants.
Changes in version 0.9.7
Aggregate array assignment of adjustable arrays now works. Assignment of arrays with matching attributes now optimized to block move.
Changes in version 0.9.6
Added builtin functions IAND, IEOR, INOT, IOR, ISLL, and ISRL.
Added builtin subroutine PLISRTD.
FIXED DECIMAL OPTIONS(IBM) attributes for IBM mainframe format packed decimal data.
Changes in version 0.9.5
The keyword MEDIUM is accepted as an ENVIRONMENT option for compatibility with VSE PL/I.
Various fixes for STREAM INPUT, pictured data and CONTROLLED storage.
Changes in version 0.9.4
The Procedure Map has been added as an optional part of the listing. This lists the offset and type of each statement to simplify debugging of trap conditions.
CTLASA is now supported for PRINT files.
0.9.4 is primarily a bugfix release. Numerous problems with adjustable and CONTROLLED aggregates have been fixed.
Changes in version 0.9.3
*The sizes of some FLOAT variables have been increased to fix problems with conversions between binary and decimal float. Any programs using FLOAT data should be recompiled.*
*Any programs using OPTIONS(FROMALIEN) entries should be recompiled.*
A limited version of CONTROLLED storage has been added. See the Programming Guide for description.
The ALLOCATION and MAXLENGTH builtins are now implemented.
Multiple iteration specifications are now allowed for the DO statement.
The L-Format item is now supported for input.
The OPEN statement now accepts TITLEs of the form DD_XXX where DD_XXX is an environment variable supplying the actual name of the file.
The ENVIRONMENT option INTERACTIVE can be used to identify a file assigned to a terminal.
Changes in version 0.9.2
PL/I multitasking has been added, including the TASK, EVENT, and PRIORITY options of the CALL statement, the WAIT statement, and the COMPLETION and STATUS builtin functions and pseudovariables.
SIZE is now recognized as a synonym for the STORAGE builtin function.
Structure assignments BY NAME are now allowed.
EXTERNAL data items are now aligned on a DWORD (4-byte) boundary instead of 8-byte.
Changes in version 0.9.1
The SINH, COSH, TANH, and CS builtins have been added.
The PACKAGE statement is now supported.
The INITIAL CALL option is now supported.
Floating-point pictures are now allowed, for output only.
Changes in version 0.9.0
The compiler now supports Linux as a host and a target.
The ERF, ERFC, and EXP builtins have been added.
Page headings have been added to the compiler listings.

Bugs Fixed

Bugs fixed
Changes in version 0.9.10e
4920.9.10eRANDOM not recognized as valid builtin function
4910.9.10eAggregate listing prints sizes of arrays incorrectly
4900.9.10ePROC or ENTRY with no label crashes at compile time
4830.9.10eNOSTRG not accepted as valid condition prefix
4810.9.10eCALL TASK without task variable traps at compile time
4790.9.10eHBOUND/LBOUND/DIM incorrect for some adjustable structures
4780.9.10eInfinite loop inside Type-3 DO loop
461,4620.9.10eRun-time trap assigning elements of arrays of structures
Changes in previous versions
4770.9.10dIncorrect display of DEFINED structures in aggregate listing
4760.9.10dFactored level numbers in declaration parse incorrectly
4750.9.10dVERIFY does not allow expressions as arguments
4740.9.10dConverting FIXED BINARY to BIT in operation expression returns null bit string
4720.9.10dAssigning null string to adjustable traps occasionally
4680.9.10dTRANSLATE a null varying character string traps
4650.9.10dSTORAGE(x) is a restricted expression when x is not adjustable
4640.9.10dPUT LIST/DATA doesn't space if already at tab position
4630.9.10dIncorrect conversion of immediate value to UNSIGNED
4570.9.10dPUT DATA structure names off by one
4560.9.10dTRANSLATE a null varying character string traps
2360.9.10dUnable to use scalar array element in DO-Statement as TO, BY, etc. Conditionals must be scalar expressions.
4550.9.10cError declaring parameters of subscripted entry variable structure element
4530.9.10cSize of adjustable string does not include length prefix
4520.9.10cImproper diagnosis of STRINGSIZE condition
4510.9.10cCompiler trap for UNSIGNED constant greater than 2147483647
4500.9.10cCompiler error for ENVIRONMENT clause with no specifications
4490.9.10cIncorrect code generated for complex WHEN clauses
4480.9.10cSTRING builtin fails with scalar character argument
4470.9.10cERROR condition raised at compile time with some FIXED DECIMAL constants
4460.9.10cSTRING builtin doesn't concatenate elements of structure argument
4450.9.10cCompiler trap initializing STATIC numeric variable with character string
4440.9.10cVERIFY builtin traps when first argument is VARYING
4430.9.10cCALL TASK may cause compiler errors
4420.9.10cINIT attribute ignored allocating BASED variable
4410.9.10cTrap passing dummy argument to adjustable array parameter
4400.9.10cRuntime trap on some RETURN statements
4390.9.10cIncorrect handling of floating point exceptions [OS/2 only]
4370.9.10cPUT DATA(ptr) causes trap in runtime library
4360.9.10cStructure alignment problems
4350.9.10cBOUND/HBOUND/DIM may return incorrect result in expression
4330.9.10cRuntime error for n**2 where n is FIXED BIN(31)
4320.9.10cDiagnose error matching array argument with scalar parameter
4310.9.10cIssue warning message for RETURN in ON-Unit
4260.9.10cCompiler error assigning BIT(16) to FIXED BIN(16)
4290.9.10bSome declarations of variables without attributes parse incorrectly
4280.9.10bError referencing members of a DEFINED structure
4270.9.10bError referencing subscripted EXTERNAL data
4250.9.10bOpening nonexistent file ENV(APPEND) does not create new file
4240.9.10bUNDEFINEDFILE not caught for nonexistent file
4230.9.10bIncorrect results for & and | on adjustable bit strings
4220.9.10bLibrary routine _pli_TBS missing
4210.9.10bTrap accessing BIT(*) parameter
4200.9.10bSyntax error in SELECT statement not diagnosed
4190.9.10bx**2 now done inline (performance improvement)
4180.9.10bDECLARE(...),... generates erroneous error message
4170.9.10bIncorrect code generated for DO UNTIL
4160.9.10bSTATIC pointers dereferenced incorrectly
4150.9.10bIncorrect code generated for DO UNTIL
4100.9.10bONFILE builtin returns null string for UNDEFINDFILE on OPEN of ISAM file
4040.9.10aRETURN statement should be invalid in ON-Unit
4030.9.10aSIZE builtin returns incorrect value for structures
4010.9.10aKEY and INTO keywords incirrectly disgnosed on READ
3980.9.10aIncorrect conversion of CHAR to UNSIGNED
3970.9.10aSTORAGE of some adjustable strings causes compiler trap
3950.9.10aSome CONTROLLED variables initialized incorrectly
3940.9.10aSome expressions in WHEN statements cause errors at runtime
3900.9.10Incorrect output for constant expressions with mixed bases and scales
3890.9.10Printing with E format and too small field width prints nothing if SIZE not enabled
3880.9.10EVENT variables initialized incorrectly
3870.9.10Incorrect error message for RETURN(structure)
3860.9.10Incorrect error message for VALUE declaration at package level
3850.9.10CHAR(float) should return VARYING string
3840.9.10Procedure returning CHARACTER VARYING returns incorrect string descriptor
3810.9.10Declaration code duplicated for parameters of external procedures
3800.9.10Compiler error in CALL with structure argument
3790.9.10Iterative DO containing a DISPLAY statement fails to increment
3780.9.10References to some dased idems before the declaration cause compiler traps
3770.9.10Label on RETURN statement returning a value causes compiler error
3760.9.10GET STRING LIST fails with array argument
3660.9.10GET LIST fails with tab separator
3190.9.10Tempname fails when no directory name passed
3140.9.10Tempname loops when passed non-directory argument
3100.9.10Runtime error accessing arrays of COMPLETION variables

Modifying the Runtime Library

The document
About the Iron Spring PL/I Library Contains information necessary to modify or extend the runtime library. Most users of Iron Spring PL/I will probably not be interesting in making modifications to the library.


No formal support is provided for pre-release versions of Iron Spring PL/I. Bugs will be fixed on a best-efforts basis only, and the fix included in the next distributed version. "Thank You" to a number of users who have submitted bug reports which helped improve this version of the compiler.

The Iron Spring PL/I Users' Forum ( is available as a user forum for problems, tips, etc. The developers also monitor this group.

Reporting bugs

For the current version of the compiler, a bug is one of the following:
  1. Any compiler trap.
  2. Incorrect output not caused by a flagged unimplemented feature (compile-time message 995 or run-time UNIMPLEMENTED condition.
  3. Compile-time message 990 (Compiler error).
  4. Output of the compiled program different from that produced when the program is compiled with the IBM compiler, except for differences noted.
Features not implemented in the current version will be added in future versions. In the meantime, their absence should at least be indicated by an error message.

Before reporting a bug, please make sure you are running the most recent release.

The following information is required to report a bug:

  1. A brief description of the problem (trap, incorrect output, etc.)
  2. The host operating system: OS/2 or Linux.
  3. The command-line options used to compile this program.
  4. The current compiler version obtained by running plic -V
  5. A small sample program ilustrating the problem. Please make sure you imbed or supply all the %include files required to compile the sample.
Hopefully, all this information will be small enough to be sent as plain text in a mail message. Otherwise please attach a zip file. No other formats will be accepted.

Mail bug reports to:

version 0.9.10e, 18 May 2022