Many of the compilers and utility programs, when called by an assembler interface, as is done by Rational Team Concert (RTC), will utilize something call DD name substitution lists. These substitution lists allow you, the programmer, to use different DD names than the normal ones expected by the compilers, for compiler input and output.
The reason for this is to allow other processes that do not have DD name flexibility to precede or follow compiler steps. In this way the compiler can accept a different DD name as SYSIN input or can write output to a different DD name other than SYSPRINT.
The reason we have to use this method of substituting DD names is because dynamic data set allocation APIs such as BPXWDYN, behave differently than processes coded using JCL. JCL will allow you to pass the temporary data set between steps without having any regard for the DD name that it is allocated to. With BPXWDYN or TSO ALLOCATE, when a temporary data set is allocated to a DD name and that DD name is freed, the temporary data set is de-allocated and lost.
User Scenarios
When thinking of multistep language definitions in RTC, the classic example is a COBOL compile, followed by a link-edit. The output from the compile is an object deck, and the input to the binder is the same object deck. However this scenario works just fine. In the compiler step we allocate SYSLIN to a temporary object deck as output using the “Keep” option to keep the DD allocated after the compile finishes. Then in the binder step SYSLIN is allocated as input using the same temporary object deck.
This scenario works because both steps are using the same DD name, SYSLIN as output from the first step, and input into the second step.
COBOL compile translator

Link-Edit translator

The user scenario that requires us to use DD name substitution lists is when an initial step allocates a DD name that is output to a subsequent step, such as SYSUT2, but SYSUT2 in the subsequent step has a totally different use. To show this we will use an IEBGENER step that copies source code from SYSUT1 to SYSUT2, standard IEBGENER behaviour. The SYSUT2 output then needs to be passed as input into SYSIN for the COBOL compiler.
IEBGENER step

COBOL Compiler Step

In the above example the IEBGENER step keeps the SYSUT2 DD name allocated. But when the COBOL compiler step needs to run, it also needs SYSUT2 as a work DD so when it tries to allocate it the compile fails with message that SYSUT2 could not be allocated as it was in use:
* [antz:compile] 2014-02-06 03:23:23,973 CRHTC1539I Processing DOHERTL.V406BLD.COBOL(EPSMLIST)...
* [antz:mvsexec] 2014-02-06 03:23:24,070 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT1) dsn(DOHERTL.V406BLD.COBOL(EPSMLIST)) shr msg(1)
* [antz:mvsexec] 2014-02-06 03:23:24,073 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT2) dsn(&&COMPIN) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 03:23:24,076 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSPRINT) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 03:23:24,077 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSIN) dsn(NULLFILE) shr msg(1)
* [antz:mvsexec] 2014-02-06 03:23:24,079 CRHTC1668I The mvsexec task IEBGENER is about to call compiler IEBGENER with parameter and ddnameslist null.
* [antz:mvsexec] 2014-02-06 03:23:24,087 CRHTC1656I The return code from IEBGENER was (0) (hex. 0).
* [(internal) logpublishertask] Not using a proxy to reach https://9.190.124.89:9443/ccm/
* [(internal) logpublishertask] Published file "/u/dohertl/v406bld/EPSMLIST.log" with extended contribution type id of "com.ibm.team.build.common.model.IBuildResultContribution.log" as content to build result "20140206-1622150739".
* [antz:mvsexec] 2014-02-06 03:23:30,832 CRHTC1659I ZOS.bpxwdyn: free dd(SYSUT1) msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,833 CRHTC1659I ZOS.bpxwdyn: free dd(SYSPRINT) msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,835 CRHTC1659I ZOS.bpxwdyn: free dd(SYSIN) msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,842 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSIN) dsn(&&COMPIN) shr msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,852 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSLIN) dsn(DOHERTL.V406BLD.OBJ(EPSMLIST)) shr msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,854 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSPRINT) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,856 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT1) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,858 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT2) tracks space(5,5) unit(vio) new msg(1)
* IKJ56246I FILE SYSUT2 NOT ALLOCATED, FILE IN USE
* [antz:mvsexec] 2014-02-06 03:23:30,859 CRHTC1682E An exception was thrown when bpxwdyn was invoked with alloc dd(SYSUT2) tracks space(5,5) unit(vio) new msg(1).
* [antz:mvsexec] 2014-02-06 03:23:30,859 CRHTC1660E An RcException occurred.
* [antz:mvsexec] 2014-02-06 03:23:30,859 CRHTC1659I ZOS.bpxwdyn: free dd(SYSUT2) msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,861 CRHTC1659I ZOS.bpxwdyn: free dd(SYSIN) msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,861 CRHTC1659I ZOS.bpxwdyn: free dd(SYSLIN) msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,862 CRHTC1659I ZOS.bpxwdyn: free dd(SYSPRINT) msg(1)
* [antz:mvsexec] 2014-02-06 03:23:30,863 CRHTC1659I ZOS.bpxwdyn: free dd(SYSUT1) msg(1)
* [antz:compile] 2014-02-06 03:23:30,864 CRHTC1501E Failed: COBOL compilation : DOHERTL.V406BLD.COBOL(EPSMLIST)
Successfully using DD name substitution
As long as one of the programs you are calling in a multistep language definition can support DD name substitution, you will be able to manipulate the DD names to pass data between the translators. In the example above we used IEBGENER passing input into the COBOL compiler. Both of these programs support DD name substitution, so we will look at 2 examples of utilizing DD name substitution. The first in the IEBGENER step and the second in the COBOL compile step.
DD name substitution in IEBGENER
In the following screen capture we are replacing the SYSUT2 DD allocation with a SYSIN DD name. However because IEBGENER expects a SYSIN DD to be allocated, we also need to substitute the SYSIN DD allocation with something else. In this case we have chosen SYSDUMMY as SYSIN is actually dummied out.

