Iron Spring PL/I Compiler

Linux Version 1.4.1
15 Apr 2026

Release Notes

Introduction

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

The current version still contains bugs. You can help improve the compiler. See the section Reporting bugs.

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

License

<boring-legal-stuff>
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, 2023.

THE COMPILER AND LIBRARY ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COMPILER AND LIBRARY IS WITH YOU. SHOULD THEY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
</boring-legal-stuff>

Contents

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.

  pli-1.4.1
    |
    +-----------------------samples----------------lib
    |                          |                    |
 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)

Requirements

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

Restrictions

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

Installation

  1. The distribution file is supplied as a gzipped tar file. Unpacking it will create a directory named "pli-1.4.1".
  2. Only the compiler (pli-1.4.1/plic) and the static runtime library (pli-1.4.1/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-1.4.1' 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 instructions and 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-1.4.1/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-1.4.1/lib/include" or "pli-1.4.1/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:

Documentation

The
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 at teampli.net.

Bugs Fixed

  • Prior to library version 1.4.1 an incorrect parameter was supplied to the main procedure when the command-line contained a quoted string containing blanks. For example, suppose the command-line contained an argument -x "some string". The shell removed the quotes and created two arguments:
      -x
      some string
    .
    To create the main procedure parameter, PL/I initialization reconstructed this as -x some string , losing the quotes and returning three items. The revised code recognizes that the space in "some string" resulted from a quoted string and builds the parm as -x "some string" In most cases, this should not cause a problem.

    Cumulative list of bugs fixed
    Changes in version 1.4.1
    6651.4.1Incorrect output with GET/PUT iSub defined arrays
    6591.4.1Compiler truncates path name arguments to 64 characters
    6501.4.1HBOUND, LBOUND use wrong dimension for arrays of structures
    6421.4.1Run-time not handling arrays other than one-dimension correctly
    6401.4.1Compiler trap evaluating constant expressions involving hexadecimal bit constants at compile time
    6391.4.1Conversion of UNSIGNED constant to DECIMAL returns 0
    6381.4.1UNSIGNED constants cause compiler trap
    6361.4.1Add SEQL as synonym for SEQUENTIAL
    6341.4.1Run-time STRINGRANGE Computation incorrect, allows 1 byte overrun
    6331.4.1Absolute paths invalid as file arguments to compiler
    6311.4.1(Linux)Parameter to main procedure formatted incorrectly
    6301.4.1CONVERSION raised printing bit string with F format
    628,6571.4.1Error passing char(*) argument to procedure
    6271.4.1Assigning null string to pseudovariable overwrites storage
    620,6441.4.1Compiler opening nonexistant file raises ENDFILE instead of issuing error message
    6161.4.1Array of FILE should default to VARIABLE
    5221.4.1Compiler trap when refer-expression needs to be converted to FIXED BINARY
     
    Changes in prior versions
    6221.4.0a%REPLACE changes break old code
    6151.4.0Compiler errors may generate error messages containing NULL characters
    6101.4.0Use of non-existent builtin causes compiler trap
    6091.4.0Aggregate assignment of FIXED BINARY arrays with elements shorter than four bytes incorrect
    6061.4.0Aggregate assignment of unaligned BIT arrays incorrect
    5931.4.0Operands of some short bit string comparisons aligned incorrectly
    5821.4.0Compiler trap allocating CONTROLLED variable with INITIAL option
    5781.4.0Compiler trap referencing element declared with REFER
    6071.3.2References to subscripted CONTROLLED elements causes compiler error
    6031.3.2Comparison of two files fails with compiler error. Now temporarily gets error 612: "Invalid comparison of program control data"
    6021.3.2Compiler error calling FLOAT builtin with literal constant argument
    6001.3.2F format does not print '-' for negative one-digit numbers
    5991.3.2MOD builtin traps if used in INITIAL attribute
    5981.3.2Incorrect value set for ALLOCATE REFER-object
    5971.3.2Compiler error with HBOUND. LBOUND of adjustable array
    5941.3.2SIZE builtin of a structure ending with an unaligned bit string is one byte too short
    5921.3.2PUT EDIT field widths may be incorrect for b2 and b3 format items
    5891.3.1GOTO <subscipted-label-constant> traps at runtime
    5881.3.1INITIAL attribute generates incorrect data for STATIC BIT fields before non-BIT
    5871.3.1Incorrect conversion of CHARACTER to FLOAT
    5841.3.1Incorrect output PUT EDIT with "F" format
    5831.3.1Incorrect output for PUT <minor-structure>
    5791.3.1Compiler trap on aggregate assignment of array arguments
    5771.3.1Alignment attribute not copied for LIKE structure
    5721.3.1Compiler trap referencing computational elements of structure parameters
    5711.3.1Error returning bit(1) result from some conditionals
    5701.3.1SUM builtin of array with zero lower bound causes runtime trap
    5681.3.1Reference to element of DEFINED structure incorrect
    566
    565
    1.3.1BIT builtin returns incorrect result
    5511.3.1Structure qualification not allowed for refer object
    5491.3.1BASED AREA variable not properly initialized when allocated
    4481.3.1STRING builtin and pseudovariable incorrect output if argument is a character string
    4101.3.1ONFILE builtin returns null string in UNDEFINEDFILE On-Unit
    3441.3.1GET STRING(xx) LIST(string) raises ERROR condition
    2311.3.1ENTRY variable not allowed as argument to ENTRYADDR builtin
    5631.3.0Incorrect access to elements of array of structures
    5611.3.0Assignment to array of structures may be incorrect
    5601.3.0Result of INDEX or SEARCH builtin incorrect if used in expression
    5561.3.0LBOUND/HBOUND incorrect for adjustable array. (repeat of 320)
    5551.3.0Refer object set incorrectly for array bounds
    5541.3.0Incorrect length returned for CONTROLLED string elements
    5531.3.0STORAGE/CURRENTSTORAGE values inconsistent for adjustable based structure
    5521.3.0Refer expression not converted to FIXED BIN(31)
    5511.3.0Allow structure qualification for refer object name
    5501.3.0Element name and descriptor not passed to I/O subsystem
    5491.3.0Subscripted reference to undeclared variable causes trap
    5481.3.0Error with hardware shift instruction with constant shift amount
    5471.3.0Declaration of external array causes compiler trap
    5401.3.0No warning generated for undeclared programmer-named condition
    5301.3.0TRIM(bit string) generates garbage
    4541.3.0Error referencing BASED ENTRY variable
    5461.2.0Builtin SIZE not recognized as synonym for STORAGE
    5391.2.0Incorrect conversion of bit string constant to FIXED DECIMAL
    5361.2.0Incorrect output with PUT(bit_string) with A-Format
    5341.2.0Errors with UNSIGNED size<4
    5331.2.0Errors converting relational expression to bit string
    5321.1.0(OS/2)GOTO out of ON-Unit causes erroneous "recursive abend"
    5281.1.0Block initialization calling some library procedures traps at runtime
    5181.1.0Initialization of UNALIGNED BIT elements of STATIC structures and arrays incorrect
    5131.1.0Various errors with VARYING UNALIGNED BIT arrays
    5121.1.0Trap referencing structure with REFER option declared in another block
    5111.1.0Floating point numbers print incorrectly if smaller than 1e-16
    5101.1.0ADDR(x) may return incorrect result if x was previously referenced in the same statement
    5091.1.0Access to adjustable descriptor in containing block returns incorrect result
    461
    462
    1.1.0SIGSEGV on aggregate assignment to array of structures
    5081.0.0Incorrect conversion of FLOAT BINARY to FIXED DECIMAL
    5061.0.0Compiler trap in some cases where statement not properly terminated
    5041.0.0Incorrect conversion of COMPLEX data
    5031.0.0Statement label should not be allowed on declaration
    5021.0.0Error using array element as control variable in DO-Statement
    5011.0.0Code comment not printing subscript for subscripted label constant
    5001.0.0GET/PUT array elements off by one
    4991.0.0CHAR to BIT conversion not handling leading and trailing blanks
    4981.0.0ONCHAR returns incorrect value
    4971.0.0Incorrect output for GET/PUT of minor structure
    4961.0.0Problems moving FIXED BIN returned value
    4951.0.0SIGNED/UNSIGNED builtins may return incorrect precision
    4941.0.0Incorrect precision converting FIXED DECIMAL to FIXED BINARY
    4931.0.0Fixed documentation of OSGetProcInfo

    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.

    Support

    Iron Spring PL/I is supported on a "best efforts" basis. Attempts will be made to fix all reported bugs, and have the fixes 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 (https://groups.io/g/Iron-Spring) 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:

       bugs@iron-spring.com
    


    version 1.4.1, 15 Apr 2026
    http://www.iron-spring.com