MAP コンパイル・オプションを使用すると、コンパイラーはコンパイラー・ リストにストレージ・オフセット・リストを組み込みます。 ストレージ・オフセット・リストは、以下のレベル 1 変数がプログラムで使用された場合に、 これらのストレージ内のロケーションを示します。
このリストには、コンパイラーが生成した一時データの一部も組み込まれます。
調節可能エクステントを持つ AUTOMATIC 変数が使用された場合は、 このテーブルに、以下の 2 つの項目があります。
STATIC 変数および CONTROLLED 変数を使用した場合、ストレージ・ロケーションは RENT/NORENT コンパイラー・オプションに依存し、NORENT オプション指定した場合は、CONTROLLED 変数のロケーションも WRITABLE/NOWRITABLE コンパイラー・オプションに依存します。
ストレージ・オフセット・リストの最初の列は、IDENTIFIER というラベルが付けられ、第 4 列にロケーションが表示される変数の名前を 含んでいます。
ストレージ・オフセット・リストの 2 番目の列は、DEFINITION という ラベルが付けられ、"B-F:N" という形式のストリングを含んでいます。
このブロック番号に応じてブロック名をブロック名リストで検索できます。 このブロック名リストはストレージ・オフセット・リスト (および、存在する場合は、 疑似アセンブリー・リスト) の前にあります。
このファイル番号に対応するファイル名を、 ファイル参照テーブル (コンパイル・リスト全体の終わりのあたりにある) で検索できます。
ストレージ・オフセット・リストの 3 番目の列は、ATTRIBUTES というラベルが付けられ、変数のストレージ・クラスを 示します。
ストレージ・オフセット・リストの 4 番目の列は、 ラベルがなく、変数のロケーションを検索する方法を示します。
このストレージ・オフセット・リストはブロック別および変数名別にソートされ、ユーザー変数のみも含まれます。 また、MAP オプションを指定すると、コンパイラーは以下のマップも生成します。
PL/L 言語のマッピング規則で、構造体を、構造体が開始していると思われる場所から最大で 8 バイト分オフセットする必要がある場合があります。 例えば、次のように宣言された AUTOMATIC 構造体 A を考えてみます。
dcl
1 A,
2 B char(2),
2 C fixed bin(31);
C は、4 バイト境界に位置合わせする必要があり、この構造体には 2 バイトの埋め込みが必要です。 ただし、PL/I はその 2 バイトを、B の後ではなく B の前に配置します。 構造体の先頭の前にあるこの 2 バイトの「埋め込み」は、構造体の「ハング・バイト」と呼ばれます。
これらのハング・バイトは、コンパイラーによって生成された「自動マップ」にも反映されます。 「ストレージ・オフセット・リスト」は、以下のように、ハング・バイトを含めずに、A のオフセットと長さを表示します。
A Class = automatic, Location = 186 : 0xBA(r13), Length = 6
一方、「自動マップ」は、以下のように、ハング・バイトも含めて、A のオフセットと長さを表示します。
OFFSET (HEX) LENGTH (HEX) NAME
98 8 #MX_TEMP1
A0 18 _Sfi
B8 8 A
最後に、構造体におけるフィールドの最も厳しい位置合わせは 8 バイトの位置合わせであり、フィールドの最小サイズは 1 ビットであるため、 考えられる最大のハングは、以下の構造体の場合のように、7 バイトと 7 ビットになります。
dcl
1 X,
2 Y bit(1),
2 Z float bin(53);