Note that the DD names list is positional, so we have entered all of the required DDs in the correct order, with their substituted names. So SYSIN, which is at DD position 5 becomes SYSDUMMY and SYSUT2, at DD position 9, becomes SYSIN.
The COBOL translator step can then remain as normal without using DD names list, keeping its default DDs:

When the language definition is run through a build we can see how RTC manages the allocations:
* [antz:compile] 2014-02-06 04:15:02,670 CRHTC1539I Processing DOHERTL.V406BLD.COBOL(EPSMLIST)...
* [antz:mvsexec] 2014-02-06 04:15:02,789 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT1) dsn(DOHERTL.V406BLD.COBOL(EPSMLIST)) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:02,793 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSIN) dsn(&&COMPIN) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:02,798 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSPRINT) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:02,800 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSDUMMY) dsn(NULLFILE) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:02,803 CRHTC1668I The mvsexec task IEBGENER is about to call compiler IEBGENER with parameter and ddnameslist SYSDUMMYSYSPRINT SYSUT1 SYSIN .
* [antz:mvsexec] 2014-02-06 04:15:02,812 CRHTC1656I The return code from IEBGENER was (0) (hex. 0).
* [(internal) logpublishertask] Not using a proxy to reach https://9.190.124.89:9443/ccm/
* [(internal) logpublishertask] Published file "/u/dohertl/v406bld/EPSMLIST.log" with extended contribution type id of "com.ibm.team.build.common.model.IBuildResultContribution.log" as content to build result "20140206-1713530352".
* [antz:mvsexec] 2014-02-06 04:15:11,947 CRHTC1659I ZOS.bpxwdyn: free dd(SYSUT1) msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,948 CRHTC1659I ZOS.bpxwdyn: free dd(SYSPRINT) msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,951 CRHTC1659I ZOS.bpxwdyn: free dd(SYSDUMMY) msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,965 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSLIN) dsn(DOHERTL.V406BLD.OBJ(EPSMLIST)) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,967 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSPRINT) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,970 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT1) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,971 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT2) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,972 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT3) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,973 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT4) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,974 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT5) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,975 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT6) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,976 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT7) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,985 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSLIB) dsn(DOHERTL.V406BLD.COPYBOOK) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,993 CRHTC1659I ZOS.bpxwdyn: alloc dd(TMP00018) dsn(DOHERTL.V406BLD.BMSCPYBK) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,995 CRHTC1659I ZOS.bpxwdyn: alloc dd(TMP00019) dsn(CICSTS.V3R2M0.CICS.SDFHCOB) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,997 CRHTC1659I ZOS.bpxwdyn: concat ddlist(SYSLIB,TMP00018,TMP00019) msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,998 CRHTC1659I ZOS.bpxwdyn: alloc dd(TASKLIB) dsn(COBOL.V4R1M0.SIGYCOMP) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:11,999 CRHTC1659I ZOS.bpxwdyn: alloc dd(TMP00020) dsn(CICSTS.V3R2M0.CICS.SDFHLOAD) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:15:12,002 CRHTC1659I ZOS.bpxwdyn: concat ddlist(TASKLIB,TMP00020) msg(1)
* [antz:mvsexec] 2014-02-06 04:15:12,003 CRHTC1668I The mvsexec task COBOL compilation (for subroutines) is about to call compiler IGYCRCTL with parameter LIB,DYNAM,CICS and ddnameslist null.
* [antz:mvsexec] 2014-02-06 04:15:12,314 CRHTC1656I The return code from COBOL compilation (for subroutines) was (4) (hex. 4).
DD name substitution in the COBOL compiler
In this example we leave the IEBGENER step as default, with no DD names list and normal IEBGENER allocations:

We then manage the incoming DDs through DD name substitution in the COBOL compiler.

Note again the positional DD names list, replacing only the required DDs with our substitute names. As the output from IEBGENER is SYSUT2 we need to have that as our replacement DD for SYSIN. However as the COBOL compiler requires a SYSUT2 already we need to substitute that for a different name. We could have use Tom, Dick or Harry as the name, but chose to use SYSUT02 by just adding an extra “0”. We are then able to use SYSUT2 from the IEBGENER step as a replacement DD for SYSIN.
Again looking at the output from the build we can see how RTC handles the allocations and free statements of these DD names:
* [antz:compile] 2014-02-06 04:02:46,701 CRHTC1539I Processing DOHERTL.V406BLD.COBOL(EPSMLIST)...
* [antz:mvsexec] 2014-02-06 04:02:46,829 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT1) dsn(DOHERTL.V406BLD.COBOL(EPSMLIST)) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:46,832 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT2) dsn(&&COMPIN) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:46,835 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSPRINT) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:46,837 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSIN) dsn(NULLFILE) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:46,838 CRHTC1668I The mvsexec task IEBGENER is about to call compiler IEBGENER with parameter and ddnameslist null.
* [antz:mvsexec] 2014-02-06 04:02:46,845 CRHTC1656I The return code from IEBGENER was (0) (hex. 0).
* [(internal) logpublishertask] Not using a proxy to reach https://9.190.124.89:9443/ccm/
* [(internal) logpublishertask] Published file "/u/dohertl/v406bld/EPSMLIST.log" with extended contribution type id of "com.ibm.team.build.common.model.IBuildResultContribution.log" as content to build result "20140206-1701380206".
* [antz:mvsexec] 2014-02-06 04:02:53,455 CRHTC1659I ZOS.bpxwdyn: free dd(SYSUT1) msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,457 CRHTC1659I ZOS.bpxwdyn: free dd(SYSPRINT) msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,459 CRHTC1659I ZOS.bpxwdyn: free dd(SYSIN) msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,474 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSLIN) dsn(DOHERTL.V406BLD.OBJ(EPSMLIST)) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,476 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSPRINT) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,478 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT1) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,479 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT02) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,480 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT3) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,481 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT4) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,482 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT5) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,484 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT6) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,485 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSUT7) tracks space(5,5) unit(vio) new msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,492 CRHTC1659I ZOS.bpxwdyn: alloc dd(SYSLIB) dsn(DOHERTL.V406BLD.COPYBOOK) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,499 CRHTC1659I ZOS.bpxwdyn: alloc dd(TMP00018) dsn(DOHERTL.V406BLD.BMSCPYBK) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,501 CRHTC1659I ZOS.bpxwdyn: alloc dd(TMP00019) dsn(CICSTS.V3R2M0.CICS.SDFHCOB) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,503 CRHTC1659I ZOS.bpxwdyn: concat ddlist(SYSLIB,TMP00018,TMP00019) msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,504 CRHTC1659I ZOS.bpxwdyn: alloc dd(TASKLIB) dsn(COBOL.V4R1M0.SIGYCOMP) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,505 CRHTC1659I ZOS.bpxwdyn: alloc dd(TMP00020) dsn(CICSTS.V3R2M0.CICS.SDFHLOAD) shr msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,507 CRHTC1659I ZOS.bpxwdyn: concat ddlist(TASKLIB,TMP00020) msg(1)
* [antz:mvsexec] 2014-02-06 04:02:53,508 CRHTC1668I The mvsexec task COBOL compilation (for subroutines) is about to call compiler IGYCRCTL with parameter LIB,DYNAM,CICS and ddnameslist SYSLIN SYSLIB SYSUT2 SYSPRINTSYSPUNCHSYSUT1 SYSUT02 .
* [antz:mvsexec] 2014-02-06 04:02:53,749 CRHTC1656I The return code from COBOL compilation (for subroutines) was (4) (hex. 4).
Additional information
The DD names substitutions lists for the compilers (COBOL, PLI), the Assembler and the Utilities can all be found listed in the relevant manuals for the specific compilers or utilities, normally in the programmers guide. However for a quick reference of the position of the various DD names in each of the compiles and utilities looks in Appendix E of the SCLM Redbook : Getting Started with SCLM: A Practical Guide to SCLM and SCLM Advanced Edition